步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动电路主要由步进电机、驱动电路及微控制器所构成。 为驱动步进电机,可使用图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)控制电机旋转方向 对于4相5线式步进电机来讲,可通过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 停止状态 感兴趣的话,还可以添加按键以动态进行电机的转向控制。
|