如题,我想要用战舰开发板上的key0,key1,key2来实现对步进电机的正转、反转和停止。代码是在原子的按键实验上的基础上改的。 现在程序里面有个bug,就是开机之后只能选择一次运行方式,正转/反转/停止,如果想要更换运行方式只能重新复位,因为我是用的死循环,希望可以改进这个问题,求解~ 硬件连接如下
单片机:STM32F103ZET6
步进电机:28BYJ-48
驱动电路:ULN2003芯片的驱动板
引脚连接如下:
IN1:PC3
IN2:PC2
IN3:PC0
IN4:PC13 OUT1:步进电机4
OUT2:步进电机3
OUT3:步进电机2
OUT4:步进电机1 代码如下: - #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "stm32f10x.h"
- u16 phasecw1[4] ={0x0008,0x0040,0x0001,0x2000};// 逆时针
- u16 phaseccw2[4]={0x2000,0x0001,0x0040,0x0008};// 顺时针
- //单四拍
- #define DC_A_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_3)
- #define DC_B_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_2)
- #define DC_C_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_0)
- #define DC_D_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_13)
- #define DC_A_ON GPIO_SetBits(GPIOC,GPIO_Pin_3)
- #define DC_B_ON GPIO_SetBits(GPIOC,GPIO_Pin_2)
- #define DC_C_ON GPIO_SetBits(GPIOC,GPIO_Pin_0)
- #define DC_D_ON GPIO_SetBits(GPIOC,GPIO_Pin_13)
- void Motor_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- //默认ULN2003四路输入低电平,输出高电平
- GPIO_ResetBits(GPIOC,GPIO_Pin_13);
- GPIO_ResetBits(GPIOC,GPIO_Pin_0);
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- GPIO_ResetBits(GPIOC,GPIO_Pin_3);
- }
- ////步进电机正转函数
- void Motorcw1(void)
- {
- {
- uint8_t i;
- for(i=0;i<4;i++)
- {
- GPIO_Write(GPIOC,phasecw1[i]);
- delay_ms(6);
- }
- }
- }
- ////步进电机反转函数
- void Motorcw2(void)
- {
- DC_A_OFF;
- DC_B_OFF;
- DC_C_OFF;
- DC_D_ON;
- delay_ms(6);
- DC_A_OFF;
- DC_B_OFF;
- DC_C_ON;
- DC_D_OFF;
- delay_ms(6);
- DC_A_OFF;
- DC_B_ON;
- DC_C_OFF;
- DC_D_OFF;
- delay_ms(6);
- DC_A_ON;
- DC_B_OFF;
- DC_C_OFF;
- DC_D_OFF;
- delay_ms(6);
- }
- //电机停止函数
- void MotorStop(void)
- {
- GPIO_Write(GPIOC,0x0000);
- }
- //主函数
- int main(void)
- {
- vu8 key=0;
- delay_init(); //延时函数初始化
- KEY_Init(); //初始化与按键连接的硬件接口
- Motor_Init();
- while(1)
- {
- key=KEY_Scan(0); //得到键值
- if(key)
- {
- switch(key)
- {
- case KEY2_PRES: //控制电机正转
- while(1)
- {
- Motorcw1();
- }
- break;
-
- case KEY1_PRES: //控制电机反转
- while(1)
- {
- Motorcw2();
- }
-
- break;
-
- case KEY0_PRES: //控制电机停止
- while(1)
- {
- MotorStop();
- }
- break;
- }
- }
- else delay_ms(10);
- }
- }
复制代码
|