⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ctl.lst

📁 实现PID算法的C语言程序
💻 LST
字号:
C51 COMPILER V7.50   CTL                                                                   11/10/2008 15:53:31 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE CTL
OBJECT MODULE PLACED IN CTL.OBJ
COMPILER INVOKED BY: E:\II\Software\Keil\C51\BIN\C51.EXE CTL.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /*
   3          ****************************************************
   4          
   5                          
   6          ****************************************************
   7          */
   8          
   9          
  10          #include <reg52.H>
  11          #include <rtx51tny.h>
  12          
  13          #include "Typedef.H"
  14          #include "UserDef.H"
  15          
  16          #include "disp.h"
  17          #include "LTC1860.h"
  18          #include <math.h>
  19          
  20          /*  */
  21          #define T_SELECT        100             // 采样周期
  22          #define T_DRV           100             // 控制驱动输出周期
  23          
  24          #define ADSET 1500
  25          
  26          /*  私有全局变量 */
  27          static INT8U sig_targ;          // 显示任务的任务号
  28          
  29          static xdata float Kp=1;                        // PID 系数 
  30          static xdata float Ki=0.1;                      // PID 系数      Kp*Ts/Ti
  31          static xdata float Kd=1;                        // PID 系数      Kp*Td/Ts       
  32          
  33          static xdata float Yn=0;                        // PID Yn
  34          static xdata float SumE=0;                      
  35          
  36          /* 端口 */
  37          sbit P_Drv = P3^0;                      // 输出端口
  38          
  39          
  40          void PID(INT32U ADCur,INT32U ADSet);
  41          
  42          /***************************************************
  43          
  44                          
  45          
  46          ****************************************************/
  47          static void TaskCTL(void) _task_ TASK_CTL
  48          { 
  49   1              INT32S ni;
  50   1              INT16U ADn;
  51   1      
  52   1              /* 显示界面固定文字显示 */
  53   1              DISP_REQ;
  54   1              dm.x = 0;
  55   1              dm.y = 0;
C51 COMPILER V7.50   CTL                                                                   11/10/2008 15:53:31 PAGE 2   

  56   1              dm.font = 1;
  57   1              dm.DData = "Set=";                //
  58   1              dm.type = DTYPE_STR;
  59   1              os_send_signal(sig_targ);
  60   1      
  61   1              DISP_REQ;
  62   1              dm.x = 2;
  63   1              dm.y = 0;
  64   1              dm.font = 1;
  65   1              dm.DData = "Cur=";                //
  66   1              dm.type = DTYPE_STR;
  67   1              os_send_signal(sig_targ);
  68   1      
  69   1              while (1) 
  70   1              {       
  71   2                      os_wait(K_TMO,T_SELECT,0);      //采样周期
  72   2      
  73   2                      /* 采样 */
  74   2                      ADn = LTC1860();
  75   2      
  76   2                      DISP_REQ;
  77   2                      dm.x = 0;
  78   2                      dm.y = 50;
  79   2                      dm.font = 1;
  80   2                      ni = ADSET;
  81   2                      dm.DData = &ni;
  82   2                      dm.len = 4;
  83   2                      dm.type = DTYPE_INT32S;
  84   2                      os_send_signal(sig_targ);
  85   2      
  86   2                      DISP_REQ;
  87   2                      dm.x = 2;
  88   2                      dm.y = 50;
  89   2                      dm.font = 1;
  90   2                      ni = ADn;
  91   2                      dm.DData = &ni;
  92   2                      dm.len = 4;
  93   2                      dm.type = DTYPE_INT32S;
  94   2                      os_send_signal(sig_targ);
  95   2      
  96   2                      PID(ADn,ADSET);
  97   2      
  98   2                      DISP_REQ;
  99   2                      dm.x = 4;
 100   2                      dm.y = 50;
 101   2                      dm.font = 1;
 102   2                      dm.DData = &Yn;
 103   2                      dm.len = 4;
 104   2                      dm.type = DTYPE_FLOAT;
 105   2                      os_send_signal(sig_targ);
 106   2      
 107   2              }
 108   1      } 
 109          
 110          /***************************************************
 111          
 112                          
 113          
 114          ****************************************************/
 115          static void TaskDRV(void) _task_ TASK_DRV
 116          { 
 117   1              INT8U tOut;
C51 COMPILER V7.50   CTL                                                                   11/10/2008 15:53:31 PAGE 3   

 118   1      
 119   1              P_Drv = 1;
 120   1      
 121   1              while (1) 
 122   1              {       
 123   2                      P_Drv = 0;
 124   2                      tOut = (INT8U)(Yn * T_DRV);
 125   2                      os_wait(K_TMO,tOut,0);                  //
 126   2                      
 127   2                      P_Drv = 1;
 128   2                      os_wait(K_TMO,T_DRV - tOut,0);  //
 129   2              }
 130   1      } 
 131          
 132          
 133          /***************************************************
 134          
 135                          任务创建函数
 136          
 137                          signal_target_task       接收键盘信号的任务编号
 138          
 139          ****************************************************/
 140          void TaskCreate_CTL(INT8U signal_target_task)
 141          {
 142   1              sig_targ = signal_target_task;
 143   1              os_create_task(TASK_CTL);
 144   1              os_create_task(TASK_DRV);
 145   1      }
 146          
 147          
 148          
 149          
 150          /***************************************************
 151          
 152                          
 153          
 154          
 155          
 156          ****************************************************/
 157          void PID(INT32U ADCur,INT32U ADSet)
 158          {
 159   1              xdata float Uk;
 160   1              xdata float Ek;
 161   1              xdata INT32S dlt;
 162   1              static xdata float Ek_1;
 163   1              
 164   1              dlt =  (INT32S)ADSet - (INT32S)ADCur;   
 165   1              Ek = (float)dlt;        
 166   1              
 167   1              //PID运算
 168   1              SumE += Ek;
 169   1                      
 170   1              // 抗积分饱和(积分分离)
 171   1              if (abs(dlt) > 200)
 172   1              {
 173   2                      SumE = 0;               //积分遗忘
 174   2              }
 175   1      
 176   1              Uk = Kp*Ek + Ki*SumE + Kd*(Ek-Ek_1);
 177   1      
 178   1              //饱和限幅
 179   1              if (Uk > 100)
C51 COMPILER V7.50   CTL                                                                   11/10/2008 15:53:31 PAGE 4   

 180   1                      Uk = 100;
 181   1              else if (Uk < 0)
 182   1                      Uk = 0;
 183   1      
 184   1              Ek_1 = Ek;
 185   1              Yn = Uk/100.0;
 186   1      }
 187          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    759    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =     24      12
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -