网站导航: 首页 > 设计参考 > 正文 文章搜索
一种基于C8051F单片机的直流无刷电机转速控制系统
 
文章编号:
090423151939
文章分类: 单片机 51系列
点 击:
...
关 键 词: C8051F,直流无刷电机
文章来源:
网络,作者:王天庆 谭名栋 姚文斌
摘 要:
该文以C8051F020为例介绍了C8051F单片机在无刷直流电机转速控制中的应用、实现方法、硬件结构及软件结构等

软件部分:

  无刷直流电机内置3个霍尔效应传感器,用来检测转子的位置,也决定电机的换相,并可以根据该信号来计算电机的转速。当电机正常运行时,通过霍尔传感器可得到3个脉宽为180度电角度的互相重叠的信号,而电机转速的改变可以从位置传感器输出脉冲频率的改变上反映出来,因此可以利用单片机对这个 脉冲信号进行监测得到电机转速。因频率和转速成正比测量,所以测出输出脉冲的频率即可计算出转速。另外,为了提高精度,高速(>/1000HZ)采用测频法,低速(<1000HZ)采用测周法。

  将脉冲信号输出与INT0连接,采用INT0中断对转速脉冲计数,每1s读一次计数值,将此值与预设的转速值比较,若大于预设的转速值,则减小DAC0的数值;若小于预设的转速值,则增加DAC0的值,调整电机的转速直到转速值等于预设定的值。电机当前的转速值可在七段数码管上显示,在电机的可控范围内控制电机转速等于预设值。

单片机程序采用C51完成,部分源程序如下:

1、系统时钟初始化,采用18.432MHZ外部晶振:

 
  1. void SYSCLK_Init (void)   
  2. {   
  3.        int i;                             //延时计数器   
  4.        OSCXCN=0x67;                    //开启外部振荡器18.432MHz晶体   
  5.        for(i=0;i<256;i++) ;        //等待振荡器启振   
  6.        while(!(OSCXCN&0x80)) ;       //等待晶体振荡器稳定   
  7.        OSCICN=0x88;                  //选择外部振荡器为系统时钟源并允许丢失时钟检测器   
  8. }   

 2、IO口初始化

 
  1. void PORT_Init (void)   
  2.   
  3.       XBR0    =0x07;                     //使能SMBus,SPI0,和UART0   
  4.       XBR1    =0x04;                    //P1.0<---int0   
  5.       XBR2    =0x40;                    //使能数据交叉开关和弱上拉   
  6.       EMI0CF  =0x27;   
  7.       EMI0TC  =0x21;   
  8.       P74OUT  =0xFF;   
  9.       P0MDOUT =0x15;   
  10.       P1MDOUT |=0x3C;      //P1.2-P1.5推挽输出   
  11.       P1 &= 0xc3;     //P1.2-P1.5=0   
  12.   

3、定时器0初始化,定时时间为1ms

 
  1.  void Timer0_Init (void)   
  2. {   
  3.         CKCON|=0x8;   
  4.         TMOD|=0x1;                     //16位   
  5.          Count1ms=10;   
  6.         TR0 = 0;                         //停止定时器0   
  7.         TH0 = (-SYSCLK/1000) >> 8;       //设初值,1ms时溢出   
  8.         TL0 = -SYSCLK/1000;   
  9.         TR0 = 1;                      //开启定时器0   
  10.         IE|= 0x2;    
  11. }   

4、Timer0中断:

 
  1. void Timer0_ISR (void) interrupt 1               
  2. {   
  3.     TH0 = (-SYSCLK/1000) >> 8;     
  4.     TL0 = -SYSCLK/1000;   
  5.     if (Count1ms)   
  6.     {   
  7.         Count1ms--;   
  8.     }   
  9.     if (Count1s)    
  10.     {   
  11.         Count1s--;                  //Count1s初值为1000   
  12.     }   
  13.     else  
  14.     {   
  15.         Count1s=1000;   
  16.         SaveMotorCount=MotorCount;          //MotorCount为测得每秒脉冲个数   
  17.         MotorCount=0;   
  18.         SD=SaveMotorCount/2-SetSpeed;    //常量SetSpeed的值为转速的预设值,单位为转/秒   
  19.         SaveMotorCount*=30; //转/分   
  20.         if (SD)    
  21.         {   
  22.             if ((SD>5)||(SD<-5))   
  23.                 iDAC0-=SD*4;   
  24.             else  
  25.                 iDAC0-=SD;   
  26.             DAC0=iDAC0;      
  27.         }   
  28.     }   
  29. }  

5、外部0中断:

 
  1. void Int0_ISR (void) interrupt 0     
  2. {    
  3.      MotorCount++;   
  4. }   

软件仿真调试方法:
  (1)观察DAC0的窗口,改变DAC0的数值观察电机转速的变化
  (2)使用示波器观察CKMOT的频率计算出电机的转速与七段数码管显示的数值比较,比较速度测量的准确性
  (3)改变常量SetSpeed的值(转速的预设值),观察速度稳定后七段数码管的数值
  (4)可将断点设在外部中断INT0的入口和T0中断的入口运行程序观察程序运行是否正常。

结束语:
  由于C8051F020的高集成度,因此只需少量外围电路。另外,C8051F020内核与普通51系列兼容,且指令简单易学,可缩短系统开发周期。实践证明,本控制系统精度高,稳定性好,硬件简单且工作可靠,具有很好的推广价值。
 

 
相关文章:

上一页 12
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4