找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2899|回复: 1
打印 上一主题 下一主题
收起左侧

正点原子stm32mini开发板做2015年国赛题目双向DCDC程序

[复制链接]
跳转到指定楼层
楼主
电压采集曲线拟合


PID参数调整


单片机源程序如下:
  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. //外部函数调用说明:
  28. void    system_init(void);
  29. void    Query_button(void);                                 //键盘扫描函数
  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);                            // 显示刷新扫描函数
  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;                                             //滤波次数设置
  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};//恒流数组
  62. int     Point_target=0;
  63. u16     Ini_value_tim2=10-1,Divid_tim2_val=72-1;                        // 定时器2装载初始值和分频值  10us//PID调整量,PID设定值
  64. /**********************************************************/


  65. int main()
  66. {

  67.        U_Set =  adjust_current[0] ;                            //设定初始目标值U_Set
  68.         PWM_set(Duty);                                           //PWM输出
  69.            system_init();                                           //系统参数初始化
  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位抢占优先级,8位响应优先级   
  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. * 函数介绍 : 按键扫描  
  143. * 输入参数 :  无
  144. * 输出参数 : 无
  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. * 函数介绍 : Increase_current() 电流加0.05A 以及步进调整电流2A
  173. * 输入参数 :  无
  174. * 输出参数 : 无
  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目标值调整
  209.          Point_target++;                               //自加0.05A   
  210.             
  211.         }
  212.       }
  213. }
  214. /*
  215. * 函数介绍 : Set_mode() 选择模式充电,放电自动
  216. * 输入参数 :  无
  217. * 输出参数 : 无
  218. * 返回值   : 无
  219. */
  220. void Set_mode()
  221. {



  222. }
  223. /*
  224. * 函数介绍 : LCD是否需要刷新判断  并响应程序
  225. * 输入参数 :  无
  226. * 输出参数 : 无
  227. * 返回值   : 无
  228. */
  229. void  LCD_refresh()
  230. {



  231. }      
  232. /*
  233. * 函数介绍 : Current_reduction() 电流减0.05A
  234. * 输入参数 :  无
  235. * 输出参数 : 无
  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;                        //  准备步进调整电流                 
  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目标值调整  
  269.          Point_target--;                            //  减0.05A
  270.            
  271.       }
  272.       }   

  273. }
复制代码

所有资料51hei提供下载:
双向DC-DC(old version).7z (208.92 KB, 下载次数: 92)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:323951 发表于 2022-8-28 02:24 | 只看该作者
感谢楼主分享,要是有个原理图就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表