『壹』 單片機如何控制電機轉速
利用單片機的定時器TIMER_A(TA)中斷產生脈沖信號,通過在響應的中斷程序中實現步進電機步數和圈數的准確計數,通過PWM實現轉速控制。
可以利用P10埠的中斷關閉TA中斷程序,並推入堆棧,停止電機;P11中斷則開啟TA中斷,堆棧推入程序計器(PC),開啟電機。
P31埠輸出高電平由PMM8713的U/D埠控制電機的轉向;P3.0~P37埠接8279的8個數據介面。
單片機掃描到矩陣鍵盤有鍵按下時,利用P2埠的中斷設置TA,控制啟停、調速和轉向等,同時單片機反饋給8279控制LED管顯示轉速和轉向。
(1)單片機控制轉速pid擴展閱讀
1、單片機所接收到控制命令暫存在RXBUFFER中,與存儲在片內Flash的中斷程序的入口地址相比較,相同就進入中斷,實現步進電機的控制。
2、當P1.0中為高電平時,其內部三極體導通,使電機轉動。當P1.0為低電平時,內部三極體截止,電路斷開,電機停止轉動。所以在程序中可以利用P1.0口輸出PWM波來控制電機的轉速。
『貳』 51單片機實現電動機的PID恆速控制。
這是倒立擺系統的PID控制函數的一部分,你看看有沒有思路
/****************************************************************/
//定義結構體
/****************************************************************/
struct may_PID{
signed long Proportion; //比例 ;調節系數
signed long Integral; //積分 ;調節系數
signed long Derivative; //微分 ;調節系數
signed long SetPoint; //設定值 ;定值
signed long SumError; //偏差積分
signed long PrevError; //之前偏差值
}PID/*此處可放結構體變數名*/;
struct may_PID *pp; //定義結構體類型指針
//pp=malloc(sizeof(struct may_PID)); //為指針變數分配安全的地址空間;sizeof:其為計算位元組長度函數
/*****************************************************************/
/**************************PTD函數**************************************/
signed long PIDCalc(signed long NextPoint/*當前值*/ )
{
signed long dError;
Error = pp->SetPoint - NextPoint;//當前偏差
pp->SumError+=Error; //積分
dError=Error-pp->PrevError;//當前微分=當前偏差-之前偏差
pp->PrevError=Error; //把當前偏差賦予之前偏差變數,使其充當下次取樣的之前偏差
return (long)(pp->Proportion *Error //比例項
+pp->Integral*pp->SumError //積分項
+pp->Derivative*dError); //微分項
}
/*****************************************************************************/
『叄』 求一個51/52單片機pid溫控電機代碼,主要就是利用獲取的溫度和預設溫度來控制電機轉速(pwm)
沒錯啊,pid的核心就算參數,做試驗來定.
『肆』 pic單片機pid控制演算法參數整定
我這有51的
#include <stdlib.h>
#include "global_varible.h"
/****************************************************************************
* 模塊名: PID
* 描述: PID調節子程序
* 採用PID-PD演算法。在偏差絕對值大於△e時,用PD演算法,以改善動態品質。
* 當偏差絕對值小於△e時,用PID演算法,提高穩定精度。
* PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
* 入口: 無
* 出口: 無
* 改變: PID_T_Run=加熱時間控制
*****************************************************************************/
void PID_Math(void)
{
signed long ee1; //偏差一階
//signed long ee2; //偏差二階
signed long d_out; //積分輸出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700; //溫度控制設定值37.00度
PID_e0 = Temp_Set-Temp_Now; //本次偏差
ee1 = PID_e0-PID_e1; //計算一階偏差
//ee2 = PID_e0-2*PID_e1+PID_e2; //計算二階偏差
if(ee1 > 500) //一階偏差的限制范圍
ee1 = 500;
if(ee1 < -500)
ee1 = -500;
PID_e_SUM += PID_e0; //偏差之和
if(PID_e_SUM > 200) //積分最多累計的溫差
PID_e_SUM = 200;
if(PID_e_SUM < -200)
PID_e_SUM = -200;
PID_Out = PID_kp*PID_e0+PID_kd*ee1; //計算PID比例和微分輸出
if(abs(PID_e0) < 200) //如果溫度相差小於1.5度則計入PID積分輸出
{
if(abs(PID_e0) > 100) //如果溫度相差大於1度時積分累計限制
{
if(PID_e_SUM > 100)
PID_e_SUM = 100;
if(PID_e_SUM < -100)
PID_e_SUM = -100;
}
d_out = PID_ki*PID_e_SUM; //積分輸出
if(PID_e0 < -5) //當前溫度高於設定溫度0.5度時積分累計限制
{
if(PID_e_SUM > 150)
PID_e_SUM = 150;
if(PID_e_SUM > 0) //當前溫度高於設定溫度0.5度時削弱積分正輸出
d_out >>= 1;
}
PID_Out += d_out; //PID比例,積分和微分輸出
}
else
PID_e_SUM=0;
PID_Out/=100; //恢復被PID_Out系數放大的倍數
if(PID_Out > 200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0 > 300) //當前溫度比設定溫度低3度則全速加熱
PID_Out=200;
if(PID_e0 < -20) //當前溫度高於設定溫度0.2度則關閉加熱
PID_Out=0;
Hot_T_Run=PID_Out; //加熱時間控制輸出
PID_e2 = PID_e1; //保存上次偏差
PID_e1 = PID_e0; //保存當前偏差
}
////////////////////////////////////////////////////////////void PID_Math() end.
『伍』 單片機PID控制問題
首先弄清楚PID是一種控制演算法!!!
1,「如果用單片機恆溫可以使溫度到達預定值就停止加熱,低了就加熱,用一個溫度感測器反饋,這樣算是一個自動控制嗎」你這是控制系統,但是效果會非常差,尤其是對於溫度控制這種大慣性系統,達到預定值就停止加熱,但是由於慣性,溫度肯定會繼續上升,電爐燒水的時候,水開了,斷電之後水還要沸騰一定時間的(沸騰是很消耗能量的,由此可見如果是加熱的話溫度上升更嚴重,你也可以自己用溫度計試試看);「低了就加熱」是同樣的道理。如果系統對控制精度有要求,你這樣做肯定達不到要求。PID是一種控制演算法,相對於其他控制演算法來說算是最簡單的了。PID能夠做到在溫度快要達到設定值的時候降低加熱功率,讓溫度上升速度變慢,最終穩定在設定值。如果用你的直接控制,溫度會在設定值上下振盪,永遠不會停在設定值。
2,一般的控制系統都需要加反饋,以構成閉環控制系統,相對的還有開環控制系統。開環控制系統,舉個例子,就是你加熱的時候事先計算好大約需要多少熱量,然後考慮一下環境影響,計算出加熱時間,然後控制加熱系統按照你這個時間加熱。你覺得這樣的系統能夠穩定工作嗎?環境稍稍有變動就掛了!開環控制系統的特點就是很容易受到環境的影響;閉環控制系統就穩定很多,你用1L水可用,2L水也行,500W電能用,1000W電爐也能用,這就是閉環的優點。
因此,大多數的控制系統都是閉環的,開環很少單獨使用,即使用到了也是有閉環的。開環其實也是有優點的,開環在控制系統裡面叫做前饋(跟反饋對應的),比如你的系統裡面電源電壓上升了,加熱速度肯定會變快,如果你對電源電壓采樣,將采樣的結果輸入到閉環裡面,對閉環做一個輕微的修正,控制的精度會更好,這就是開環的優勢,它是超前的,能夠預知結果(根據地源電壓提高就能知道需要降低輸出功率了)。
說完這些,你應該明白了,反饋是必需的(前饋也可以要,但是不是必需的),PID不能被取代(除非你用其它更復雜的控制演算法)。
『陸』 單片機如何寫PID程序
具體如下:
1、如果加入D抖動的特別厲害,試試只用PI控制。
2、還有PID參數都是一步一步調出來的,我建議你做個上位機,就是個簡單的VB串口程序,用來設置PID參數
3、然後在單片機這邊弄個串口接收程序,這里就是個簡單的串口程序,人人都會,把接收到的PID存儲在緩沖區里。
4、然後單片機程序直接調用。單片機帶EEPROM的話,當接收到改變的PID參數時,存儲這些參數。去STC官網下你的單片機資料,上面有EEPROM測試程序,直接套用。
『柒』 如何在單片機中實現pid自整定
儀表的PID實際上就是一個控制系統,其中P表示為比例帶,它對檢測到的變化信號進行放大作用,再經過儀表輸出去控制被測介質的物理量,比如壓力、溫度、流量以及液位等;I表示積分作用,因為比例調節P雖然對被測信號的變化能得出即時的響應,但存在著靜壓現象,提高積分作用可以使變化響應信號能消除靜差;D表示微分作用,對於一些響應變化很遲緩的對象,如溫度,在進行控制時為了加快控制效果,可引入微分調節量,起到超前調節的作用,也就是說是超調。
對於PID參數的整定是一個實驗的過程,因為不同的對象條件有不同的調節規律,在整定時向將I和D關閉,比例帶放在100%,這時比例帶P的放大倍數是1,逐漸減少比例帶,也就增加放大倍數,加入測量的變化信號,檢查輸出和控制對象是否有振盪現象。所謂的振盪現象,舉個例子,對某個壓力的控制,當壓力高時,控制閥門打開一點進行釋放,當壓力低時就關閉閥門。當對這個控制系統進行PID參數調整時,先關閉I和D,設定某個P值後對控制系統加一個壓力升高的變化信號,這時如果P值過小時,即其放大倍數增大,使得其輸出信號過量增大,導致閥門開的過大,造成壓力下降過快,因為檢測到壓力因為過低,使得控制輸出信號朝相反的方向變化,即輸出信號過量減小,使得閥門有被關閉,這時壓力有很快上升,這個現象就是振盪現象。為了避免在調節中出現振盪現象,一般是小范圍的調整比例帶P參數。等調整到壓力增高時,閥門稍微開一點,壓力穩定,壓力降低時,閥門稍微關一點,保持壓力穩定,這就算是可以了。這時再增加一點積分I參數,使得比例調節存在的靜差得到消除。微分D一般是不使用。
PL/C
『捌』 用單片機做PID演算法控制問題
1.可以直接套用PID公式,無論增量還是絕對的。PID演算法是根據誤差來控制的演算法,不依賴系統的模型,故不用算系統的傳遞函數。有的書提到傳遞函數,一般是用於理論建模模擬,從而直接用Matlab一類的模擬軟體進行PID參數調試。得到的參數可以為實際應用提供一定參考價值。
2.PID參數整定有一套原則。首先要了解各個參數的作用。具體的整定方法,隨便找本自控原理的書都會提到,我不太記得了,大致是有一個倍數關系。但實際操作,一般不會是用這個數,是需要根據系統的反應,改變各個參數來試的。盡信書不如無書啊~
另外,不同系統的參數肯定不一樣。就算同一個系統,稍微有一些改變,可能最好的那組參數就會變化。因此衍生了很多先進PID演算法,如神經PID、專家PID、模糊PID等等。
『玖』 PLC的PID控制和單片機的PID控制哪個好
重點不明確。業務員需要知道的是元器件的功能。
工業電氣,分為保護電器和控制電器。其中保護電器有斷路器和熔斷器。斷路器,如每個家挺里都有的總閘,一旦電路出現短路了就跳閘,可重復保護。熔斷器和斷路器一樣,起到保護作用,但是熔斷器裡面是容芯,燒壞了就沒用了,只能保護一次,但勝在價格便宜,一般用於控制電路。
控制電器有接觸器,中間繼電器是時間繼電器。電機啟動電流和運行電流大,需要接觸器來實現通斷三相電。有些信號需要多次利用,就需要中間繼電器來擴展觸頭。時間繼電器就好比鬧鍾,設定好時間,時間一到就動作,用在需要對時間進行延遲的地方。
pid就是反饋信號的控制,目的是為了實現輸出信號的跟隨性和穩定性。所謂跟隨性,就是我將設定的值變了,那麼輸出值就會程柔性的曲線變化,不會造成沖擊性的信號。所謂的穩定性,就是如果中間環節出了問題,也不影響輸出。比如對一電機的控制,設定為2000轉。電機的負載突然加大,如果沒有pid控制,將轉速的測量值反饋回去,那麼電機轉速勢必降低;如果有了pid控制,那麼控制會自行增大輸出頻率,來提高電機轉速,使其依然維持在2000轉。
plc,和單片機一樣,將有硬體電器元件控制的邏輯搬進程序里,實現軟體邏輯運算.plc抗干擾能力強,編程簡單,性價比高。單片機價格便宜,但抗干擾能力差