background image

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