返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[AT32M412] 【AT-START-M412测评】+步进电机驱动测试

[复制链接]
 楼主| jinglixixi 发表于 2025-6-3 12:30 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-6-3 18:05 编辑

#申请原创#  

【AT-START-M412测评】+步进电机驱动测试
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等。一个简单的步进电机驱动电路主要由步进电机、驱动电路及微控制器所构成。
为驱动步进电机,可使用图1所示连接方式。
62a22cbe820ac8db7bab12f639f32843
图1  连接方式

为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。
要编写步进电机驱动程序主要分为以下几步:
1)分配引脚
步进电机与开发板的连接关系为:
MA---PB6
MB---PB4
MC---PB3
MD---PB5

6a0ba4950787374d91bbfb9b7fd016e7
图2 所用接口

2)高低电平的输出
为便于输出高低电平,所作的定义语句为:
#define MAL  GPIOB->clr = GPIO_PINS_6
#define MAH  GPIOB->scr = GPIO_PINS_6

#define MBL  GPIOB->clr = GPIO_PINS_4
#define MBH  GPIOB->scr = GPIO_PINS_4

#define MCL  GPIOB->clr = GPIO_PINS_3
#define MCH  GPIOB->scr = GPIO_PINS_3

#define MDL  GPIOB->clr = GPIO_PINS_5
#define MDH  GPIOB->scr = GPIO_PINS_5

3)配置引脚工作模式
要驱动步进电机工作,必须使各引脚按时序要求来输出高低电平,其引脚工作模式的配置函数为:
  1. void BJDJ_config()
  2. {
  3. gpio_init_type gpio_init_struct;
  4. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  5. gpio_default_para_init(&gpio_init_struct);
  6. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  7. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  8. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  9. gpio_init_struct.gpio_pins = GPIO_PINS_3|GPIO_PINS_4|GPIO_PINS_5|GPIO_PINS_6;
  10. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11. gpio_init(GPIOB, &gpio_init_struct);
  12. }


4)配置延时函数
配置延时函数的作用在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
对于步进电机来说其速度是与驱动脉冲相有关的,但也并非脉冲越快,电机的转速就越快。因为电机属机械器件,要建立相应的磁场以达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,而无法旋转。

5)控制电机旋转方向
对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。

正转的驱动函数为:
  1. void zx(int n)
  2. {
  3. unsigned char X,Y;
  4. for(X=0;X<64;X++)
  5. {
  6. for(Y=0;Y<8;Y++)
  7. {
  8. MDL;
  9. MAH; //A
  10. delay_ms(n);
  11. MBH; //AB
  12. delay_ms(n);
  13. MAL; //B
  14. delay_ms(n);
  15. MCH; //BC
  16. delay_ms(n);
  17. MBL; //C
  18. delay_ms(n);
  19. MDH; //CD
  20. delay_ms(n);
  21. MCL; //D
  22. delay_ms(n);
  23. MAH; //DA
  24. delay_ms(n);
  25. }
  26. }
  27. }


反转的驱动函数为:
  1. void fx(int n)
  2. {
  3. unsigned char X,Y;
  4. for(X=0;X<64;X++)
  5. {
  6. for(Y=0;Y<8;Y++)
  7. {
  8. MDH;
  9. MAH; //A
  10. delay_ms(n);
  11. MAL; //AB
  12. delay_ms(n);
  13. MCH; //B
  14. delay_ms(n);
  15. MDL; //BC
  16. delay_ms(n);
  17. MBH; //C
  18. delay_ms(n);
  19. MCL; //CD
  20. delay_ms(n);
  21. MAH; //D
  22. delay_ms(n);
  23. MBL; //DA
  24. delay_ms(n);
  25. }
  26. }
  27. }

对于变量X来讲,其作用是控制电机转动的步进角度,利用它可实现小角度的精准控制。

6)控制电机运行

控制电机运行的函数为:
  1. void clkz(uint8_t d,uint8_t m)
  2. {
  3. uint8_t i;
  4. delay_ms(20);
  5. MAL;
  6. MBL;
  7. MCL;
  8. MDL;
  9. delay_ms(20);
  10. for(i=0;i<m;i++)
  11. {
  12. if(d==0) fx(1);
  13. else zx(1);
  14. }
  15. }

其中,函数 clkz()的控制参数d用于控制电机的转动方向,参数m用于控制电机的转动圈数。
测试电机运行的主程序为:
  1. int main(void)
  2. {
  3. system_clock_config();
  4. at32_board_init();
  5. BJDJ_config();
  6. clkz(0);
  7. delay_ms(500);
  8. clkz(1);
  9. delay_ms(500);
  10. while(1)
  11. {
  12. at32_led_toggle(LED2);
  13. delay_ms(200);
  14. at32_led_toggle(LED3);
  15. delay_ms(200);
  16. at32_led_toggle(LED4);
  17. delay_ms(200);
  18. }
  19. }


经程序的编译与运行,则可见到步进电机开始转动见图3所示,说明程序测试成功。
183fe517ba0e42eff3f35c1a8986e991
图3 运行状态

后续,会利用步进电机的精准控制与超声波测距模块相配合来实现一个进行大角度摆动范围的距离检测装置。


演示视频:

打赏榜单

ArteryMCU 打赏了 50.00 元 2025-07-04
理由:[M412开发板评测活动]内容优质

chenjun89 发表于 2025-6-4 07:57 来自手机 | 显示全部楼层
楼主这步进电机估计是压箱底的库存吧,历史有点悠久啊,哈哈。
 楼主| jinglixixi 发表于 2025-6-4 09:59 | 显示全部楼层
chenjun89 发表于 2025-6-4 07:57
楼主这步进电机估计是压箱底的库存吧,历史有点悠久啊,哈哈。

哈哈,将就用呗!
ZenithSeeker 发表于 2025-6-13 15:55 | 显示全部楼层
你的步进电机好迷你啊,是不是原子配套的那一套配件里面的?
 楼主| jinglixixi 发表于 2025-7-4 11:48 | 显示全部楼层
ZenithSeeker 发表于 2025-6-13 15:55
你的步进电机好迷你啊,是不是原子配套的那一套配件里面的?

哦,以前做实验自己网上买的。
DuskHarvest 发表于 2025-7-6 17:14 | 显示全部楼层
这个简单演示吧,有没有s曲线加减速的代码参考一下
 楼主| jinglixixi 发表于 2025-7-6 21:09 | 显示全部楼层
DuskHarvest 发表于 2025-7-6 17:14
这个简单演示吧,有没有s曲线加减速的代码参考一下

对于步进电机来说,要实现加减速只需调节节拍间的时间即可。
梦境摆渡人 发表于 2025-7-9 21:59 | 显示全部楼层
很详细的步进电机驱动测试,图1和图2的连接方式和接口定义都很清晰,学习了。
 楼主| jinglixixi 发表于 2025-7-11 07:28 | 显示全部楼层
梦境摆渡人 发表于 2025-7-9 21:59
很详细的步进电机驱动测试,图1和图2的连接方式和接口定义都很清晰,学习了。
...

感谢支持!!!
暖心小太阳 发表于 2025-7-11 20:18 | 显示全部楼层
非常详细的步进电机驱动测试,图1和图2的连接方式和接口定义都很清晰,学习了!
幻境之眼 发表于 2025-8-6 15:36 | 显示全部楼层
jinglixixi 发表于 2025-7-6 21:09
对于步进电机来说,要实现加减速只需调节节拍间的时间即可。

一般T型加减速用的比较多线性的,s曲线看需求吧看是否需要
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

粉丝

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部