算电机的转速。当电机正常运行时,通过霍尔传感器可得到 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;