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