大家想学步进电机用stm32控制步进电机可以借鉴下啊
单片机源程序如下:
- #include "stm32f10x.h"
- #include "stm32f10x_rcc.h"
- #include "misc.h"
- void RCC_Configuration(void);
- void GPIO_Configuration(void);
- void ZhengZhuan(u16 tt);
- void FanZhuan(u16 tt);
- void delay_ms(u16 nms);
- /****************************************************************************
- * 名 称:int main(void)
- * 功 能:主函数
- * 入口参数:无
- * 出口参数:无
- * 说 明:
- * 调用方法:无
- ****************************************************************************/
- int main(void)
- {
- RCC_Configuration(); //系统时钟设置及外设时钟使能
- GPIO_Configuration();
- while (1)
- {
- //读取PC5管脚的输入状态 K1
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET)
- {
- ZhengZhuan(5);//高速
- }
- //读取PC5管脚的输入状态 K2
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) == Bit_RESET)
- {
- FanZhuan(5);//高速
- }
- //读取PC2管脚的输入状态 K3
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == Bit_RESET)
- {
- ZhengZhuan(10);//低速
- }
- //读取PC3管脚的输入状态 K4
- if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) == Bit_RESET)
- {
- 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);
- }
- }
- /****************************************************************************
- * 名 称:void RCC_Configuration(void)
- * 功 能:系统时钟配置为72MHZ, 外设时钟配置
- * 入口参数:无
- * 出口参数:无
- * 说 明:
- * 调用方法:无
- ****************************************************************************/
- void RCC_Configuration(void)
- {
- SystemInit();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE , ENABLE);
- }
- /****************************************************************************
- * 名 称:void GPIO_Configuration(void)
- * 功 能:LED控制口线及键盘设置
- * 入口参数:无
- * 出口参数:无
- * 说 明:
- * 调用方法:无
- ****************************************************************************/
- void GPIO_Configuration(void)
- {
- 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); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PC5管脚
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PC1管脚
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PC2管脚
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PC3管脚
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入上拉
- GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化端口
- }
- //电机正转函数
- void ZhengZhuan(u16 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_ms(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_ms(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_ms(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_ms(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_ms(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_ms(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_ms(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_ms(tt);
- }
- void delay_ms(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; //清空计数器
- }
复制代码
所有资料51hei提供下载:
程序.rar
(270.59 KB, 下载次数: 106)
|