网站导航: 首页 > 设计参考 > 正文 文章搜索
单片机驱动直流电机C语言源代码
 
文章编号:
090106141055
文章分类: 电路 电机驱动
点 击:
...
关 键 词: 直流电机
文章来源:
网络
摘 要:

直流电机闭环控制Keil c51源代码

 
  1. //-----------------------函数声明,变量定义--------------------------------------------------------   
  2. #include <reg51.h>   
  3. sbit INT_0 =P3^2;              // 将p3.2外部中断0   
  4. sbit pulse_A=P1^2;               // P1.2为脉冲A输入   
  5. sbit PWM=P1^0;                   //PWM波形输出    
  6. sbit DR=P1^1;                    //方向控制   
  7. //-----------------------预定义值--------------------------------------------------------   
  8. #define PWM_T 1800              //定义PWM的周期T为18ms   
  9. #define Ts    1000              //定义光电编码器采样时间为10ms   
  10. #define  timer_data  (256-10) //定时器预置值,12M时钟是,定时0.01ms   
  11. //-----------------------预设定值--------------------------------------------------------   
  12. bit direction;                  //方向标志位               用户设定   
  13. unsigned char R;                //需要得到的直流电机转速   用户设定   
  14. //-----------------------实际运行状态--------------------------------------------------------   
  15. bit real_direction;             //电机实际运行方向      
  16. unsigned char Rr;               //直流电机实际转速   
  17. //-----------------------计算所得补偿状态------------------------------------------   
  18. bit    compensate_polarity;     //补偿极性   
  19. unsigned char dR;               //转速补偿   
  20. //-----------------------经补偿后得到的脉宽------------------------------------------   
  21. unsigned char PWM_t;            //PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms   
  22. unsigned char PWM_count;        //输出PWM周期计数   
  23. //-----------------------各中间计数值------------------------------------------   
  24. unsigned char pulseB_count;     //脉冲计数   
  25. unsigned char time0_count;      //定时计数   
  26. unsigned char time1_count;      //定时计数   
  27. //--------------------------------------------------------------------------------------------------   
  28. // 函数名称:timer_init   
  29. // 函数功能:初始化设置定时器   
  30. //--------------------------------------------------------------------------------------------------   
  31. void timer_init()   
  32. {   
  33.     TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */  
  34.     PCON=0x00;   
  35.     TF0=0;    
  36.     TH0=timer_data;   //保证定时时长为0.01ms   
  37.     TL0=TH0;   
  38.     TH1=timer_data;   //保证定时时长为0.01ms   
  39.     TL1=TH0;   
  40.     ET0=1;            //定时器0中断允许   
  41.     TR0=1;            //定时器0开始计数   
  42.     ET1=1;            //定时器1中断允许   
  43.     TR1=1;            //定时器1开始计数   
  44.     EA=1;             //中断允许   
  45. }   
  46. //--------------------------------------------------------------------------------------------------   
  47. // 函数名称: INT0_init()   
  48. // 函数功能: 初始化设置   
  49. //            设定INT0的工作方式   
  50. //--------------------------------------------------------------------------------------------------   
  51. void INT0_init(void )     
  52. {   
  53.     pulseB_count=0;        //脉冲计数器清零   
  54.     IT0=1;     //选择INT0为沿触发方式   
  55.     EX0=1;     //外部中断允许   
  56.     EA=1;      //系统中断允许   
  57. }   
  58. //--------------------------------------------------------------------------------------------------   
  59. // 函数名称:setting_PWM   
  60. // 函数功能:设置PWM的脉冲宽度和设定方向   
  61. //--------------------------------------------------------------------------------------------------   
  62. void setting_PWM()   
  63. {   
  64.     // direction=1;  //设定转动方向   
  65.     // R=540;        //设定转速   
  66.     // dR=0;         //转速补偿为零   
  67.     // calculate_PWM_t();      //重新计算脉宽   
  68. }   
  69. //--------------------------------------------------------------------------------------------------   
  70. // 函数名称: calculate_PWM_t   
  71. // 入口参数: R需要得到的直流电机转速,dR转速补偿   
  72. // 出口参数: PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms   
  73. // 函数功能: 计算脉冲宽度,PWM_t=R/150;   
  74. //--------------------------------------------------------------------------------------------------   
  75. void calculate_PWM_t()   
  76. {   
  77.     if(compensate_polarity==1) //正补偿   
  78.         PWM_t=(R+dR)/150;   
  79.     else  
  80.         PWM_t=(R-dR)/150;        //负修正   
  81. }   
  82. //--------------------------------------------------------------------------------------------------   
  83. // 函数名称: calculate_Rr   
  84. // 入口参数: pulseB_count脉冲计数   
  85. // 出口参数: Rr直流电机实际转速   
  86. // 函数功能: 计算实际转速   
  87. //--------------------------------------------------------------------------------------------------   
  88. void calculate_Rr()   
  89. {   
  90.     Rr=pulseB_count/6;   
  91. }   
  92. //--------------------------------------------------------------------------------------------------   
  93. // 函数名称: compensate_dR   
  94. // 入口参数: Rr直流电机实际转速   
  95. //            R需要得到的直流电机转速   
  96. // 出口参数: dR转速补偿   
  97. // 函数功能: 计算实际补偿值和补偿极性 ,根据不同的补偿算法重新设计   
  98. //--------------------------------------------------------------------------------------------------   
  99. void compensate_Rr()   
  100. {   
  101.     Rr=1;   
  102.     if(Rr>R)   
  103.         compensate_polarity=0;     //补偿极性   
  104.     else    
  105.         compensate_polarity=1;   
  106. }   
  107. //--------------------------------------------------------------------------------------------------   
  108. // 函数名称: INT0_intrupt   
  109. // 函数功能: 外部中断0处理程序   
  110. //--------------------------------------------------------------------------------------------------   
  111. void INT0_intrupt() interrupt 0 using 1   
  112. {   
  113.     pulseB_count++;   
  114.     if(pulse_A==0)   
  115.     {      
  116.         real_direction=1;  //若P1.2为低电平,则电机为正转,计数器N的值加1   
  117.     }   
  118.     else                //若为高电平,则电机为反转,计数器N值减l。   
  119.     {   
  120.         real_direction=1;   
  121.     }   
  122. }   
  123. //--------------------------------------------------------------------------------------------------   
  124. // 函数名称:IntTimer0   
  125. // 函数功能:定时器中断处理程序   
  126. //--------------------------------------------------------------------------------------------------   
  127. void IntTimer0() interrupt 1   
  128. {   
  129.     time0_count++;   
  130.     DR=direction;   
  131.     if(time0_count>=PWM_T)   
  132.     {   
  133.         time0_count=0;   
  134.         PWM_count++;   
  135.         setting_PWM();  //每输出一个PWM波调用一次   
  136.     }   
  137.     if(time0_count<PWM_t)   
  138.         PWM=1;   
  139.     else    
  140.         PWM=0;   
  141. }   
  142. //--------------------------------------------------------------------------------------------------   
  143. // 函数名称:IntTimer1   
  144. // 函数功能:定时器中断处理程序   
  145. //--------------------------------------------------------------------------------------------------   
  146. void IntTimer1() interrupt 3   
  147. {   
  148.     time1_count++;   
  149.     if(time1_count==1)   
  150.     {   
  151.         INT0_init();           //初始化外部中断设置   
  152.     }   
  153.     if(time1_count>=Ts)   
  154.     {   
  155.         time1_count=0;          //一个补偿周期结束,计数器清零   
  156.         calculate_Rr();         //计算实际转速   
  157.         compensate_Rr();        //计算实际补偿值和补偿极性   
  158.         calculate_PWM_t();      //重新计算脉宽   
  159.     }   
  160. }   
  161. //--------------------------------------------------------------------------------------------------   
  162. // 函数名称:main   
  163. // 用户主函数   
  164. // 函数功能:主函数   
  165. //--------------------------------------------------------------------------------------------------   
  166. void main()   
  167. {   
  168.     direction=1;  //设定转动方向   
  169.     R=540;        //设定转速   
  170.     dR=0;         //转速补偿为零   
  171.     calculate_PWM_t();      //重新计算脉宽   
  172.     timer_init();   
  173. }   
  174.   

 

 
相关文章:

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




 
  查看更多...  

 

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