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

📄 system.lst

📁 直流电机的闭环控制c51 原代码
💻 LST
字号:
C51 COMPILER V7.06   SYSTEM                                                                05/13/2005 02:59:37 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE SYSTEM
OBJECT MODULE PLACED IN system.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil20\C51\BIN\C51.EXE system.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   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   1                TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
  34   1            PCON=0x00;
  35   1            TF0=0; 
  36   1            TH0=timer_data;   //保证定时时长为0.01ms
  37   1            TL0=TH0;
  38   1                TH1=timer_data;   //保证定时时长为0.01ms
  39   1            TL1=TH0;
  40   1            ET0=1;            //定时器0中断允许
  41   1                TR0=1;            //定时器0开始计数
  42   1                ET1=1;            //定时器1中断允许
  43   1                TR1=1;            //定时器1开始计数
  44   1            EA=1;             //中断允许
  45   1                }
  46          //--------------------------------------------------------------------------------------------------
  47          // 函数名称: INT0_init()
  48          // 函数功能: 初始化设置
  49          //            设定INT0的工作方式
  50          //--------------------------------------------------------------------------------------------------
  51          void INT0_init(void )  
  52                       {
  53   1                               pulseB_count=0;        //脉冲计数器清零
  54   1                    IT0=1;     //选择INT0为沿触发方式
  55   1                    EX0=1;     //外部中断允许
C51 COMPILER V7.06   SYSTEM                                                                05/13/2005 02:59:37 PAGE 2   

  56   1                    EA=1;      //系统中断允许
  57   1                    }
  58          //--------------------------------------------------------------------------------------------------
  59          // 函数名称:setting_PWM
  60          // 函数功能:设置PWM的脉冲宽度和设定方向
  61          //--------------------------------------------------------------------------------------------------
  62          void setting_PWM()
  63                {
  64   1              // direction=1;  //设定转动方向
  65   1              // R=540;        //设定转速
  66   1              // dR=0;         //转速补偿为零
  67   1              // calculate_PWM_t();      //重新计算脉宽
  68   1                }
  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   1                                 if(compensate_polarity==1) //正补偿
  78   1                     PWM_t=(R+dR)/150;
  79   1                                 else
  80   1                                  PWM_t=(R-dR)/150;        //负修正
  81   1                                 }
  82          //--------------------------------------------------------------------------------------------------
  83          // 函数名称: calculate_Rr
  84          // 入口参数: pulseB_count脉冲计数
  85          // 出口参数: Rr直流电机实际转速
  86          // 函数功能: 计算实际转速
  87          //--------------------------------------------------------------------------------------------------
  88          void calculate_Rr()
  89                        {
  90   1                     Rr=pulseB_count/6;
  91   1                                 }
  92          //--------------------------------------------------------------------------------------------------
  93          // 函数名称: compensate_dR
  94          // 入口参数: Rr直流电机实际转速
  95          //            R需要得到的直流电机转速
  96          // 出口参数: dR转速补偿
  97          // 函数功能: 计算实际补偿值和补偿极性 ,根据不同的补偿算法重新设计
  98          //--------------------------------------------------------------------------------------------------
  99          void compensate_Rr()
 100                        {
 101   1                    Rr=1;
 102   1                    if(Rr>R)
 103   1                                 compensate_polarity=0;     //补偿极性
 104   1                                else 
 105   1                     compensate_polarity=1;
 106   1                                 }
 107          //--------------------------------------------------------------------------------------------------
 108          // 函数名称: INT0_intrupt
 109          // 函数功能: 外部中断0处理程序
 110          //--------------------------------------------------------------------------------------------------
 111          void INT0_intrupt() interrupt 0 using 1
 112                  {
 113   1                      pulseB_count++;
 114   1              if(pulse_A==0)
 115   1                {   
 116   2                real_direction=1;  //若P1.2为低电平,则电机为正转,计数器N的值加1
 117   2                }
C51 COMPILER V7.06   SYSTEM                                                                05/13/2005 02:59:37 PAGE 3   

 118   1              else                //若为高电平,则电机为反转,计数器N值减l。
 119   1                 {
 120   2                  real_direction=1;
 121   2                }
 122   1      }
 123          //--------------------------------------------------------------------------------------------------
 124          // 函数名称:IntTimer0
 125          // 函数功能:定时器中断处理程序
 126          //--------------------------------------------------------------------------------------------------
 127          void IntTimer0() interrupt 1
 128                        {
 129   1                                time0_count++;
 130   1                    DR=direction;
 131   1                                if(time0_count>=PWM_T)
 132   1                    {
 133   2                                time0_count=0;
 134   2                                PWM_count++;
 135   2                                setting_PWM();  //每输出一个PWM波调用一次
 136   2                                }
 137   1                                if(time0_count<PWM_t)
 138   1                                PWM=1;
 139   1                                else 
 140   1                                PWM=0;
 141   1                                }
 142          //--------------------------------------------------------------------------------------------------
 143          // 函数名称:IntTimer1
 144          // 函数功能:定时器中断处理程序
 145          //--------------------------------------------------------------------------------------------------
 146          void IntTimer1() interrupt 3
 147                        {
 148   1                                time1_count++;
 149   1                                if(time1_count==1)
 150   1                    {
 151   2                                INT0_init();           //初始化外部中断设置
 152   2                                }
 153   1                                if(time1_count>=Ts)
 154   1                                {
 155   2                                time1_count=0;          //一个补偿周期结束,计数器清零
 156   2                                calculate_Rr();         //计算实际转速
 157   2                                compensate_Rr();        //计算实际补偿值和补偿极性
 158   2                                calculate_PWM_t();      //重新计算脉宽
 159   2                                }
 160   1                                }
 161          //--------------------------------------------------------------------------------------------------
 162          // 函数名称:main
 163          // 用户主函数
 164          // 函数功能:主函数
 165          //--------------------------------------------------------------------------------------------------
 166          void main()
 167               {
 168   1           direction=1;  //设定转动方向
 169   1               R=540;        //设定转速
 170   1               dR=0;         //转速补偿为零
 171   1               calculate_PWM_t();      //重新计算脉宽
 172   1               timer_init();
 173   1               }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    200    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
C51 COMPILER V7.06   SYSTEM                                                                05/13/2005 02:59:37 PAGE 4   

   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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