|
我把樓主的代碼重新格式化了下, 方便閱讀
- void PWMProcess(void)
- {
- uint16 idata temp;
- uint16 idata UKTemp;
- temp = 0;
- UKTemp = 0;
- if (Pwm.ChangeFlag_Uint8 != 0) //判斷是否需要改變占空比
- { //是否需要改變占空比和你的被控系統(tǒng)特性有關(guān)
- Pwm.ChangeFlag_Uint8 = 0;
- UKTemp = PID.Uk_Uint16 + SwIn.AddValue_Uint16;//計算UK控制量
- //控制量和計算值以及一個開關(guān)量有關(guān),我這里的開關(guān)量是系統(tǒng)需要的時候疊加在控制量上的一個變量。
- if (UKTemp > 999)
- {
- UKTemp = 999;
- } //這里只所以是999封頂而不是1024是因為我的系統(tǒng)PWM的峰值電壓是12V導(dǎo)致。
- while (1)//如果輸出電壓和期望電壓相差 Delta,則繼續(xù)調(diào)整占空比,直到在誤差以內(nèi)
- {
- ADChPro(UPWMADCH); //測量輸出電壓
- if (ADPool.Value_Uint16[UPWMADCH] == UKTemp)
- {
- return;
- }
- if (ADPool.Value_Uint16[UPWMADCH] > UKTemp) //如果當(dāng)前電壓大于輸出電壓,減小占空比
- {
- if ((ADPool.Value_Uint16[UPWMADCH] - UKTemp) > UDELTA)
- {
- temp = ADPool.Value_Uint16[UPWMADCH] - UKTemp; //
- temp = temp / 2; //下降可以加速下降,所以下降參數(shù)加倍 -----/*PWM的系數(shù)為UK/4*/
- if (Pwm.DutyCycle_Uint8 > temp)
- {
- Pwm.DutyCycle_Uint8 = Pwm.DutyCycle_Uint8 - temp;
- }
- else
- {
- Pwm.DutyCycle_Uint8 = 0;
- }
- }
- else
- {
- return;
- }
- }
- else //如果當(dāng)前電壓小于輸出電壓
- {
- if ((UKTemp - ADPool.Value_Uint16[UPWMADCH]) > UDELTA)
- {
- temp = UKTemp - ADPool.Value_Uint16[UPWMADCH];
- temp = temp / 4; //上升處理不要超調(diào),所以每次只+一半
- if ((255 - Pwm.DutyCycle_Uint8) > temp)
- {
- Pwm.DutyCycle_Uint8 += (temp / 2);
- }
- else
- {
- Pwm.DutyCycle_Uint8 = 255;
- }
- }
- else
- {
- return;
- }
- }
- DisPlayVoltage();
- PWMChangeDuty(Pwm.DutyCycle_Uint8); //改變占空比
- Delay(10, 10);
- }
- }
- }
復(fù)制代碼 |
評分
-
查看全部評分
|