[活动专区] 【AT-START-L021测评】+步电机驱动控制

[复制链接]
1717|0
 楼主| jinglixixi 发表于 2024-11-28 23:01 | 显示全部楼层 |阅读模式
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动电路主要由步进电机、驱动电路及微控制器所构成。
为驱动步进电机,可使用图2所示的扩展接口J3。

59652674884a34a1f1.png
1 扩展接口
为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。
要编写步进电机驱动程序主要分为以下几步:
1)分配引脚
步进电机与开发板的连接关系为:
MA---PA5
MB---PA6
MC---PA7
MD---PA9
2)高低电平的输出
为便于输出高低电平,所作的定义语句为:
#define MAL  gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)
#define MAH  gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE)
#define MBL  gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)
#define MBH  gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE)
#define MCL  gpio_bits_write(GPIOA,GPIO_PINS_7,FALSE)
#define MCH  gpio_bits_write(GPIOA,GPIO_PINS_7,TRUE)
#define MDL  gpio_bits_write(GPIOA,GPIO_PINS_15,FALSE)
#define MDH  gpio_bits_write(GPIOA,GPIO_PINS_15,TRUE)
3)配置引脚工作模式
要驱动步进电机工作,必须向各引脚按时序要求来输出高低电平,其引脚工作模式的配置函数为:
  1. void bjdj_CONFIG(void)
  2. {
  3.   gpio_init_type gpio_init_struct;
  4.   crm_periph_clock_enable(CRM_GPIOA_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_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_15;
  10.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  11.   gpio_init(GPIOA, &gpio_init_struct);
  12. }

4)配置延时函数
配置延时函数的作用在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
对于步进电机来说其速度是与驱动脉冲相有关的,但也并非脉冲越快,电机的转速越快。因为电机属机械器件,要建立相应的磁场以达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,无法旋转。
5)控制电机旋转方向
对于45线式步进电机来讲,可通过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. }

6)控制电机运行
控制电机运行的关键程序为:
  1. int main(void)
  2. {
  3. char f,m,i;
  4.   system_clock_config();
  5.   at32_board_init();
  6.   bjdj_CONFIG();
  7.   MAL;
  8.   MBL;
  9.   MCL;
  10.   MDL;
  11.   delay_ms(500);
  12.   f=0;
  13.   m=5;
  14.   for(i=0;i<m;i++)
  15.   {
  16.       if(f==0)  fx(1);
  17.       else    zx(1);
  18.   }
  19.   while(1)
  20.   {
  21.     at32_led_toggle(LED2);
  22.     delay_ms(200);
  23.     at32_led_toggle(LED3);
  24.     delay_ms(200);
  25.     at32_led_toggle(LED4);
  26.     delay_ms(200);
  27.   }
  28. }

经程序的编译与下载,其测试效果如图2所示,说明测试成功。
358406748857695a3a.png
2 运行状态

155906748858e5429c.png
3 停止状态
感兴趣的话,还可以添加按键以动态进行电机的转向控制


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

本版积分规则

521

主题

2949

帖子

39

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