【新提醒】基于HC32F460开发板的电机驱动及调速控制
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动要由步进电机、驱动电路及微控制器构成,见图1所示。
图1 步进电机驱动构成
在HC32F460开发板上,提供了电机驱动控制接口,见图2所示。
图2 电机驱动控制接口
为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。
要编写步进电机驱动程序主要分为以下几步:
1)分配引脚
使步进电机的MA~ MD引脚分别与PE8~ PE11相连接
MA---PE8
MB---PE9
MC---PE10
MD---PE11
2)定义输出高低电平的语句
- #define MAL PORT_ResetBits(PortE, Pin08)
- #define MAH PORT_SetBits(PortE, Pin08)
- #define MBL PORT_ResetBits(PortE, Pin09)
- #define MBH PORT_SetBits(PortE, Pin09)
- #define MCL PORT_ResetBits(PortE, Pin10)
- #define MCH PORT_SetBits(PortE, Pin10)
- #define MDL PORT_ResetBits(PortE, Pin11)
- #define MDH PORT_SetBits(PortE, Pin11)
复制代码
3)配置延时函数
配置延时函数的工作在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。
对于步进电机来说其速度是与驱动脉冲相有关的,但也并非脉冲越快,电机的转速越快。因为电机电机属于机械器件,要建立相应的磁场以达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,并无法旋转。
4)控制电机旋转方向
对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
正转的驱动函数为:
- void zx(void)
- {
- unsigned char X,Y;
- for(X=0;X<64;X++)
- {
- for(Y=0;Y<8;Y++)
- {
- MDL;
- MAH; //A
- Ddl_Delay1ms(n);
- MBH; //AB
- Ddl_Delay1ms(n);
- MAL; //B
- Ddl_Delay1ms(n);
- MCH; //BC
- Ddl_Delay1ms(n);
- MBL; //C
- Ddl_Delay1ms(n);
- MDH; //CD
- Ddl_Delay1ms(n);
- MCL; //D
- Ddl_Delay1ms(n);
- MAH; //DA
- Ddl_Delay1ms(n);
- }
- }
- }
复制代码
反转的驱动函数为:
- void fx(void)
- {
- unsigned char X,Y;
- for(X=0;X<64;X++)
- {
- for(Y=0;Y<8;Y++)
- {
- MDH;
- MAH; //A
- Ddl_Delay1ms(n);
- MAL; //AB
- Ddl_Delay1ms(n);
- MCH; //B
- Ddl_Delay1ms(n);
- MDL; //BC
- Ddl_Delay1ms(n);
- MBH; //C
- Ddl_Delay1ms(n);
- MCL; //CD
- Ddl_Delay1ms(n);
- MAH; //D
- Ddl_Delay1ms(n);
- MBL; //DA
- Ddl_Delay1ms(n);
- }
- }
- }
复制代码
5)控制电机运行
控制电机运行的关键程序
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"HC32F460 TEST",16);
- OLED_ShowString(0,2,"OLED & MOTOR:",16);
- MAL;
- MBL;
- MCL;
- MDL;
- Ddl_Delay1ms(500);
- f=1;
- rdata=5;
- n=3; // n>1
- OLED_ShowNum(112,2,0,2,16);
- for(c=0;c<rdata;c++)
- {
- if(f==0) fx();
- else zx();
- OLED_ShowNum(112,2,c,2,16);
- }
复制代码
感兴趣的话,还可以添加按键来设置转速和转动的圈数等,那会使应用价值更高!
赞 (0)