根據實際轉速來穩(wěn)定調節(jié)到目標轉速
51hei.png (25.53 KB, 下載次數: 53)
下載附件
2020-12-22 14:57 上傳
51hei.png (25.01 KB, 下載次數: 45)
下載附件
2020-12-22 14:59 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define THC0 0xf9
- #define TLC0 0x0f //2ms
- unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰極數碼管,0-9段碼表
- unsigned char Data_Buffer[8]={0,0,0,0,0,0,0,0};
-
- uchar i=0;
- sbit AddSpeed=P1^1;
- sbit SubSpeed=P1^2;
- sbit PWM_FC=P1^0;
- int e ,e1 ,e2 ;//pid 偏差
- float uk ,uk1 ,duk ;//pid輸出值
- float Kp=10,Ki=12,Kd=1.6;//pid控制系數 10,12,1.5
- int out=0;
- uint SpeedSet=380;
- uint cnt=0;
- uint Inpluse=0,num=0;//脈沖計數
- uint PWMTime=100;//脈沖寬度
- unsigned char arry[];
- void SendString(uint ch);
- void PIDControl();
- void SystemInit();
- void delay(uchar x);
- void PWMOUT();
- void SetSpeed();
- void SegRefre();
- /**************主函數************/
- void main()
- {
- SystemInit();
- while(1)
- {
- SetSpeed();
- SegRefre();
- PWMOUT();
-
- }
- }
- void PIDControl() //pid偏差計算
- {
- e=SpeedSet-num;
- duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50; //+Kd*(e-2e1+e2)
- uk=uk1+duk;
- out=(int)uk;
- if(out>1000)
- {
- out=1000;
- }
- else if(out<0)
- {
- out=0;
- }
- uk1=uk;
- e2=e1;
- e1=e;
- PWMTime=out;
- }
- void delay(uchar x)
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=50;j>0;j--);
- }
- void PWMOUT()
- {
- if(cnt<PWMTime)
- {
- PWM_FC=1;
- }
- else
- {
- PWM_FC=0;
- }
- if(cnt>1000) cnt=0;
- }
- void SystemInit()
- {
- TMOD=0X21;
- TH0=THC0;
- TL0=TLC0;
- TH1=0xC0;
- TL1=0XC0;
- ET1=1;
- ET0=1;
- TR0=1;
- TR1=1;
- EX0=1; //中斷0用來測量轉速
- IT0=1;
- EA=1;
- e =0;
- e1=0;
- e2=0;
- }
- void SetSpeed()
- {
- if(AddSpeed==0)
- {
- delay(200);
- if(AddSpeed==0)
- {
- SpeedSet+=10;
- if(SpeedSet>1500)
- {
- SpeedSet=1500;
- }
- }
- }
- if(SubSpeed==0)
- {
- delay(200);
- if(SubSpeed==0)
- {
- SpeedSet-=10;
- if(SpeedSet<0) SpeedSet=0;
- }
- }
- }
- void SegRefre() //顯示刷新
- {
- Data_Buffer[0]=SpeedSet/1000;
- Data_Buffer[1]=SpeedSet%1000/100;
- Data_Buffer[2]=SpeedSet%100/10;
- Data_Buffer[3]=SpeedSet%10;
- Data_Buffer[4]=num/1000;
- Data_Buffer[5]=num%1000/100;
- Data_Buffer[6]=num%100/10;
- Data_Buffer[7]=num%10;
- }
- void int0() interrupt 0
- {
- Inpluse++;
- }
- void t0() interrupt 1
- {
- static unsigned char Bit=0;//靜態(tài)變量,退出程序值保留
- static unsigned int time=0;
- // static unsigned int aa=0;
- TH0=THC0;
- TL0=TLC0;
- // aa++;
- // if(aa==50)
- // {
- // aa=0;
- //// flag0=1;
- // }
-
- Bit++;
- time++; //轉速測量周期
- if(Bit>8) Bit=0;
- P0=0xff;
- P2=Duan[Data_Buffer[Bit]];
- switch(Bit)
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
案列1 PID自動控制電機轉速.zip
(75.46 KB, 下載次數: 187)
2020-12-22 09:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|