打印
[活动专区]

【AT-START-L021测评】+步电机驱动控制

[复制链接]
1210|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动电路主要由步进电机、驱动电路及微控制器所构成。
为驱动步进电机,可使用图2所示的扩展接口J3。

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)配置引脚工作模式
要驱动步进电机工作,必须向各引脚按时序要求来输出高低电平,其引脚工作模式的配置函数为:
void bjdj_CONFIG(void)
{
  gpio_init_type gpio_init_struct;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  gpio_default_para_init(&gpio_init_struct);
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_init_struct.gpio_pins = GPIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_15;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(GPIOA, &gpio_init_struct);
}

4)配置延时函数
配置延时函数的作用在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
对于步进电机来说其速度是与驱动脉冲相有关的,但也并非脉冲越快,电机的转速越快。因为电机属机械器件,要建立相应的磁场以达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,无法旋转。
5)控制电机旋转方向
对于45线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
正转的驱动函数为:
void zx(int n)
{
  unsigned char X,Y;
  for(X=0;X<64;X++)
  {
     for(Y=0;Y<8;Y++)
     {
         MDL;
         MAH;  //A
         delay_ms(n);
         MBH;  //AB
         delay_ms(n);
         MAL;  //B
         delay_ms(n);
         MCH;  //BC
         delay_ms(n);
         MBL;  //C
         delay_ms(n);
         MDH;  //CD
         delay_ms(n);
         MCL;  //D
         delay_ms(n);
         MAH;  //DA
         delay_ms(n);
     }
  }
}

反转的驱动函数为:
void fx(int n)
{
   unsigned char X,Y;
   for(X=0;X<64;X++)
   {
       for(Y=0;Y<8;Y++)
       {
          MDH;
          MAH;   //A
          delay_ms(n);
          MAL;   //AB
          delay_ms(n);
          MCH;  //B
          delay_ms(n);
          MDL;  //BC
          delay_ms(n);
          MBH;  //C
          delay_ms(n);
          MCL;  //CD
          delay_ms(n);
          MAH;  //D
          delay_ms(n);
          MBL;  //DA
          delay_ms(n);
       }
   }
}

6)控制电机运行
控制电机运行的关键程序为:
int main(void)
{
char f,m,i;
  system_clock_config();
  at32_board_init();
  bjdj_CONFIG();
  MAL;
  MBL;
  MCL;
  MDL;
  delay_ms(500);
  f=0;
  m=5;
  for(i=0;i<m;i++)
  {
      if(f==0)  fx(1);
      else    zx(1);
  }
  while(1)
  {
    at32_led_toggle(LED2);
    delay_ms(200);
    at32_led_toggle(LED3);
    delay_ms(200);
    at32_led_toggle(LED4);
    delay_ms(200);
  }
}

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

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


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

464

主题

2783

帖子

38

粉丝