找回密码
 立即注册

QQ登录

只需一步,快速开始

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

双路DC-DC 电流成比例 STM32程序

[复制链接]
跳转到指定楼层
楼主
类似15年国赛电源题目,两路DC-DC电压控制,电流成比例

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "BSP_Config.H"
  3. #include "oled.h"
  4. #include "pwm_output.h"
  5. #include "adc.h"
  6. #include "stdio.h"
  7. #include "pid.h"
  8. #include "key.h"

  9. /*---------------变量区------------------*/
  10. /*sprintf显示所用数组*/
  11. u8 dataStr[30];
  12. /*DMA存储的值,volatile类型*/
  13. extern __IO u16 ADC_ConvertedValue[50][3];
  14. float Current;
  15. /*ADC滤波后原始数据*/
  16. u16 ADC_Data_raw[3]={0,0,0};//adc原始数据       
  17. u8 Load_flag=0;
  18. extern u8 mode;//按键设置模式
  19. extern float adc[3];
  20. float PID1,PID2,PID3,Cur1,Cur2,Vol;
  21. u16 pid_except=2480;
  22. u16 pid_except1=2480;
  23. /*---------------变量区------------------*/
  24. int main(void)
  25. {  
  26.   SystemInit();
  27.   SysTick_init();                     //延时初始化
  28.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  29.         TIM1_Mode_Config(6000-1,0);
  30.         TIM3_Mode_Config(6000-1,0);
  31.   SPI2_Init();                              //初始化SPI硬件口       
  32.         KEY_Init();
  33.   OLED_Init();                         //初始化OLED      
  34.         TIM2_base();//初始化定时器,定时器中断中处理adc读数
  35.         ADC1_Init();
  36.        
  37.   while (1)
  38.   {
  39.                
  40.                 if(mode==0)
  41.                 {
  42.                         Current=(0.9341*(float)ADC_Data_raw[1]-11.4)/4096*3.3;
  43.                         if(Current>2.5)
  44.                         {                       
  45.                                 OLED_Clear();
  46.                        
  47.                                 OLED_ShowString(40,32,"Warning");
  48.                                 TIM1->CCR2=0;
  49.                                 delay_ms(5000);
  50.                                 TIM1->CCR2=PID1;
  51.                                 delay_ms(500);       
  52.                                 OLED_Clear();               
  53.                         }
  54.                         else if(Current<=2.5)
  55.                         {
  56.                                
  57.                                 PID1=Pid_TIM1_control(pid_except);
  58.                                 TIM1->CCR2=PID1;
  59.                                 sprintf((char *)dataStr,"V:%1.3fv  A1-9",adc[0]*4);// a1
  60.                         //sprintf(dataStr,"V:%1.3fv  (PA1)",(float)ADC_ConvertedValue[0][0]/4096*3.3);// a1
  61.                                 OLED_ShowString(1,0,dataStr);
  62.                                 sprintf((char *)dataStr,"A:%1.3fa  (PA4)",Current);
  63.                                 OLED_ShowString(1,16,dataStr);
  64.                                 sprintf((char *)dataStr,"w:%1.3f",Current*adc[0]*4.0);//
  65.                                 OLED_ShowString(1,32,dataStr);
  66.                                 sprintf((char *)dataStr,"e:%4d",pid_except);//功率
  67.                                 OLED_ShowString(1,48,dataStr);
  68.                                 sprintf((char *)dataStr,"m:%d",mode);
  69.                                 OLED_ShowString(90,48,dataStr);                                
  70.                         }        //else if               
  71.                 //TIM3->CCR1=PID2;
  72.                 }//if(mode==0)
  73.                 else
  74.                 {
  75.                         PID2=Pid_TIM1_control((0.9773*(float)ADC_Data_raw[1]-47.5)*1.07);
  76.                                 TIM1->CCR2=PID2;
  77.                         PID3=Pid_TIM3_control(pid_except1);
  78.                                 TIM3->CCR1=PID3;
  79. ////                        Cur1=(0.9341*(float)ADC_Data_raw[0]+8.688)/4096*3.3;
  80.                         Cur1=(0.9341*(float)ADC_Data_raw[0]-11.4)/4096*3.3;
  81.                         Cur2=(0.9773*(float)ADC_Data_raw[1]-47.5)/4096*3.3;
  82.                         Vol=(float)ADC_Data_raw[2]/4096*3.3*4;
  83.                        
  84.                                 sprintf((char *)dataStr,"A:%1.3fa",Cur1);
  85.                         OLED_ShowString(1,0,dataStr);
  86.                                 sprintf((char *)dataStr,"A:%1.3fa",Cur2);
  87.                         OLED_ShowString(1,16,dataStr);
  88.                                 sprintf((char *)dataStr,"V:%1.3fv",Vol);
  89.                         OLED_ShowString(1,32,dataStr);
  90.                                 sprintf((char *)dataStr,"e:%1.2f",(float)pid_except1/4096*3.3);
  91.                         OLED_ShowString(80,32,dataStr);
  92.                                 sprintf((char *)dataStr,"P:%1.3fw",Vol*(Cur1+Cur2));
  93.                         OLED_ShowString(1,48,dataStr);
  94.                                 sprintf((char *)dataStr,"m:%d",mode);
  95.                         OLED_ShowString(90,48,dataStr);                
  96.                 }
  97.                 key_scan();       
  98.         }//while(1)
  99. }
复制代码

所有资料51hei提供下载:
并联 -随动 - mode.7z (180.3 KB, 下载次数: 33)

QQ截图20190629200240.jpg (122.77 KB, 下载次数: 38)

QQ截图20190629200240.jpg

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:146296 发表于 2019-7-21 21:23 | 只看该作者
参考一下
回复

使用道具 举报

板凳
ID:511461 发表于 2019-7-23 10:08 | 只看该作者
楼主,能不能解释一下
回复

使用道具 举报

地板
ID:282095 发表于 2019-7-23 11:31 | 只看该作者
芯鹏伟的电源芯片不错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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