用單片機做的,在電機測試了可以用。就是開機的時候,會最大轉速輸出,有點噪音
單片機源程序如下:
- void Pid_regulate(void)
- {
- u8 TempError;
- u8 TempAngle;
- if(Pid_Ts != 0)
- {
- return; //采樣時間未到,退出
- }
- Pid_ts = 0x1a; //重置采樣時間
- TempError = Temp_Setting - TempOp; //溫度誤差
- Integral = Integral + Ki * TempError; //誤差* 積分增益并累加
- if(Integral > 1024)
- Integral = 1024;
- else if(Integral < -1024)
- Integral = -1024;
- TempAngle = FeedFwd_agnle(Templn,Voltage,WaterFlow);
- TempAngle = Kp * TempError;
- TempAngle = TempAngle + (Integral >> 4);//累加
- if(TempAngle < 2)
- TempAngle = 2; //下限
- else if(TempAngle > 200)
- TempAngle = 200; //上限
- Fire_angle = 200 - (u8)TempAngle; //得到觸發角
- }
- void PID(void)
- {
- float ek,ek1,ek2,ek_sum;
- uint a;
- ek=K-temp; //計算誤差
- while(1)
- {
- if(ON_OFF==1) //溫控開關開
- {
- if(ek>=15)
- {
- outflag=1;
- OUT=0;
- Time_on=100;
- break;
- } //溫差大于15度,不用PID調節
- else if(ek<0)
- {
- ek=0;
- outflag=0;
- OUT=1;
- Time_on=0;
- break;
- } //溫差小于等于0不調節
- else
- {
- if(ek>5)
- a=0;
- if(ek<5)
- a=1;
- ek2=ek1;
- ek1=ek;
- ek_sum+=ek;
- uk=kp*ek+ki*ek_sum+kd*(ek1-ek2);
- //計算PID輸出uk
- if(start_flag==0) //PID運算標志位
- {
- uk0=uk; //uk初值,用于參考以后uk加熱時間
- start_flag=1;
- div=100/uk0;
- } //開始PID計算
- else if(start_flag==1)//加熱片加熱時間
- {
- Time_on=uk*div;
- OUT=0;
- outflag=1;
- }
- break;
- }
- }
- else
- {
- outflag=0;
- OUT=1;
- break;
- } //不加熱
- }
- }
復制代碼
所有資料51hei提供下載:
Pid.rar
(861 Bytes, 下載次數: 99)
2018-9-11 20:51 上傳
點擊文件名下載附件
算法 下載積分: 黑幣 -5
|