|
電壓采集曲線(xiàn)擬合
PID參數(shù)調(diào)整
單片機(jī)源程序如下:
- #include "stm32f10x.h"
- #include "key.h"
- #include "timer.h"
- #include "Filter.h"
- #include "sys.h"
- #include "PWM_OUTPUT.h"
- #include "led.h"
- #include "12864.h"
- #include "adc.h"
- #include "delay.h"
- #include "SHOW.h"
- #include "PID.h"
- #define uchar unsigned char
- /**********************************************************/
- //全局宏定義說(shuō)明
- #define ERROR 0
- #define TURE 1
- #define Medium_High 3840
- #define HIGHT_LIMIT 4320 //90%
- #define LOW_LIMIT 2640 //55%
- #define Init_Uset 3600 //初始目標(biāo)值3600
- #define initial_value 60.0
- #define start 2
- #define end 0
- #define target_index 15
- /**********************************************************/
- //外部函數(shù)調(diào)用說(shuō)明:
- void system_init(void);
- void Query_button(void); //鍵盤(pán)掃描函數(shù)
- extern __IO uint16_t ADC_ConvertedValue[BUF_SIZE];
- extern u32 Adc_Feedback(float *QUEUE, u8 chip);
- extern void PID_init(PID *pp, float Kp, float Ki, float Kd);
- extern PID Voltage_PID;
- extern void TIM2_In_Init(u16 arr,u16 psc); // 定時(shí)器TIM2
- extern void TIM4_In_Init(u16 arr,u16 psc); // 定時(shí)器TIM2
- extern void LCD_refresh(void); // 顯示刷新掃描函數(shù)
- void Set_mode(void); // 模式選擇
- void Increase_current(void); // 加電流
- void Current_reduction(void); // 減電流
- extern void EXIT_PB4_Config(void);
- /**********************************************************/
- /**********************************************************/
- //變量定義
- u8 Integral_judge; //積分分離式的標(biāo)志
- u16 NUM_Fliter = 450; //濾波次數(shù)設(shè)置
- int U_Set = 300; //設(shè)定目標(biāo)值
- float QUEUE[20] = {0,0};
- float ADC_add,filter_Value,filter_Value_End; // 采樣值,與濾波值
- u8 Step_into_target_marks=0; // 步進(jìn)目標(biāo)值標(biāo)志位
- float fsc = initial_value,*Duty = &fsc;
- u16 CCR1_Val = 0;
- u16 CCR1_Val_init = 2520;
- SqQueue Q; // ADC采樣值序列
- int aim_value ;
- u8 Key_symbol1=0,Key_symbol2=0,Key_symbol3=0; // 按鍵標(biāo)志 key1 key2 key3
- extern float Pv,Kp,Ki,Kd;
- u8 real_time_control_lcd=0;
- u8 PID_control_sign=end; // PID開(kāi)啟標(biāo)志位
- u8 Refresh_LCD1=0,Refresh_LCD2=0,Refresh_LCD3=0; // LCD1,LCD2,LCD3 三塊屏幕刷新標(biāo)志
- int adjust_current[21]={1659,1735,1811,1889,1966,2045,2124,2203,
- 2283,2364,2445,2527,2609,2692,2775,2859,2944,3029,3115,3201,3289};//恒流數(shù)組
- int Point_target=0;
- u16 Ini_value_tim2=10-1,Divid_tim2_val=72-1; // 定時(shí)器2裝載初始值和分頻值 10us//PID調(diào)整量,PID設(shè)定值
- /**********************************************************/
- int main()
- {
- U_Set = adjust_current[0] ; //設(shè)定初始目標(biāo)值U_Set
- PWM_set(Duty); //PWM輸出
- system_init(); //系統(tǒng)參數(shù)初始化
- Get_Adc(); //獲取adc值
- Set_Up_QUEUE( &Q ); //建立一個(gè)空隊(duì)列
- // ADC_add=Update_QUEUE(20,1); //取得隊(duì)列
- ADC_add = Update_QUEUE_1(20,1); //取得隊(duì)列
- filter_Value = filter1(QUEUE,ADC_add,20); //濾波
- aim_value=Adc_Feedback(QUEUE,1); //顯示當(dāng)前的采樣值
- PID__init(&Voltage_PID, &Kp, &Ki, &Kd);
-
- while (1)
- {
-
- /* while(flag==1&&flag1==1)
- {
- check(); //掃描按鍵
-
- if (rcvF == 1)
- {
- rcvF=0;
- keyHandle(keyVal);
- PWM_set(Duty);
- flag=0;
- }
-
- }*/
- // aim_value = Adc_Feedback(QUEUE,1);
- // filter_Value_End = AA_Filter(&Q,QUEUE,1); //兩次濾波,顯示 實(shí)際值
- // string_display = conversion_of_number_systems(filter_Value_End, string_display) ;
- // Write_add(2,1);
- // displaychar(string_display);
-
- if( PID_control_sign == start ) //開(kāi)PID
- {
- while( U_Set-aim_value>=2 || U_Set-aim_value <= -2) //PID算法
- {
- Pv=PID_Feedback(U_Set, aim_value);
- CCR1_Val=CCR1_Val + Pv/0.36; //0。36
-
- if( CCR1_Val >= Medium_High ) //80%
- CCR1_Val = Medium_High;
- else if( CCR1_Val <= LOW_LIMIT ) //40%
- CCR1_Val = LOW_LIMIT;
- TIM3->CCR2 = CCR1_Val;
- aim_value = Adc_Feedback(QUEUE,1);
- }
- }
- aim_value=Adc_Feedback(QUEUE,1); //顯示當(dāng)前的采樣值
-
- }
- return 0;
- // string_display = conversion_of_number_systems(2, string_display) ;
- // displaychar(string_display);
- }
- /*名稱(chēng):system_init()
- *輸入:無(wú)
- *輸出:無(wú)
- *說(shuō)明:各個(gè)模塊初始化
- */
- void system_init()
- {
- NVIC_Configuration(); // 2位搶占優(yōu)先級(jí),8位響應(yīng)優(yōu)先級(jí)
- delay_init(); // 延時(shí)初始化
-
- Lcd_Init_IO(); // 12864初始化
- Lcd_Init();
-
- EXIT_PB4_Config(); // 開(kāi)PB4中斷
- Key_IO_Init(); // 按鍵IO初始化
- ADC1_Init(); // ADC初始化
- TIM2_In_Init(Ini_value_tim2,Divid_tim2_val);
- TIM4_In_Init(Ini_value_tim2,Divid_tim2_val);
- }
- /*
- * 函數(shù)介紹 : 按鍵掃描
- * 輸入?yún)?shù) : 無(wú)
- * 輸出參數(shù) : 無(wú)
- * 返回值 : 無(wú)
- */
- void Query_button()
- {
- if(Key_symbol1 == 1) // 按鍵0按下
- {
- PID_control_sign=end; // 關(guān)PID
- Step_into_target_marks=1; // 開(kāi)啟步進(jìn)目標(biāo)標(biāo)志位
- Set_mode(); // 設(shè)定模式
- Key_symbol1 = 0; // 清標(biāo)志位1
- Refresh_LCD1 =0; // 屏幕顯示關(guān)
- LCDclear(); // LCD清屏
- }
-
- if(Key_symbol2 == 1) // 按鍵1按下
- {
- Increase_current(); // 加電流
- Key_symbol2 = 0; // 清標(biāo)志位2
- }
-
- if(Key_symbol3 == 1) // 按鍵2按下
- {
- Current_reduction(); // 減電流
- Key_symbol3 = 0; // 清標(biāo)志位2
- }
- }
- /*
- * 函數(shù)介紹 : Increase_current() 電流加0.05A 以及步進(jìn)調(diào)整電流2A
- * 輸入?yún)?shù) : 無(wú)
- * 輸出參數(shù) : 無(wú)
- * 返回值 : 無(wú)
- */
- void Increase_current()
- {
-
- if( Step_into_target_marks==1 ) //開(kāi)啟步進(jìn)目標(biāo)值模式
- {
- if(U_Set>HIGHT_LIMIT)
- {
- Step_into_target_marks=0; //關(guān)閉步進(jìn)目標(biāo)值模式
- U_Set = Init_Uset; //目標(biāo)值恢復(fù)初始值
- TIM3->CCR2 = U_Set; // 更新PWM值
- PID_control_sign=start; //開(kāi)PID
- Point_target=0;
- }
- else
- {
- U_Set = U_Set+target_index; //步進(jìn)目標(biāo)值
- TIM3->CCR2 = U_Set; // 更新PWM值
- }
-
- }
- else //步進(jìn)電流模式
- {
- if(Point_target == 21) //達(dá)到兩A停止
- {
-
- Point_target = 20;
-
- }
- else
- {
-
- U_Set = adjust_current[Point_target] ; //PID目標(biāo)值調(diào)整
- Point_target++; //自加0.05A
-
- }
- }
- }
- /*
- * 函數(shù)介紹 : Set_mode() 選擇模式充電,放電自動(dòng)
- * 輸入?yún)?shù) : 無(wú)
- * 輸出參數(shù) : 無(wú)
- * 返回值 : 無(wú)
- */
- void Set_mode()
- {
- }
- /*
- * 函數(shù)介紹 : LCD是否需要刷新判斷 并響應(yīng)程序
- * 輸入?yún)?shù) : 無(wú)
- * 輸出參數(shù) : 無(wú)
- * 返回值 : 無(wú)
- */
- void LCD_refresh()
- {
- }
- /*
- * 函數(shù)介紹 : Current_reduction() 電流減0.05A
- * 輸入?yún)?shù) : 無(wú)
- * 輸出參數(shù) : 無(wú)
- * 返回值 : 無(wú)
- */
- void Current_reduction()
- {
-
- if(Step_into_target_marks==1) //開(kāi)啟步進(jìn)目標(biāo)值模式
- {
- if(U_Set <LOW_LIMIT )
- {
- Step_into_target_marks=0; // 清步進(jìn)目標(biāo)值模式
- U_Set = Init_Uset; // 目標(biāo)值恢復(fù)初始值
- TIM3->CCR2 = U_Set; // 更新PWM值
- PID_control_sign =start; //開(kāi)PID
- Point_target=0; // 準(zhǔn)備步進(jìn)調(diào)整電流
- }
- else
- {
- U_Set=U_Set-target_index;
- TIM3->CCR2 = U_Set; // 更新PWM值
- }
- }
-
- else //開(kāi)啟步進(jìn)電流模式
- {
- if(Point_target == -1)
- {
- Point_target = 0;
-
- }
- else
- {
-
- U_Set = adjust_current[Point_target] ; // PID目標(biāo)值調(diào)整
- Point_target--; // 減0.05A
-
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
雙向DC-DC(old version).7z
(208.92 KB, 下載次數(shù): 95)
2019-1-13 02:10 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|