久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

正點(diǎn)原子stm32mini開(kāi)發(fā)板做2015年國(guó)賽題目雙向DCDC程序

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

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

單片機(jī)源程序如下:
  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. //全局宏定義說(shuō)明
  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      //初始目標(biāo)值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)用說(shuō)明:
  28. void    system_init(void);
  29. void    Query_button(void);                                 //鍵盤(pán)掃描函數(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);                // 定時(shí)器TIM2
  35. extern  void  TIM4_In_Init(u16 arr,u16 psc);                // 定時(shí)器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;                                               //積分分離式的標(biāo)志           
  45. u16     NUM_Fliter = 450;                                             //濾波次數(shù)設(shè)置
  46. int     U_Set = 300;                                                 //設(shè)定目標(biāo)值
  47. float   QUEUE[20] = {0,0};
  48. float   ADC_add,filter_Value,filter_Value_End;                        //  采樣值,與濾波值
  49. u8      Step_into_target_marks=0;                                     //  步進(jìn)目標(biāo)值標(biāo)志位
  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;                      //  按鍵標(biāo)志 key1 key2 key3
  56. extern  float Pv,Kp,Ki,Kd;
  57. u8      real_time_control_lcd=0;
  58. u8      PID_control_sign=end;                                            // PID開(kāi)啟標(biāo)志位
  59. u8      Refresh_LCD1=0,Refresh_LCD2=0,Refresh_LCD3=0;                    // LCD1,LCD2,LCD3 三塊屏幕刷新標(biāo)志
  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;                        // 定時(shí)器2裝載初始值和分頻值  10us//PID調(diào)整量,PID設(shè)定值
  64. /**********************************************************/


  65. int main()
  66. {

  67.        U_Set =  adjust_current[0] ;                            //設(shè)定初始目標(biāo)值U_Set
  68.         PWM_set(Duty);                                           //PWM輸出
  69.            system_init();                                           //系統(tǒng)參數(shù)初始化
  70.         Get_Adc();                                               //獲取adc值              
  71.         Set_Up_QUEUE( &Q );                                           //建立一個(gè)空隊(duì)列   
  72.       // ADC_add=Update_QUEUE(20,1);                             //取得隊(duì)列  
  73.         ADC_add = Update_QUEUE_1(20,1);                          //取得隊(duì)列
  74.         filter_Value = filter1(QUEUE,ADC_add,20);                //濾波
  75.         aim_value=Adc_Feedback(QUEUE,1);                         //顯示當(dāng)前的采樣值
  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);                  //兩次濾波,顯示 實(shí)際值
  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 )                           //開(kāi)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);                    //顯示當(dāng)前的采樣值
  116.          
  117.         }
  118.           return 0;
  119.        // string_display = conversion_of_number_systems(2, string_display) ;
  120.        // displaychar(string_display);
  121. }  

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



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



  231. }      
  232. /*
  233. * 函數(shù)介紹 : Current_reduction() 電流減0.05A
  234. * 輸入?yún)?shù) :  無(wú)
  235. * 輸出參數(shù) : 無(wú)
  236. * 返回值   : 無(wú)
  237. */
  238.   void Current_reduction()
  239. {
  240.       
  241.       if(Step_into_target_marks==1)                    //開(kāi)啟步進(jìn)目標(biāo)值模式
  242.       {
  243.             if(U_Set <LOW_LIMIT )
  244.             {                                         
  245.                Step_into_target_marks=0;               // 清步進(jìn)目標(biāo)值模式
  246.                 U_Set = Init_Uset;                     // 目標(biāo)值恢復(fù)初始值
  247.                 TIM3->CCR2 = U_Set;                    // 更新PWM值
  248.                 PID_control_sign =start;                   //開(kāi)PID
  249.                 Point_target=0;                        //  準(zhǔn)備步進(jìn)調(diào)整電流                 
  250.             }
  251.             else
  252.             {
  253.                U_Set=U_Set-target_index;
  254.                TIM3->CCR2 = U_Set;                     // 更新PWM值
  255.             }
  256.       }
  257.            
  258.       else                                              //開(kāi)啟步進(jìn)電流模式
  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目標(biāo)值調(diào)整  
  269.          Point_target--;                            //  減0.05A
  270.            
  271.       }
  272.       }   

  273. }
復(fù)制代碼

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品毛片无码 | 久久综合成人精品亚洲另类欧美 | 国产精品久久久久久 | 精品成人av | 中文字幕在线不卡 | 91成人精品 | 亚洲欧美在线观看 | 日韩国产免费观看 | 国产午夜亚洲精品不卡 | 伊人网站 | 91精品国产综合久久婷婷香蕉 | 成人免费淫片aa视频免费 | 成人h片在线观看 | 国产精品区二区三区日本 | 日韩成人在线免费观看 | 亚洲一区亚洲二区 | 国产激情在线观看 | 国产一区二区在线观看视频 | 久久精品国产99国产精品亚洲 | 天天操 天天操 | 欧美黄色网络 | 九九热这里 | 亚洲一区三区在线观看 | 亚洲欧美日韩电影 | 国产成人精品久久二区二区91 | 欧美成人h版在线观看 | 亚洲国产日韩一区 | 久久伊人影院 | 国产偷久久一级精品60部 | 亚洲欧美成人影院 | 看一级毛片视频 | 欧美一区二区三区在线播放 | 国产乱一区二区三区视频 | 亚洲精品九九 | 波多野结衣一区二区 | jlzzjlzz国产精品久久 | 久久亚洲精品国产精品紫薇 | 午夜久久av | 伊人精品国产 | 狠狠干影院 | 久久久久久国产精品mv |