找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6321|回复: 0
收起左侧

经典的电机的速度PID控制源程序(运用了TI的DMC)

[复制链接]
ID:276077 发表于 2018-1-15 10:42 | 显示全部楼层 |阅读模式
这是使用了TI芯片的一个经典的电机控制PID程序,初学者可以看看学习一下电机控制的理论。大神也可以提出自己的意见和见解哦。
0.png

单片机源程序如下:
  1. #include "2407bit.h"
  2. #include "2407c.h"
  3. #include "2407e.h"
  4. #include "Pid_reg1.h"
  5. #include "display.h"
  6. #include "Speed_Reg.h"
  7. #include "Postion_reg.h"
  8. void IoInit(void);
  9. void KeyScan(void);
  10. unsigned int TimeFlag;
  11. unsigned int dispclk=0;
  12. unsigned int StopKeyCnt=0;
  13. unsigned int KeyFlag[5]={0,0,0,0,0};
  14. unsigned int KeyCnt[5]={0,0,0,0,0};
  15. enum KeyTable {SW,ADD,SUB,XIN1,XIN2};
  16. PIDREG1 pid0 = PIDREG1_DEFAULTS;
  17. SPEEDPID speed0={
  18.                         &pid0,                //Point to PID calc
  19.                                 0,                //Speed Freeback
  20.                                 0x01ff,        //Init speed
  21.                                 0x100,        //Speed
  22.                                 (void (*)(int))EVA_PWM1_Init,        //Function for init
  23.                                 (void (*)(int))EVA_PWM1_Updata        //Function for updata
  24.                         };

  25. POSTIONPID        postion0={
  26.                                          &speed0,                        //Speed Reg
  27.                                          0,                                        //Absolute postion
  28.                                          0xfffff,                        //Reference input
  29.                                          0,                                        //Free back        input
  30.                                          0,                                        //Postion Reg Output
  31.                                          0x10,                                //Speed
  32.                                          1023,                                //Max Speed
  33.                                          -1023,                                //Min Speed
  34.                                          0,                                        //E1
  35.                                          0,                                        //E2
  36.                                          130,                                //Kp
  37.                                          250,                                //Ki
  38.                                          0,                                        //Kd
  39.                                          (int (*)(int))PostionPid        //Updata Function
  40.                         };
  41. main()
  42. {
  43.         unsigned int Led;
  44.         asm(" SETC INTM");                //Disable all the interrupt
  45.         asm(" SETC SXM");                //Disable sign extend
  46.         asm(" CLRC OVM");                //Overflow normally
  47.         asm(" CLRC CNF");                //B0 served as data ram
  48.         *SCSR1=0x81FE;                        //CLKOUT is Dsp's Clk Clk=OscX4                                        
  49.         *WDCR=0x00E8;                        //Wacth dog disable
  50.         *IMR=0x0032;                        //Enable INT2 INT6 INT5
  51.         *IFR=0xFFFF;
  52.         IoInit();
  53.         DispInit();
  54.         speed0.init();
  55.         T3Init();
  56.        

  57.         asm(" CLRC SXM");
  58.         asm(" CLRC INTM");
  59.         while(KeyCnt[ADD]<5)
  60.         {
  61.           TimeFlag=0;
  62.           StopKeyCnt=0;
  63.           if(dispclk==25)
  64.           {
  65.           Led=(*PCDATDIR)&0x0001;        //Change Led
  66.           Led=Led^0x0001;
  67.           *PCDATDIR=(*PCDATDIR&0xfffe)|Led;       
  68.           //Display(postion0.PostionF);
  69.           Display(speed0.Qep_F);
  70.           dispclk=0;
  71.           }                     
  72.           //postion0.Updata(&postion0);
  73.           speed0.updata(&speed0);
  74.           KeyScan();
  75.           while(!TimeFlag);
  76.         }       
  77.        
  78.        
  79.         while(1)
  80.         {
  81.           StopKeyCnt=0;
  82.           TimeFlag=0;
  83.           if(dispclk==25)
  84.           {
  85.           Led=(*PCDATDIR)&0x0001;        //Change Led
  86.           Led=Led^0x0001;
  87.           *PCDATDIR=(*PCDATDIR&0xfffe)|Led;       
  88.           Display(postion0.PostionF);
  89.           //Display(speed0.Qep_F);
  90.           dispclk=0;
  91.           }                     
  92.           postion0.Updata(&postion0);
  93.           //speed0.updata(&speed0);
  94.           
  95.           KeyScan();
  96.           if(KeyCnt[XIN1]>4)
  97.                   {
  98.                    postion0.Speed=0;
  99.                    postion0.PostionR=postion0.PostionF;}
  100.           while(!TimeFlag);
  101.         }       
  102.        





  103. }
  104. void interrupt gisr2 (void)
  105. {
  106.         switch ((*PIVR))
  107.         {
  108.          case 0x002F  :
  109.                  {
  110.                          (*EVBIFRA)|=1<<T1PINT;                //Clear interrupt flag
  111.                          (*T3CNT)=0x0000;
  112.                        
  113.                          speed0.Qep_F=*T4CNT;
  114.                          postion0.PostionF+=(int)*T4CNT;
  115.                          //*T2CNT=0;
  116.                          *T4CNT=0;
  117.                          dispclk++;
  118.                          TimeFlag=1;
  119.                                                         
  120.                  }
  121.                  break;
  122.          }
  123.        
  124. }



  125. void interrupt gisr5(void)
  126. {
  127.         /*int temp;
  128.         temp=0;
  129.         switch(*PIVR)
  130.         {
  131.                 case 0x0006:                //RX中断
  132.                         {
  133.                                 temp=*SCIRXBUF;
  134.                                 if(!((*SCICTL1)&0x04))
  135.                                 {
  136.                                         //rxd data
  137.                                         *(RxdBuf+RxdIndex)=temp;
  138.                                           RxdIndex++;
  139.                                         if(RxdIndex==RxdNum)
  140.                                          {
  141.                                                  RxdIndex=0;
  142.                                                  *SCICTL1=0x0037;       
  143.                                          }
  144.                                                 
  145.                                 }
  146.                                
  147.                                 else if(temp==TxdAdd)
  148.                                 {
  149.                                         //txd data
  150.                                         //txd enable
  151.                                         *SCICTL2=((*SCICTL2)|0x0001)&0xfffd;                //发送中断使能
  152.                                         (*PFDATDIR)|=(1<<EN485);                                        //485 发送使能
  153.                                         *SCITXBUF=*(TxdBuf+TxdIndex);
  154.                                         TxdIndex++;
  155.                                 }
  156.                                 else if(temp==RxdAdd)
  157.                                          *SCICTL1=0x0033;
  158.                          }
  159.                          break;
  160.                  case 0x0007:                //TX中断               
  161.                         {
  162.                         //txd data
  163.                                 if(TxdIndex<(TxdNum+1))
  164.                                 {
  165.                                         *SCITXBUF=*(TxdBuf+TxdIndex);
  166.                                         TxdIndex++;
  167.                                 }
  168.                                 else
  169.                                 {
  170.                                         TxdIndex=0;
  171.                                         *SCICTL2=(*SCICTL2&0x0fffe)|0x0002;        //接收中断使能
  172.                                                                        
  173.                                         (*PFDATDIR)&=~(1<<EN485);                        //485 接收使能
  174.                                        
  175.                                 }       
  176.                         }
  177.                         break;
  178.                 default:break;
  179.                
  180.         }*/
  181. }

  182. void interrupt gisr6(void)
  183. {
  184. /*        int        i;
  185.         switch(*PIVR)
  186.         {
  187.                 case 0x0004:                                //AD中断
  188.                         {
  189.                        
  190.                                 *EVBIFRA=1<<T1UFINT;                //Clear T1UFINT interrupt       
  191.                                 (*ADCTRL2)|=0x0002;                        //Clear AD interrupt
  192.                                 for(i=0;i<8;i++)
  193.                                  AdValue[i]=*(RESULT8+i)>>6;
  194.                          }
  195.                          break;
  196.         }*/                         
  197. }
  198. void IoInit(void)
  199. {
  200.         (*MCRA)&=~((1<<IN_DSP0)|(1<<IN_DSP1)|(1<<IN_DSP2)|(1<<IN_DSP3)|(1<<IN_DSP4)|(1<<IN_DSP5)|(1<<IN_DSP6)|(1<<IN_DSP7));
  201.         (*MCRB)&=~(1<<IOPC0);
  202.         (*MCRC)&=~((1<<OUT_DSP0)|(1<<OUT_DSP1)|(1<<OUT_DSP2)|(1<<OUT_DSP3)|(1<<OUT_DSP4)|(1<<OUT_DSP5)|(1<<OUT_DSP6)|(1<<OUT_DSP7));
  203.         (*PADATDIR)&=~(IN_DSP0+8);
  204. ……………………

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

所有资料51hei提供下载:
经典的电机的速度PID控制程序(运用了TI的DMC).rar (71.38 KB, 下载次数: 60)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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