软件部分:
无刷直流电机内置3个霍尔效应传感器,用来检测转子的位置,也决定电机的换相,并可以根据该信号来计算电机的转速。当电机正常运行时,通过霍尔传感器可得到3个脉宽为180度电角度的互相重叠的信号,而电机转速的改变可以从位置传感器输出脉冲频率的改变上反映出来,因此可以利用单片机对这个 脉冲信号进行监测得到电机转速。因频率和转速成正比测量,所以测出输出脉冲的频率即可计算出转速。另外,为了提高精度,高速(>/1000HZ)采用测频法,低速(<1000HZ)采用测周法。
将脉冲信号输出与INT0连接,采用INT0中断对转速脉冲计数,每1s读一次计数值,将此值与预设的转速值比较,若大于预设的转速值,则减小DAC0的数值;若小于预设的转速值,则增加DAC0的值,调整电机的转速直到转速值等于预设定的值。电机当前的转速值可在七段数码管上显示,在电机的可控范围内控制电机转速等于预设值。
单片机程序采用C51完成,部分源程序如下:
1、系统时钟初始化,采用18.432MHZ外部晶振:
- void SYSCLK_Init (void)
- {
- int i; //延时计数器
- OSCXCN=0x67; //开启外部振荡器18.432MHz晶体
- for(i=0;i<256;i++) ; //等待振荡器启振
- while(!(OSCXCN&0x80)) ; //等待晶体振荡器稳定
- OSCICN=0x88; //选择外部振荡器为系统时钟源并允许丢失时钟检测器
- }
2、IO口初始化
- void PORT_Init (void)
- XBR0 =0x07; //使能SMBus,SPI0,和UART0
- XBR1 =0x04; //P1.0<---int0
- XBR2 =0x40; //使能数据交叉开关和弱上拉
- EMI0CF =0x27;
- EMI0TC =0x21;
- P74OUT =0xFF;
- P0MDOUT =0x15;
- P1MDOUT |=0x3C; //P1.2-P1.5推挽输出
- P1 &= 0xc3; //P1.2-P1.5=0
3、定时器0初始化,定时时间为1ms
- void Timer0_Init (void)
- {
- CKCON|=0x8;
- TMOD|=0x1; //16位
- Count1ms=10;
- TR0 = 0; //停止定时器0
- TH0 = (-SYSCLK/1000) >> 8; //设初值,1ms时溢出
- TL0 = -SYSCLK/1000;
- TR0 = 1; //开启定时器0
- IE|= 0x2;
- }
4、Timer0中断:
- void Timer0_ISR (void) interrupt 1
- {
- TH0 = (-SYSCLK/1000) >> 8;
- TL0 = -SYSCLK/1000;
- if (Count1ms)
- {
- Count1ms--;
- }
- if (Count1s)
- {
- Count1s--; //Count1s初值为1000
- }
- else
- {
- Count1s=1000;
- SaveMotorCount=MotorCount; //MotorCount为测得每秒脉冲个数
- MotorCount=0;
- SD=SaveMotorCount/2-SetSpeed; //常量SetSpeed的值为转速的预设值,单位为转/秒
- SaveMotorCount*=30; //转/分
- if (SD)
- {
- if ((SD>5)||(SD<-5))
- iDAC0-=SD*4;
- else
- iDAC0-=SD;
- DAC0=iDAC0;
- }
- }
- }
5、外部0中断:
- void Int0_ISR (void) interrupt 0
- {
- MotorCount++;
- }
软件仿真调试方法:
(1)观察DAC0的窗口,改变DAC0的数值观察电机转速的变化
(2)使用示波器观察CKMOT的频率计算出电机的转速与七段数码管显示的数值比较,比较速度测量的准确性
(3)改变常量SetSpeed的值(转速的预设值),观察速度稳定后七段数码管的数值
(4)可将断点设在外部中断INT0的入口和T0中断的入口运行程序观察程序运行是否正常。
结束语:
由于C8051F020的高集成度,因此只需少量外围电路。另外,C8051F020内核与普通51系列兼容,且指令简单易学,可缩短系统开发周期。实践证明,本控制系统精度高,稳定性好,硬件简单且工作可靠,具有很好的推广价值。