找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6183|回复: 4
收起左侧

单片机PID控制直流电机转动源程序

  [复制链接]
ID:228436 发表于 2017-8-19 22:06 | 显示全部楼层 |阅读模式
0.png
51单片机利用pid技术控制直流马达的源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<lcd.h>
  4. /***定义变量***/
  5. sbit PWM_EN=P1^0; //接ln298使能端
  6. sbit speed_in=P3^2;
  7. //int e ,e1 ,e2 ;//pid 偏差
  8. //float uk ,uk1 ,duk ;//pid输出值
  9. //float Kp=10,Ki=12,Kd=1.6;//pid控制系数        10,12,1.5
  10. //float vv_min=0.0;vv_max=250.0;
  11. float bianhuasudu;                              //当前速度(理论计算值)
  12. float vi_Ref=60.0;                              //给定值
  13. float vi_PreError,vi_PreDerror;
  14. float v_kp=10,v_ki=12,v_kd=1.6;               //比例,积分,微分常数
  15. int out=0;
  16. extern uint SpeedSet;
  17. extern uint Inpluse,num;//脉冲计数
  18. //static unsigned int time=0;//静态变量,退出程序值保留
  19. uint cnt=0;
  20. uint PWMTime=100;//脉冲宽度,128/256=0.5,占空比是50%(8位pwm)
  21. /**函数声明**/
  22. PIDControl();
  23. void SystemInit();
  24. void PWMOUT();

  25. /**************主函数************/
  26. void main()
  27. {
  28.         SystemInit();
  29.         LcdInit();          //初始化
  30.         Lcd_busy_check();//忙检测
  31.         while(1)
  32.         {
  33.                 Lcd_display();        //显示
  34.                 SetSpeed();                //速度设定
  35.                 PWMOUT();                //pwm输出
  36.                
  37.         }
  38. }
  39. /*pid_control*/
  40. float pid_control (float SpeedSet,float num)       //pid偏差计算
  41. {
  42.         register float error1,d_error,dd_error;
  43.     error1=SpeedSet-num;                 //偏差的计算
  44.     d_error=error1-vi_PreError;                 //误差的偏差
  45.     dd_error=d_error-vi_PreDerror;              //误差变化率
  46.     vi_PreError=error1;                         //存储当前偏差
  47.     vi_PreDerror=d_error;
  48.     bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
  49.     return (bianhuasudu);
  50.         
  51.         
  52. }


  53. void PWMOUT()
  54. {
  55.         if(cnt<PWMTime)
  56.         {
  57.                 PWM_EN=1;
  58.         }
  59.         else
  60.         {
  61.                  PWM_EN=0;
  62.         }
  63.         if(cnt>1000) cnt=0;
  64. }

  65. void SystemInit()
  66. {

  67.          TMOD=0x15;//设置定时计数器工作于方式1;

  68.          TH1=(65536-1000)>>8;
  69.          TL1=(65536-1000);//定时1000us,即1ms
  70.          TR1=1;//启动定时计数器0
  71.          ET1=1;//使能定时计数器0中断
  72.          ET0=1;//启动定时器计数器1
  73.          TR0=1;//使能定时计数器1中断
  74.          EX0=1;     //中断0用来测量转速
  75.          IT0=1;           //外部中断0 低电平触发
  76.          EA=1;//中断总开关
  77. }

  78. void int0() interrupt 0
  79. {
  80.         Inpluse++;                   //脉冲计数
  81. }

  82. void t1() interrupt 3
  83. {        
  84.         static unsigned int time=0;//静态变量,退出程序值保留
  85.         //TR1=0;
  86.     TH1=(65536-1000)/256;
  87.     TL1=(65536-1000)%256;//定时1000us,即1ms
  88.         time++;  //转速测量周期
  89.         if(time>100)
  90.         {
  91.                 time=0;
  92.             num=Inpluse*6.5;         //计算速度
  93.         PWMTime=PWMTime+pid_control(SpeedSet,num);
  94.                 Inpluse=0;               
  95. ……………………

  96. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
pid.rar (38.42 KB, 下载次数: 179)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表