標(biāo)題: 請問誰有直流電機轉(zhuǎn)速測量與調(diào)速這種程序例子,我想?yún)⒖紝W(xué)習(xí)下 求分享 [打印本頁]

作者: 315471593    時間: 2020-9-10 09:58
標(biāo)題: 請問誰有直流電機轉(zhuǎn)速測量與調(diào)速這種程序例子,我想?yún)⒖紝W(xué)習(xí)下 求分享
如題
作者: zuiqf1978    時間: 2020-11-8 00:25
加霍爾傳感!
作者: 幾兩    時間: 2022-12-12 13:29
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define THC0 0xf9
  6. #define TLC0 0x0f   
  7. unsigned char  code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  8. unsigned char  Data_Buffer[8]={0,0,0,0,0,0,0,0};                        

  9. uchar i=0;
  10. sbit AddSpeed=P1^1;
  11. sbit SubSpeed=P1^2;
  12. sbit TurnForward=P1^3;
  13. sbit TurnBackward=P1^4;
  14. sbit Stop=P1^5;

  15. sbit IN1=P3^0;
  16. sbit IN2=P3^1;
  17. sbit PWM_FC=P1^0;
  18. int e ,e1 ,e2 ;
  19. float uk ,uk1 ,duk ;
  20. float Kp=15,Ki=12,Kd=1.6;
  21. int out=0;
  22. uint SpeedSet=380;
  23. uint cnt=0;
  24. uint Inpluse=0,num=0;
  25. uint PWMTime=100;
  26. unsigned char  arry[];
  27. void SendString(uint ch);
  28. void PIDControl();
  29. void SystemInit();
  30. void delay(uchar x);
  31. void PWMOUT();
  32. void SetSpeed();
  33. void SegRefre();

  34. void main()
  35. {
  36.         SystemInit();
  37.         while(1)
  38.         {
  39.                 SetSpeed();               
  40.                 SegRefre();               
  41.                 PWMOUT();               

  42.         }
  43. }

  44. void PIDControl()        
  45. {
  46.         e=SpeedSet-num;                 
  47.         duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;      
  48.         uk=uk1+duk;            
  49.         out=(int)uk;   
  50.         if(out>1000)
  51.         {
  52.                 out=1000;
  53.         }
  54.         else if(out<0)
  55.         {
  56.                 out=0;
  57.         }
  58.         uk1=uk;                                 
  59.         e2=e1;
  60.         e1=e;                                 
  61.         PWMTime=out;
  62. }

  63. void delay(uchar x)
  64. {
  65.         uint i,j;
  66.         for(i=x;i>0;i--)
  67.                 for(j=50;j>0;j--);
  68. }

  69. void PWMOUT()                  
  70. {
  71.         if(cnt<PWMTime)               
  72.         {
  73.                 PWM_FC=1;
  74.         }
  75.         else
  76.         {
  77.                 PWM_FC=0;
  78.         }
  79.         if(cnt>1000) cnt=0;         
  80. }
  81. void SystemInit()
  82. {
  83.         TMOD=0X21;     
  84.         TH0=THC0;
  85.         TL0=TLC0;
  86.         TH1=0xC0;
  87.         TL1=0XC0;
  88.         ET1=1;
  89.         ET0=1;
  90.         TR0=1;
  91.         TR1=1;
  92.         EX0=1;     
  93.         IT0=1;
  94.         EA=1;
  95.         e =0;               
  96.         e1=0;
  97.         e2=0;
  98.         IN1 = 1;
  99.         IN2 = 0;
  100. }
  101. void SetSpeed()
  102. {
  103.         if(AddSpeed==0)
  104.         {
  105.                 delay(200);                          
  106.                 if(AddSpeed==0)
  107.                 {
  108.                         SpeedSet+=10;
  109.                         if(SpeedSet>1500)
  110.                         {
  111.                                 SpeedSet=1500;
  112.                         }
  113.                 }
  114.         }
  115.         if(SubSpeed==0)
  116.         {
  117.                 delay(200);
  118.                 if(SubSpeed==0)
  119.                 {
  120.                         SpeedSet-=10;
  121.                         if(SpeedSet<0) SpeedSet=0;
  122.                 }
  123.         }
  124.         if(TurnForward==0)
  125.         {
  126.                 delay(200);
  127.                 if(TurnForward==0)
  128.                 {
  129.                    IN1 = 1;
  130.                    IN2 = 0;
  131.                    while(TurnForward==0);
  132.                 }
  133.         }
  134.         if(TurnBackward==0)
  135.         {
  136.                 delay(200);
  137.                 if(TurnBackward==0)
  138.                 {
  139.                    IN1 = 0;
  140.                    IN2 = 1;
  141.                    while(TurnBackward==0);
  142.                 }
  143.         }
  144.         if(Stop==0)
  145.         {
  146.                 delay(200);
  147.                 if(Stop==0)
  148.                 {
  149.                    IN1 = 1;
  150.                    IN2 = 1;
  151.                    while(Stop==0);
  152.                 }
  153.         }

  154. }
  155. void SegRefre()                  
  156. {
  157.          Data_Buffer[0]=SpeedSet/1000;                  
  158.          Data_Buffer[1]=SpeedSet%1000/100;
  159.          Data_Buffer[2]=SpeedSet%100/10;
  160.          Data_Buffer[3]=SpeedSet%10;
  161.          Data_Buffer[4]=num/1000;                        
  162.          Data_Buffer[5]=num%1000/100;
  163.          Data_Buffer[6]=num%100/10;
  164.          Data_Buffer[7]=num%10;
  165. }

  166. void int0() interrupt 0
  167. {
  168.         Inpluse++;                    
  169. }
  170. void t0() interrupt 1
  171. {
  172.         static unsigned char Bit=0;
  173.         static unsigned int time=0;
  174.         TH0=THC0;
  175.         TL0=TLC0;


  176.         Bit++;
  177.         time++;  
  178.         if(Bit>8) Bit=0;                  
  179.         P0=0xff;
  180.         P2=Duan[Data_Buffer[Bit]];        
  181.         switch(Bit)                                       
  182.         {
  183.                 case 0:P0=0X7F;break;
  184.                 case 1:P0=0XBF;break;
  185.                 case 2:P0=0XDF;break;
  186.                 case 3:P0=0XEF;break;
  187.                 case 4:P0=0XF7;break;
  188.                 case 5:P0=0XFB;break;
  189.                 case 6:P0=0XFD;break;
  190.                 case 7:P0=0XFE;break;
  191.         }
  192.         if(time>100)
  193.         {
  194.                 time=0;
  195.                 num=Inpluse*5;                  
  196.                 Inpluse=0;                          
  197.                 PIDControl();                  
  198.         }
  199. }
  200. void timer_1()  interrupt 3
  201. {
  202.            cnt++;        
  203. }
復(fù)制代碼



作者: coody_sz    時間: 2022-12-12 21:25
普通2線有刷直流電機嗎?如果是,要求不精確,可以參考磁帶錄音機的電機穩(wěn)速電路原理,數(shù)字化PID處理就可以了,我用在各種微型鉆機、微型臺鋸等等,效果很好。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1