步进电机控制器的设计
时间:2022-12-29 21:00:00
备份使用本文档。
摘 要: 基于多模式的步进电机控制装置设计STC单片机STC89C52.软件部分由C51设计包括启停中断程序、转向中断程序、步进电机调速程序、键盘信号检测和显示程序 ,硬件包括单片机最小系统电路、步进电机及其驱动电路、显示和按键处理电路。
关键词: 多模式;步进电机;单片机;显示参数
1 设计任务及要求
(1)可控制步进电机的启动和停止、正转和反转
(2)10 档速度调节
(3)点动控制
(4)可显示电机运行参数
2 设计方案
2.1总体设计思路
单片机输出电机在控制装置中的各相控制脉冲序列ULN2003D驱动模块驱动步进电机旋转,按键输入控制电机工作模式,数字管显示电机运行状态。
2.2步进电机的控制模式
采用延时法控制。
延迟方法是每次换向后调用延迟子程序,延迟结束后再进行换向,以便一次又一次地发出一定的频率CP脉冲或换向周期。延迟子程序的延迟时间和换向程序使用的时间和CP脉冲周期。
2.3 键盘的工作模式
矩形键盘编程在键盘扫描输入模式中工作,其原理是在某一时刻只让一条线处于低电平,其余线处于高电平,然后当按下键时,键的行电平将从高电平变为低电平,可以确定相应的行有键按下。读取键盘时,具有软件延迟抖动功能,避免误触发。
3 硬件设计
3.1 单片机最小系统电路的设计
采用控制芯片STC89C52,是STC公司生产的低功耗、高性能CMOS8位微控制器,8位k字节Flash,512字节RAM, 32 位I/O 口线,门狗定时器,内置4KB EEPROM,MAX810复位电路,316 定时器/计数器,四个外部中断,全双工串行口为7向量4级中断结构(兼容传统515向量2级中断结构)。由于单片机内部的资源丰富,性价比高,能够满足该设计的要求,而且减少了硬件电路的设计,提高了工作效率。由于单片机内部资源丰富,性价比高,足设计要求,降低硬件电路设计,提高工作效率。单片机外引脚定义如图所示:
复位电路采用手动按路。当电源打开时,RST端与VCC随着电容上电压的逐渐升高,同电位,RST端部电压逐渐下降,因此在RST只要正脉冲的宽度持续两个机器周期的高电平,系统就可以自动复位。
时钟电路采用内部时钟法。晶振电路由两个30PF电容和12M晶体振荡器由单片机两端跨接组成XTAL1和XTAL在两个端口上。
3.2 显示和按钮处理电路的设计
该系统设计扩展了独立键盘和4x4按钮矩阵键盘和8段LED控制装置可手动直接操作数码管。
系统上电后,通过独立键盘输入步进电机的启停输入,矩阵键盘控制电机转速LED管道显示步进电机的速度和转向。键盘的输入和LED8279控制管道输出,减轻单片机工作负担。
数码管采用74LS硬件译码和动态显示的原理是一切LED段选线连接在一起共享 8位I/O口,而每个LED位选分别由一个相应的位选I/O口线控制。因此,必须采用动态扫描显示,每时每刻只选择其中一个LED,同时,将该位置送到段选口LED的字型码。
矩形键盘编程在键盘扫描输入模式中工作,其原理是在某一时刻只让一条线处于低电平,其余线处于高电平,然后当按下键时,键的行电平将从高电平变为低电平,可以确定相应的行有键按下。读取键盘时,具有软件延迟抖动功能,避免误触发。
3.3 步进电机及其驱动电路的设计
28步进电机BYJ-48.电机为四相五线系统,是一种可将电脉冲转化为角位移的执行机构。当步进驱动模块接收到脉冲信号时,驱动步进电机按设定方向旋转固定步进角。角位移可以通过控制脉冲数量来控制,从而达到准确定位的目的;电机旋转速度和加速度可以通过控制脉冲频率来控制,从而达到调速的目的。
每个脉冲信号对应于步进电机某一相或两相绕组的通电状态。四相步进电机可以以不同的通电方式运行。常见的通电方式有四拍、双四拍和八拍。本设计采用八拍。
步进电机驱动模块采用ULN2003D,由七个硅组成的高耐压、大电流复合晶体管阵列NPN 由复合晶体管组成,每对达林顿串联一个2.7K 5的基极电阻V 它可以在工作电压下与TTL 和CMOS 电路直接连接,可以直接处理需要标准逻辑缓冲器处理的数据。
3.4电气原理图
4 软件设计
在本实验中,设置了电机启停标志位和转向标志位,用两个外部中断来改变标志位。主程序识别不同的标志位会改变电机的运行模式,用定时器中断键盘扫描读取用户输入的速度值,并显示在数字管中。
4.1 流程图
4.2 源程序
#include typedef unsigned char uchar; uchar direction = 0; //0为正转,1为反转 uchar onoff = 0; //关为0,开为1 uchar index = 0; //通过index指示电机转动,八拍 uchar tmp; uchar keyval; sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
uchar code table[ ]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字0~9的段码
unsigned char code beatCode[ ] = {
0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
unsigned char code beatCode_r[ ] = {
0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
void delay(unsigned int i)//延时
{
while(--i);
}
void led_delay(void)//数码管动态扫描延时
{
uchar j;
for(j=0;j<200;j++)
;
}
void display(uchar k)//按键值的数码管显示子程序
{
P22=1;
P23=1;
P24=1;
P0=table[k/10];
led_delay();
P22=0;
P23=1;
P24=1;
P0=table[k%10];
led_delay();
}
void delay20ms(void)//软件延时子程序
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
void main(){
/* LED */
P0 = 0xff;
/* 初始化中断 */
EA = 1;
EX0 = 1; //要用到的中断是两个外部中断和定时器中断0
IT0 = 1;
EX1 = 1;
IT1 = 1;
/* 定时器0 */
ET0=1;
TMOD=0x01;
TH0=(65536-10000)/256; //65536-500
TL0=(65536-10000)%256;
TR0=1;
keyval=0x00;
while(1){
display(keyval);
if(onoff==1){
if(direction==0){
tmp = P1; //读取端口值
tmp = tmp & 0xF0; //高4位不变
tmp = tmp | beatCode[index]; //低四位变为相应节拍(低四位与电机相连)
P1 = tmp; //输出时序
index++;
index= index & 0x07; //准备输出下一节拍
delay(keyval*40); //max speed standard:150 延迟越小(脉冲间隔越小)速度越快
}
else if(direction==1){
P2=0X00; //NEW
tmp = P1;
tmp = tmp & 0xF0;
tmp = tmp | beatCode_r[index];
P1 = tmp;
index++;
index= index & 0x07;
delay(keyval*40);
}
}
}
}
void Stop()interrupt 0 //k3 电机启停
{
onoff++;
if (onoff > 1)
onoff = 0;
}
void int1()interrupt 2 //k4 按一下控制电机反转,再按正转
{
direction++;
if (direction > 1)
direction = 0;
}
void time1_interserve(void) interrupt 1 //键盘扫描中断(定时器0)
{
TR0=0;
P1=0xf0;
if((P1&0xf0)!=0xf0)
delay20ms();
if((P1&0xf0)!=0xf0)
{
P1=0xfe;
if(P14==0)
keyval=1;
if(P15==0)
keyval=2;
if(P16==0)
keyval=3;
if(P17==0)
keyval=4;
P1=0xfd;
if(P14==0)
keyval=5;
if(P15==0)
keyval=6;
if(P16==0)
keyval=7;
if(P17==0)
keyval=8;
P1=0xfb;
if(P14==0)
keyval=9;
if(P15==0)
keyval=10;
if(P16==0)
keyval=11;
if(P17==0)
keyval=12;
P1=0xf7;
if(P14==0)
keyval=13;
if(P15==0)
keyval=14;
if(P16==0)
keyval=15;
if(P17==0)
keyval=16;
}
TR0=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}
5 调试中出现的问题及解决的办法
5.1 步进电机抖动但不旋转
推测可能的原因:
1.两个脉冲间隔太小导致力矩变小无法旋转:当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。
解决办法:增加延时
2.电机的通电时序表有错误:四相步进电机驱动方式有四拍,双四拍,八拍,通电顺序错误会导致电机运行异常
解决办法:检查时序表
3程序问题
解决办法:将单独的控制电机转动的程序提取测试。若正常则扩大程序提取范围,若异常则进行修改
4电机损坏
解决办法:当上述原因不成立时,考虑更换电机
根据上述罗列顺序进行测试,发现为程序以及时序表问题,查阅资料进行表的修改,并重新编写程序后进行测试,电机运转正常。
5.2外部中断无法控制启停
推测可能的原因:
- 外部中断失效
- 解决办法:编写一段能在数码管中显示数值的中断测试程序,若触发中断后显示数值,该中断触发正常
- 程序编写错误
解决办法:重新检查是否正常初始化和开放中断,外部中断是否改变标志,主程序是否正常识别标志
按照上述罗列顺序进行测试,发现中断运行正常,则归类为程序错误,排查错误时发现将语句onoff==1写为onoff=1,导致程序不能正常运行。
6 参考资料
[1]高玉芹.单片机原理与应用及C51编程技术[M].北京:机械工业出版社,2017.
[2]张元良.单片机开发技术实例[M].北京:机械工业出版社,2010.