|
0.png (55.24 KB, 下載次數(shù): 56)
下載附件
2017-8-10 23:44 上傳
轉(zhuǎn)速、電流雙閉環(huán)直流調(diào)速系統(tǒng)和調(diào)節(jié)器的工程設(shè)計方法2.1
轉(zhuǎn)速、電流雙閉環(huán)直流調(diào)速系統(tǒng)及其靜特性
采用PI調(diào)節(jié)的單個轉(zhuǎn)速閉環(huán)直流調(diào)速系統(tǒng)可以在保證系統(tǒng)穩(wěn)定的前提下實現(xiàn)轉(zhuǎn)速無靜差。但是,如果對系統(tǒng)的動態(tài)性能要求較高,單閉環(huán)系統(tǒng)就難以滿足需要,這主要是因為在單閉環(huán)系統(tǒng)中不能控制電流和轉(zhuǎn)矩的動態(tài)過程。電流截止負(fù)反饋環(huán)節(jié)是專門用來控制電流的,并不能很理想地控制電流的動態(tài)波形,圖2-1a)。
在起動過程中,始終保持電流(轉(zhuǎn)矩)為允許的最大值,使電力拖動系統(tǒng)以最大的加速度起動,到達(dá)穩(wěn)態(tài)轉(zhuǎn)速時,立即讓電流降下來,使轉(zhuǎn)矩馬上與負(fù)載相平衡,從而轉(zhuǎn)入穩(wěn)態(tài)運行。這樣的理想起動過程波形示于圖2-1b。
為了實現(xiàn)在允許條件下的最快起動,關(guān)鍵是要獲得一段使電流保持為最大值的恒流過程。按照反饋控制規(guī)律,采用某個物理量的負(fù)反饋就可以保持該量基本不變,那么,采用電流負(fù)反饋應(yīng)該能夠得到近似的恒流過程。應(yīng)該在起動過程中只有電流負(fù)反饋,沒有轉(zhuǎn)速負(fù)反饋,達(dá)到穩(wěn)態(tài)轉(zhuǎn)速后,又希望只要轉(zhuǎn)速負(fù)反饋,不再讓電流負(fù)反饋發(fā)揮作用。
0.png (36.23 KB, 下載次數(shù): 66)
下載附件
2017-8-10 23:45 上傳
stm32單片機(jī)源程序如下:
- #include"pid.h"
- #include"fuzzy.h"
- #include"pwm.h"
- #include"dac.h"
- PIDtypedef PID1; //PID結(jié)構(gòu)體
- PIDtypedef PID2;
- PIDtypedef PID3;
- PIDtypedef PID4;
- extern u8 start_flag;
- extern u16 pwm1,pwm2,pwm3,pwm4;
- void PIDperiodinit(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //時鐘使能
-
- //定時器TIM6初始化
- TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值
- TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
- TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位
-
- TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷
- //中斷優(yōu)先級NVIC設(shè)置
- NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //TIM3中斷
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占優(yōu)先級1級
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //從優(yōu)先級1級
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
- // TIM_Cmd(TIM6, ENABLE); //放在主程序中使能
- }
- void TIM6_IRQHandler(void) // 采樣時間到,中斷處理函數(shù)
- {
-
- if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)//更新中斷
- {
- frequency1=1000000/period_TIM4 ; //通過捕獲的波形的周期算出頻率
- frequency2=1000000/period_TIM1 ;
- frequency3=1000000/period_TIM2 ;
- frequency4=1000000/period_TIM5 ;
- /********PID1處理**********/
- PID1.sum_error+=(incPIDcalc(&PID1,frequency1)); //計算增量并累加
- pwm1=PID1.sum_error*4.6875 ; //pwm1 代表將要輸出PWM的占空比
- frequency1=0; //清零
- period_TIM4=0;
- /********PID2處理**********/
- PID2.sum_error+=(incPIDcalc(&PID2,frequency2)); //計算增量并累加 Y=Y+Y'
- pwm2=PID2.sum_error*4.6875 ; //將要輸出PWM的占空比
- frequency2=0;
- period_TIM1=0;
- /********PID3處理**********/
- PID3.sum_error+=(incPIDcalc(&PID3,frequency3)); //常規(guī)PID控制
- pwm3=PID3.sum_error*4.6875 ; //將要輸出PWM的占空比
- frequency3=0;
- period_TIM2=0;
- /********PID4處理**********/
- PID4.sum_error+=(incPIDcalc(&PID4,frequency4)); //計算增量并累加
- pwm4=PID4.sum_error*4.6875 ; //將要輸出PWM的占空比
- frequency4=0;
- period_TIM5=0;
- }
- TIM_SetCompare(pwm1,pwm2,pwm3,pwm4); //重新設(shè)定PWM值
- TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //清除中斷標(biāo)志位
- }
- void incPIDinit(void)
- {
- //PID1參數(shù)初始化
- PID1.sum_error=0;
- PID1.last_error=0;
- PID1.prev_error=0;
- PID1.proportion=0;
- PID1.integral=0;
- PID1.derivative=0;
- PID1.setpoint=0;
- //PID2參數(shù)初始化
- PID2.sum_error=0;
- PID2.last_error=0;
- PID2.prev_error=0;
- PID2.proportion=0;
- PID2.integral=0;
- PID2.derivative=0;
- PID2.setpoint=0;
- //PID3參數(shù)初始化
- PID3.sum_error=0;
- PID3.last_error=0;
- PID3.prev_error=0;
- PID3.proportion=0;
- PID3.integral=0;
- PID3.derivative=0;
- PID3.setpoint=0;
- //PID4參數(shù)初始化
- PID4.sum_error=0;
- PID4.last_error=0;
- PID4.prev_error=0;
- PID4.proportion=0;
- PID4.integral=0;
- PID4.derivative=0;
- PID4.setpoint=0;
- }
- void PID_setpoint(PIDtypedef*PIDx,u16 setvalue)
- {
- PIDx->setpoint=setvalue;
- }
- int incPIDcalc(PIDtypedef *PIDx,u16 nextpoint)
- {
- int iError,iincpid;
- iError=PIDx->setpoint-nextpoint; //當(dāng)前誤差
- /*iincpid= //增量計算
- PIDx->proportion*iError //e[k]項
- -PIDx->integral*PIDx->last_error //e[k-1]
- +PIDx->derivative*PIDx->prev_error;//e[k-2]
- */
- iincpid= //增量計算
- PIDx->proportion*(iError-PIDx->last_error)
- +PIDx->integral*iError
- +PIDx->derivative*(iError-2*PIDx->last_error+PIDx->prev_error);
- PIDx->prev_error=PIDx->last_error; //存儲誤差,便于下次計算
- PIDx->last_error=iError;
- return(iincpid) ;
- }
- void PID_set(float pp,float ii,float dd)
- {
- PID1.proportion=pp;
- PID1.integral=ii;
- PID1.derivative=dd;
- PID2.proportion=pp;
- PID2.integral=ii;
- PID2.derivative=dd;
- PID3.proportion=pp;
- PID3.integral=ii;
- PID3.derivative=dd;
- PID4.proportion=pp;
- PID4.integral=ii;
- PID4.derivative=dd;
- }
- /*最后設(shè)定四個輪子的轉(zhuǎn)速,轉(zhuǎn)速 1rad/s等價于122.23個脈沖每秒的轉(zhuǎn)速*/
- void set_speed(float W1,float W2,float W3,float W4)
- {
- float temp;
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
pid.rar
(249.46 KB, 下載次數(shù): 45)
2017-8-10 21:49 上傳
點擊文件名下載附件
王者pid 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|