本帖最后由 jinglixixi 于 2025-6-3 18:05 编辑
#申请原创#
【AT-START-M412测评】+步进电机驱动测试
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等。一个简单的步进电机驱动电路主要由步进电机、驱动电路及微控制器所构成。
为驱动步进电机,可使用图1所示连接方式。
图1 连接方式
为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。
要编写步进电机驱动程序主要分为以下几步:
1)分配引脚
步进电机与开发板的连接关系为:
MA---PB6
MB---PB4
MC---PB3
MD---PB5
图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)配置引脚工作模式
要驱动步进电机工作,必须使各引脚按时序要求来输出高低电平,其引脚工作模式的配置函数为:
- void BJDJ_config()
- {
- gpio_init_type gpio_init_struct;
- crm_periph_clock_enable(CRM_GPIOB_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_3|GPIO_PINS_4|GPIO_PINS_5|GPIO_PINS_6;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(GPIOB, &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);
- }
- }
- }
对于变量X来讲,其作用是控制电机转动的步进角度,利用它可实现小角度的精准控制。
6)控制电机运行
控制电机运行的函数为:
- void clkz(uint8_t d,uint8_t m)
- {
- uint8_t i;
- delay_ms(20);
- MAL;
- MBL;
- MCL;
- MDL;
- delay_ms(20);
- for(i=0;i<m;i++)
- {
- if(d==0) fx(1);
- else zx(1);
- }
- }
其中,函数 clkz()的控制参数d用于控制电机的转动方向,参数m用于控制电机的转动圈数。
测试电机运行的主程序为:
- int main(void)
- {
- system_clock_config();
- at32_board_init();
- BJDJ_config();
- clkz(0);
- delay_ms(500);
- clkz(1);
- delay_ms(500);
- while(1)
- {
- at32_led_toggle(LED2);
- delay_ms(200);
- at32_led_toggle(LED3);
- delay_ms(200);
- at32_led_toggle(LED4);
- delay_ms(200);
- }
- }
经程序的编译与运行,则可见到步进电机开始转动见图3所示,说明程序测试成功。
图3 运行状态
后续,会利用步进电机的精准控制与超声波测距模块相配合来实现一个进行大角度摆动范围的距离检测装置。
演示视频:
|