找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3621|回復: 1
收起左側(cè)

正點原子stm32mini開發(fā)板做2015年國賽題目雙向DCDC程序

[復制鏈接]
ID:165301 發(fā)表于 2019-1-7 10:25 | 顯示全部樓層 |閱讀模式
電壓采集曲線擬合
0.png

PID參數(shù)調(diào)整
0.png

單片機源程序如下:
  1. #include  "stm32f10x.h"
  2. #include  "key.h"
  3. #include  "timer.h"
  4. #include  "Filter.h"
  5. #include  "sys.h"
  6. #include  "PWM_OUTPUT.h"
  7. #include  "led.h"
  8. #include  "12864.h"
  9. #include  "adc.h"
  10. #include  "delay.h"
  11. #include  "SHOW.h"
  12. #include  "PID.h"
  13. #define uchar unsigned char
  14. /**********************************************************/
  15. //全局宏定義說明
  16. #define  ERROR  0
  17. #define  TURE   1
  18. #define  Medium_High  3840
  19. #define  HIGHT_LIMIT  4320      //90%
  20. #define  LOW_LIMIT    2640      //55%
  21. #define  Init_Uset    3600      //初始目標值3600
  22. #define  initial_value 60.0
  23. #define  start    2
  24. #define  end      0
  25. #define  target_index   15
  26. /**********************************************************/
  27. //外部函數(shù)調(diào)用說明:
  28. void    system_init(void);
  29. void    Query_button(void);                                 //鍵盤掃描函數(shù)
  30. extern  __IO   uint16_t ADC_ConvertedValue[BUF_SIZE];  
  31. extern  u32   Adc_Feedback(float *QUEUE, u8 chip);
  32. extern  void  PID_init(PID *pp, float Kp, float Ki, float Kd);
  33. extern  PID   Voltage_PID;
  34. extern  void  TIM2_In_Init(u16 arr,u16 psc);                // 定時器TIM2
  35. extern  void  TIM4_In_Init(u16 arr,u16 psc);                // 定時器TIM2
  36. extern  void  LCD_refresh(void);                            // 顯示刷新掃描函數(shù)
  37. void    Set_mode(void);                                     // 模式選擇
  38. void    Increase_current(void);                             // 加電流
  39. void    Current_reduction(void);                            // 減電流
  40. extern  void EXIT_PB4_Config(void);
  41. /**********************************************************/

  42. /**********************************************************/
  43. //變量定義
  44. u8      Integral_judge;                                               //積分分離式的標志           
  45. u16     NUM_Fliter = 450;                                             //濾波次數(shù)設置
  46. int     U_Set = 300;                                                 //設定目標值
  47. float   QUEUE[20] = {0,0};
  48. float   ADC_add,filter_Value,filter_Value_End;                        //  采樣值,與濾波值
  49. u8      Step_into_target_marks=0;                                     //  步進目標值標志位
  50. float   fsc = initial_value,*Duty = &fsc;
  51. u16     CCR1_Val = 0;
  52. u16     CCR1_Val_init =  2520;
  53. SqQueue Q;                                                              //  ADC采樣值序列
  54. int     aim_value ;       
  55. u8      Key_symbol1=0,Key_symbol2=0,Key_symbol3=0;                      //  按鍵標志 key1 key2 key3
  56. extern  float Pv,Kp,Ki,Kd;
  57. u8      real_time_control_lcd=0;
  58. u8      PID_control_sign=end;                                            // PID開啟標志位
  59. u8      Refresh_LCD1=0,Refresh_LCD2=0,Refresh_LCD3=0;                    // LCD1,LCD2,LCD3 三塊屏幕刷新標志
  60. int     adjust_current[21]={1659,1735,1811,1889,1966,2045,2124,2203,
  61.         2283,2364,2445,2527,2609,2692,2775,2859,2944,3029,3115,3201,3289};//恒流數(shù)組
  62. int     Point_target=0;
  63. u16     Ini_value_tim2=10-1,Divid_tim2_val=72-1;                        // 定時器2裝載初始值和分頻值  10us//PID調(diào)整量,PID設定值
  64. /**********************************************************/


  65. int main()
  66. {

  67.        U_Set =  adjust_current[0] ;                            //設定初始目標值U_Set
  68.         PWM_set(Duty);                                           //PWM輸出
  69.            system_init();                                           //系統(tǒng)參數(shù)初始化
  70.         Get_Adc();                                               //獲取adc值              
  71.         Set_Up_QUEUE( &Q );                                           //建立一個空隊列   
  72.       // ADC_add=Update_QUEUE(20,1);                             //取得隊列  
  73.         ADC_add = Update_QUEUE_1(20,1);                          //取得隊列
  74.         filter_Value = filter1(QUEUE,ADC_add,20);                //濾波
  75.         aim_value=Adc_Feedback(QUEUE,1);                         //顯示當前的采樣值
  76.         PID__init(&Voltage_PID, &Kp, &Ki, &Kd);
  77.      
  78.         while (1)
  79.            {
  80.                   
  81.           /* while(flag==1&&flag1==1)
  82.              {
  83.                   check();                                       //掃描按鍵  
  84.                  
  85.                   if (rcvF == 1)
  86.                   {
  87.                        rcvF=0;
  88.                        keyHandle(keyVal);
  89.                        PWM_set(Duty);
  90.                        flag=0;
  91.                    }
  92.                  
  93.                 }*/
  94. //          aim_value = Adc_Feedback(QUEUE,1);  
  95. //          filter_Value_End = AA_Filter(&Q,QUEUE,1);                  //兩次濾波,顯示 實際值
  96. //          string_display = conversion_of_number_systems(filter_Value_End, string_display) ;
  97. //          Write_add(2,1);   
  98. //          displaychar(string_display);
  99.          
  100.    if( PID_control_sign == start )                           //開PID
  101.     {
  102.           while( U_Set-aim_value>=2 || U_Set-aim_value <= -2)   //PID算法
  103.             {
  104.                                         Pv=PID_Feedback(U_Set, aim_value);
  105.                                         CCR1_Val=CCR1_Val + Pv/0.36;                       //0。36
  106.                                                                                                          
  107.                                         if( CCR1_Val >= Medium_High )         //80%
  108.                                                 CCR1_Val = Medium_High;
  109.                                         else if( CCR1_Val <= LOW_LIMIT )     //40%
  110.                                                          CCR1_Val = LOW_LIMIT;
  111.                                                                         TIM3->CCR2 = CCR1_Val;
  112.                                         aim_value = Adc_Feedback(QUEUE,1);
  113.             }       
  114.      }  
  115.                                         aim_value=Adc_Feedback(QUEUE,1);                    //顯示當前的采樣值
  116.          
  117.         }
  118.           return 0;
  119.        // string_display = conversion_of_number_systems(2, string_display) ;
  120.        // displaychar(string_display);
  121. }  

  122. /*名稱:system_init()
  123. *輸入:無
  124. *輸出:無
  125. *說明:各個模塊初始化
  126. */
  127. void system_init()
  128. {
  129.      NVIC_Configuration();                             // 2位搶占優(yōu)先級,8位響應優(yōu)先級   
  130.      delay_init();                                     // 延時初始化  
  131.      
  132.         Lcd_Init_IO();                                           // 12864初始化
  133.         Lcd_Init();
  134.      
  135.      EXIT_PB4_Config();                                // 開PB4中斷
  136.         Key_IO_Init();                                    // 按鍵IO初始化
  137.      ADC1_Init();                                      // ADC初始化
  138.      TIM2_In_Init(Ini_value_tim2,Divid_tim2_val);
  139.      TIM4_In_Init(Ini_value_tim2,Divid_tim2_val);     
  140. }
  141. /*
  142. * 函數(shù)介紹 : 按鍵掃描  
  143. * 輸入?yún)?shù) :  無
  144. * 輸出參數(shù) : 無
  145. * 返回值   : 無
  146. */
  147. void Query_button()
  148. {
  149.    if(Key_symbol1 == 1)                   // 按鍵0按下
  150.    {
  151.       PID_control_sign=end;               // 關PID  
  152.       Step_into_target_marks=1;           // 開啟步進目標標志位   
  153.       Set_mode();                         // 設定模式
  154.       Key_symbol1 = 0;                    // 清標志位1
  155.       Refresh_LCD1 =0;                   //  屏幕顯示關
  156.       LCDclear();                        // LCD清屏
  157.    }
  158.    
  159.    if(Key_symbol2 == 1)                   // 按鍵1按下
  160.    {
  161.       Increase_current();                 // 加電流
  162.       Key_symbol2 = 0;                    // 清標志位2
  163.    }
  164.    
  165.    if(Key_symbol3 == 1)                   // 按鍵2按下
  166.    {
  167.       Current_reduction();                // 減電流
  168.       Key_symbol3 = 0;                    // 清標志位2
  169.    }
  170. }
  171. /*
  172. * 函數(shù)介紹 : Increase_current() 電流加0.05A 以及步進調(diào)整電流2A
  173. * 輸入?yún)?shù) :  無
  174. * 輸出參數(shù) : 無
  175. * 返回值   : 無
  176. */
  177. void Increase_current()
  178. {
  179.                  
  180.        if( Step_into_target_marks==1 )                 //開啟步進目標值模式
  181.        {
  182.          if(U_Set>HIGHT_LIMIT)
  183.          {
  184.             Step_into_target_marks=0;                  //關閉步進目標值模式
  185.              U_Set = Init_Uset;                        //目標值恢復初始值
  186.              TIM3->CCR2 = U_Set;                       // 更新PWM值
  187.              PID_control_sign=start;                   //開PID
  188.              Point_target=0;
  189.          }
  190.          else
  191.          {
  192.              U_Set = U_Set+target_index;                        //步進目標值
  193.              TIM3->CCR2 = U_Set;                       // 更新PWM值
  194.          }
  195.             
  196.        }
  197.        else                                         //步進電流模式            
  198.        {
  199.           if(Point_target == 21)                      //達到兩A停止     
  200.            {
  201.                
  202.          Point_target = 20;
  203.         
  204.             }
  205.         else
  206.         {
  207.             
  208.          U_Set = adjust_current[Point_target] ;        //PID目標值調(diào)整
  209.          Point_target++;                               //自加0.05A   
  210.             
  211.         }
  212.       }
  213. }
  214. /*
  215. * 函數(shù)介紹 : Set_mode() 選擇模式充電,放電自動
  216. * 輸入?yún)?shù) :  無
  217. * 輸出參數(shù) : 無
  218. * 返回值   : 無
  219. */
  220. void Set_mode()
  221. {



  222. }
  223. /*
  224. * 函數(shù)介紹 : LCD是否需要刷新判斷  并響應程序
  225. * 輸入?yún)?shù) :  無
  226. * 輸出參數(shù) : 無
  227. * 返回值   : 無
  228. */
  229. void  LCD_refresh()
  230. {



  231. }      
  232. /*
  233. * 函數(shù)介紹 : Current_reduction() 電流減0.05A
  234. * 輸入?yún)?shù) :  無
  235. * 輸出參數(shù) : 無
  236. * 返回值   : 無
  237. */
  238.   void Current_reduction()
  239. {
  240.       
  241.       if(Step_into_target_marks==1)                    //開啟步進目標值模式
  242.       {
  243.             if(U_Set <LOW_LIMIT )
  244.             {                                         
  245.                Step_into_target_marks=0;               // 清步進目標值模式
  246.                 U_Set = Init_Uset;                     // 目標值恢復初始值
  247.                 TIM3->CCR2 = U_Set;                    // 更新PWM值
  248.                 PID_control_sign =start;                   //開PID
  249.                 Point_target=0;                        //  準備步進調(diào)整電流                 
  250.             }
  251.             else
  252.             {
  253.                U_Set=U_Set-target_index;
  254.                TIM3->CCR2 = U_Set;                     // 更新PWM值
  255.             }
  256.       }
  257.            
  258.       else                                              //開啟步進電流模式
  259.       {
  260.       if(Point_target == -1)
  261.       {
  262.          Point_target = 0;
  263.            
  264.       }
  265.       else
  266.       {
  267.            
  268.          U_Set = adjust_current[Point_target] ;     // PID目標值調(diào)整  
  269.          Point_target--;                            //  減0.05A
  270.            
  271.       }
  272.       }   

  273. }
復制代碼

所有資料51hei提供下載:
雙向DC-DC(old version).7z (208.92 KB, 下載次數(shù): 95)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:323951 發(fā)表于 2022-8-28 02:24 | 顯示全部樓層
感謝樓主分享,要是有個原理圖就好了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表