OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12873|回复: 9

STM32通过ULN2003驱动步进电机,用按键实现正转、反转和停止。

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-12-10 16:01:25 | 显示全部楼层 |阅读模式
1金钱

如题,我想要用战舰开发板上的key0,key1,key2来实现对步进电机的正转、反转和停止。代码是在原子的按键实验上的基础上改的。

现在程序里面有个bug,就是开机之后只能选择一次运行方式,正转/反转/停止,如果想要更换运行方式只能重新复位,因为我是用的死循环,希望可以改进这个问题,求解~

硬件连接如下

微信截图_20201210144026.png
单片机:STM32F103ZET6
步进电机:28BYJ-48
驱动电路:ULN2003芯片的驱动板
引脚连接如下:
IN1:PC3
IN2:PC2
IN3:PC0
IN4:PC13

OUT1:步进电机4
OUT2:步进电机3
OUT3:步进电机2
OUT4:步进电机1

代码如下:

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "stm32f10x.h"

  6. u16 phasecw1[4] ={0x0008,0x0040,0x0001,0x2000};// 逆时针
  7. u16 phaseccw2[4]={0x2000,0x0001,0x0040,0x0008};// 顺时针
  8. //单四拍
  9. #define DC_A_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_3)
  10. #define DC_B_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_2)
  11. #define DC_C_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_0)
  12. #define DC_D_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_13)

  13. #define DC_A_ON  GPIO_SetBits(GPIOC,GPIO_Pin_3)
  14. #define DC_B_ON  GPIO_SetBits(GPIOC,GPIO_Pin_2)
  15. #define DC_C_ON  GPIO_SetBits(GPIOC,GPIO_Pin_0)
  16. #define DC_D_ON  GPIO_SetBits(GPIOC,GPIO_Pin_13)

  17. void Motor_Init(void)
  18. {
  19.         GPIO_InitTypeDef GPIO_InitStructure;       
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
  21.        
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_Init(GPIOC, &GPIO_InitStructure);

  26. //默认ULN2003四路输入低电平,输出高电平       
  27.         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  28.         GPIO_ResetBits(GPIOC,GPIO_Pin_0);
  29.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  30.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);       
  31. }


  32. ////步进电机正转函数
  33. void Motorcw1(void)
  34. {
  35.         {  
  36.                         uint8_t i;          
  37.                                 for(i=0;i<4;i++)  
  38.                                 {  
  39.                                                 GPIO_Write(GPIOC,phasecw1[i]);  
  40.                                                 delay_ms(6);
  41.                                 }                
  42.         }               
  43. }
  44. ////步进电机反转函数
  45. void Motorcw2(void)
  46. {       
  47.         DC_A_OFF;
  48.         DC_B_OFF;
  49.         DC_C_OFF;
  50.         DC_D_ON;
  51.         delay_ms(6);

  52.         DC_A_OFF;
  53.         DC_B_OFF;
  54.         DC_C_ON;
  55.         DC_D_OFF;
  56.         delay_ms(6);       

  57.         DC_A_OFF;
  58.         DC_B_ON;
  59.         DC_C_OFF;
  60.         DC_D_OFF;
  61.         delay_ms(6);

  62.         DC_A_ON;
  63.         DC_B_OFF;
  64.         DC_C_OFF;
  65.         DC_D_OFF;
  66.         delay_ms(6);
  67. }
  68. //电机停止函数
  69. void MotorStop(void)  
  70. {  
  71.     GPIO_Write(GPIOC,0x0000);  
  72. }

  73. //主函数
  74. int main(void)
  75. {
  76.         vu8 key=0;       
  77.         delay_init();                     //延时函数初始化          
  78.         KEY_Init();          //初始化与按键连接的硬件接口
  79.         Motor_Init();
  80.         while(1)
  81.         {
  82.                         key=KEY_Scan(0);        //得到键值
  83.                                 if(key)
  84.                         {                                                  
  85.                                 switch(key)
  86.                                 {                                 
  87.                                         case KEY2_PRES:        //控制电机正转
  88.                                                 while(1)
  89.                                                 {
  90.                                                 Motorcw1();
  91.                                                 }
  92.                                                 break;
  93.                                                
  94.                                         case KEY1_PRES:        //控制电机反转
  95.                                                 while(1)
  96.                                                 {
  97.                                                 Motorcw2();
  98.                                                 }
  99.                                                
  100.                                                 break;
  101.                                                
  102.                                         case KEY0_PRES:        //控制电机停止
  103.                                                 while(1)
  104.                                                 {
  105.                                                 MotorStop();
  106.                                                 }
  107.                                                 break;
  108.                                 }
  109.                         }
  110.                 else delay_ms(10);
  111.         }         
  112. }

复制代码





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
278
金钱
278
注册时间
2016-11-5
在线时间
62 小时
发表于 2021-2-20 15:00:38 | 显示全部楼层
你的 程序将死在 while(1)里面, 可以设置条件 让其跳出  例如正转一段时间 停止后跳出循环!
回复

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2019-8-24
在线时间
40 小时
发表于 2021-5-8 10:41:36 | 显示全部楼层
在while循环开始后调用停止转动
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2021-5-8 11:34:31 | 显示全部楼层
定时器设置成电机驱动频率,每次中断就驱动一次电机,用switch循环,加入相序作为驱动条件
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-5-12 12:03:19 | 显示全部楼层
这个你可以加上退出的操作然后重新去选择模式的
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2021-7-23
在线时间
17 小时
发表于 2021-8-10 09:21:13 | 显示全部楼层
哥,之前你那个按键控制电机正反转/停止的问题解决没有,我也遇到相同的问题,我用矩阵键盘+步进电机模拟电梯运行,死在了死循环里,虽然矩阵键盘按下某个键值后,步进电机可以往对应的方向旋转,但旋转后一直朝着正方向旋转,停不下来
回复

使用道具 举报

4

主题

456

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1072
金钱
1072
注册时间
2021-4-26
在线时间
352 小时
发表于 2021-8-10 10:15:41 | 显示全部楼层
你每一个case里都有while,出不来的
回复

使用道具 举报

4

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
497
金钱
497
注册时间
2022-4-4
在线时间
66 小时
发表于 2022-10-12 10:19:55 | 显示全部楼层
不明白最上面那个电机正反转的数组为什么要这样设置
回复

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2023-3-23
在线时间
12 小时
发表于 2023-11-12 20:47:30 | 显示全部楼层
山3567
回复

使用道具 举报

0

主题

18

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2023-3-23
在线时间
12 小时
发表于 2023-11-19 21:20:19 | 显示全部楼层
123456
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表