STM32驱动简单型步进电机的源码,仅供参考!
#include "motor.h" //导入led头文件
#include "stm32f10x.h" //导入STM32官方库
#include "stm32f10x_rcc.h" //导入STM32的RCC时钟库
#include "delay.h" //延时库
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE , ENABLE);
}
{
GPIO_InitTypeDef GPIO_InitStructure; //端口配置结构体
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PD3管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PD6管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PD12管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PE4管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线翻转速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化端口
}
//电机正转函数
void ZhengZhuan(u16 tt)
{
//1000
GPIO_SetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//1100
GPIO_SetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0100
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0110
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0010
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0011
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0001
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//1001
GPIO_SetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
}
//电机反转函数
void FanZhuan(u16 tt)
{
//1001
GPIO_SetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0001
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0011
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
GPIO_SetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0010
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0110
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
GPIO_SetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//0100
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//1100
GPIO_SetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
//1000
GPIO_SetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
delay_ms1(tt);
}
void delay_ms1(u16 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
main.c
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
//#include "delay.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void ZhengZhuan(u16 tt);
void FanZhuan(u16 tt);
void delay_ms1(u16 nms);
int main(void)
{
RCC_Configuration(); //系统时钟设置及外设时钟使能
GPIO_Configuration();
//delay_init(); //延时函数初始化
while (1)
{
// ZhengZhuan(3);//逆时针
FanZhuan(10);//顺时针
}
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_ResetBits(GPIOD, GPIO_Pin_6);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
//}
}