本帖最后由 jinglixixi 于 2020-7-14 00:25 编辑
步进电机是一种常用的执行器件,使用它能进行精准的定位及转速调节等工作。一个简单的步进电机驱动要由步进电机、驱动电路及单片机构成,见下图所示。
步进电机驱动的构成图
为了驱动步进电机,除了硬件方面的准备,还需必要的软件配合。在易码魔盒中,就提供了步进电机的外设驱动。由于刚开始学习用易码魔盒来设计程序,便打算在这方面练练手。 起初试了许多次,都一直没有成功,就打算用手工编程的方法先让步进电机转起来,然后再与易码魔盒生成的程序进行对比来发现问题。 要手工编写步进电机驱动程序主要分为以下几步: 1)分配引脚的使用 以步进电机的MA~ MD引脚分别与P32~ P35相连接 sbit MA = P3^2; sbit MB = P3^3; sbit MC = P3^4; sbit MD = P3^5;
2)定义输出高低电平的宏定义 #define MAL MA = 0; #define MAH MA = 1; #define MBL MB = 0; #define MBH MB = 1; #define MCL MC = 0; #define MCH MC = 1; #define MDL MD = 0; #define MDH MD = 1;
3)配置延时函数 配置延时函数的工作在步进电机的驱动中十分重要,它控制着步进电机运转的快慢。 但问题也正出在这里,对于步进电机来说其速度是与驱动脉冲有关,但也并非脉冲越快,电机的转速越快。因为电机电机属于机械器件,要建立相应的磁场及达到相应的扭矩才能使电机转动。过快的脉冲只会使电机在原地震颤和抖动,并无法旋转。 使电机转动的延时函数为: - void delay_ms(void)
- {
- unsigned char b,c;
- for(c=0;c<180;c++)
- {
- for(b=0;b<8;b++);
- }
- }
- 4)控制电机旋转方向
- 对于4相5线式步进电机来讲,可通过8个节拍的脉冲序列来控制其正反转。
- 正转的驱动函数为:
- void zx()
- {
- unsigned char X,Y;
- for(X=0;X<64;X++)
- {
- for(Y=0;Y<8;Y++)
- {
- MDL;
- MAH; //A
- delay_ms();
- MBH; //AB
- delay_ms();
- MAL; //B
- delay_ms();
- MCH; //BC
- delay_ms();
- MBL; //C
- delay_ms();
- MDH; //CD
- delay_ms();
- MCL; //D
- delay_ms();
- MAH; //DA
- delay_ms();
- }
- }
- }
复制代码
反转的单片机驱动函数为: - void fx()
- {
- unsigned char X,Y;
- for(X=0;X<64;X++) // 控制节拍数
- {
- for(Y=0;Y<8;Y++) // 控制节拍
- {
- MDH;
- MAH; //A
- delay_ms();
- MAL; //AB
- delay_ms();
- MCH; //B
- delay_ms();
- MDL; //BC
- delay_ms();
- MBH; //C
- delay_ms();
- MCL; //CD
- delay_ms();
- MAH; //D
- delay_ms();
- MBL; //DA
- delay_ms();
- }
- }
- }
复制代码
5)主程序控制电机运行 - void main()
- {
- unsigned char rdata=9,f,c;
- delay_ms();
- //停止电机转动
- MAL;
- MBL;
- MCL;
- MDL;
- delay_ms();
- f=1;//控制转向
- while(1)
- {
- for(c=0;c<rdata;c++) //控制转动的位置
- {
- if(f==0)
- fx();
- else
- {
- zx();
- }
- }
- }
- }
复制代码
|