"); //-->
一种基于C8051F单片机的直流无刷电机转速控制系统
[ 作者:王天庆 谭名栋 姚文斌
[摘要]:该文以C8051F020为例介绍了C8051F单片机在无刷直流电机转速控制中的应用、实现方法、硬件结构及软件结构等。
[关键词]:单片机、无刷直流电机、转速控制
[Abstract]: The article introduces application of C8051F020 in rotate speed Control of direct current and brushless motor, realization method,configuration of software and hardware.
[Keywords]: MCU,direct current and brushless motor, rotate speed Control
引言:
具有梯形反电动势的永磁同步电动机通常被称为无刷直流电动机,它具有结构简单、体积小、重量轻、效率高、高功率密度、启动扭矩大、惯量小和响应快等其它种类直流电机无法比拟的特性。采用电子换向器替代了传统直流电动机的机械换向装置,从而克服了电刷和换向器所引起的噪声、火花、电磁干扰、寿命短等一系列弊病。由于无刷直流电动机既具备交流电动机的结构简单、运行可靠、维护方便等一系列优点,又具 有直流电动机的运行效率高、无励磁损耗以及调速性能好等诸多优点,故其在在家用消费类产品(空调、冰箱、洗衣机)和IT周边产品(打印机、软驱、硬驱)中得到广泛的应用。
C8051F单片机是美国Silabs公司推出的一种与51系列单片机内核兼容的单片机,具有高速、高性能、高集成度。以C8051F020为例,具有如下特点:
C8051F020片上系统单片机片内资源:
一、模块外设
(1)逐次逼近型8路12位ADC0
转换速率最大100ksps
可编程增益放大器PGA
温度传感器
(2)8路8位ADC1输入与P1口复用
转换速率500ksps
可编程增益放大器PGA
(3)两个12 位DAC
(4)两个模拟电压比较器
(5)电压基准内部提供2.43V
外部基准可输入
(6)精确的VDD监视器
二、高速8051微控制器内核
流水线式指令结构速度可达25MIPS
22个矢量中断源
三、存储器
片内4352字节数据RAM
64KBFlash程序存储器可作非易失性存储
外部可扩展的64KB 数据存储器接口
四、数字外设
8个8位的端口I/O
I2CSPI2个增强型UART串口
可编程的16位计数器/定时器阵列(PCA)
5个通用16位计数器/定时器
专用的看门狗WDT
五、JTAG调试和边界扫描接口,可实现在线实时动态调试。
由以上特点可以看出,C8051F单片机具有丰富的片上硬件资源及高运算速度,这为实现复杂的控制算法提供了保障,而且几乎不需系统扩展即可满足控制系统对硬件资源的需求,极大地提高了系统可靠性。
硬件部分:
硬件部分主要由电机、电机驱动电路及单片机及显示块组成。其功能框图如下:
电机驱动采用美国安森美公司开发的高性能第二代单元无刷直流电机控制器MC33035。该芯片内部具有定频调宽PWM电路,它集译码、过热、过流、欠压保护、正反转控制等诸多功能于一身,是一种功能齐全的电机控制器。
通过脉宽调制PWM来控制电动机电枢电压可以实现调速。在正常情况下,误差放大器输出与振荡器输出锯齿波信号比较后,产生脉宽调制(PWM)信号如下图所示。改变输出脉冲宽度,相当于改变供给电动机绕组的平均电压,从而控制其转速。所以我们可以通过单片机控制DAC0的输出,控制输入到直流无刷电机的电压,进而控制PWM波的占空比达到控制电机转速的目的。
MC33035的脉宽调节原理图
软件部分:
无刷直流电机内置3个霍尔效应传感器,用来检测转子的位置,也决定电机的换相,并可以根据该信号来计算电机的转速。当电机正常运行时,通过霍尔传感器可得到3个脉宽为180度电角度的互相重叠的信号,而电机转速的改变可以从位置传感器输出脉冲频率的改变上反映出来,因此可以利用单片机对这个 脉冲信号进行监测得到电机转速。因频率和转速成正比测量,所以测出输出脉冲的频率即可计算出转速。另外,为了提高精度,高速(>/1000HZ)采用测频法,低速(<1000HZ)采用测周法。
将脉冲信号输出与INT0连接,采用INT0中断对转速脉冲计数,每1s读一次计数值,将此值与预设的转速值比较,若大于预设的转速值,则减小DAC0的数值;若小于预设的转速值,则增加DAC0的值,调整电机的转速直到转速值等于预设定的值。电机当前的转速值可在七段数码管上显示,在电机的可控范围内控制电机转速等于预设值。
程序框图:
单片机程序采用C51完成,部分源程序如下:
一、系统时钟初始化,采用18.432MHZ外部晶振:
void SYSCLK_Init (void)
{
int i; //延时计数器
OSCXCN=0x67; //开启外部振荡器18.432MHz晶体
for(i=0;i<256;i++) ; //等待振荡器启振
while(!(OSCXCN&0x80)) ; //等待晶体振荡器稳定
OSCICN=0x88; //选择外部振荡器为系统时钟源并允许丢失时钟检测器
}
二、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
}
三、定时器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;
}
四、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; }
}
}
五、外部0中断:
void Int0_ISR (void) interrupt 0
{ MotorCount++;}
软件仿真调试方法:
(1)观察DAC0的窗口,改变DAC0的数值观察电机转速的变化
(2)使用示波器观察CKMOT的频率计算出电机的转速与七段数码管显示的数值比较,比较速度测量的准确性
(3)改变常量SetSpeed的值(转速的预设值),观察速度稳定后七段数码管的数值
(4)可将断点设在外部中断INT0的入口和T0中断的入口运行程序观察程序运行是否正常。
结束语:
由于C8051F020的高集成度,因此只需少量外围电路。另外,C8051F020内核与普通51系列兼容,且指令简单易学,可缩短系统开发周期。实践证明,本控制系统精度高,稳定性好,硬件简单且工作可靠,具有很好的推广价值。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。