找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4736|回复: 4
收起左侧

基于stm32的自制pid闭环单相逆变电源源程序

[复制链接]
ID:521357 发表于 2019-7-29 23:46 | 显示全部楼层 |阅读模式
pid闭环调制基于stm32f4的程序控制的单相逆变电源程序

单片机源程序如下:
  1. #include "stm32f4xx.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "bsp_advance_tim.h"
  5. #include "bsp_spwm.h"
  6. #include "ShuangLu.h"
  7. #include "PID.h"
  8. #include "bsp_adc.h"
  9. #include "SD_io.h"
  10. #include "oled.h"
  11. #include "filter.h"
  12. #include "bsp_spwm.h"
  13. #define   current_threshold  3

  14. u8 DispADBuff[2][30];          //用于存放字符
  15. extern u16 ADC_ConvertedValue[NOFCHANEL];//DAC_DMA传值处
  16. extern PID pid_voltage;         //存放电压PID的参数
  17. extern float ADC_Final_DisplayValue[NOFCHANEL];        //用于存放最终显示值
  18. extern u16 ADC_filter_Value[NOFCHANEL];                                                                //用于存放滤波后值
  19. extern u8  AD_Flag;
  20. u32 Display_flag=0;//是否显示,PID是否更新
  21. extern PID pid_voltage;
  22. u8 PID_start=0;

  23. int main(void)
  24. {
  25.        
  26.         delay_init(168);
  27.         ShuangLu_Init();
  28.         ADC_X_Init();
  29.         TIMx_Configuration();
  30.         OLED_Init();
  31.         PID_init(0.001,0.001,0,SPWM_default_ratio);
  32.        
  33. while(1)
  34.         {                
  35.                  
  36.                
  37.                 if(Display_flag%1000==0)
  38.                 {
  39.                         AD_Flag=AD_voltage;  ADC_filter_Value[0]=middleValueFilter();
  40.                         AD_Flag=AD_current;  ADC_filter_Value[1]=middleValueFilter();       
  41.                         ADC_Final_DisplayValue[0] =(float) ADC_filter_Value[0]/4096*3.3*36.7862-46.285;   //电压检测
  42.                         ADC_Final_DisplayValue[1] =(float) ADC_filter_Value[1]/4096*3300*1.448-18;         //电流检测
  43.                         //PID电压计算输出,设定值24V,输入电压检测值
  44.                         if((ADC_Final_DisplayValue[0]/24>0.98)&&(ADC_Final_DisplayValue[0]/24)<1.02)PID_start=1;
  45.                         if(PID_start==1)PID_Calc(ADC_Final_DisplayValue[0],24,0.8,0.2);
  46.                        
  47.                 }
  48.                 if((Display_flag>10000)||(Display_flag==1))
  49.                 {
  50.                   sprintf(DispADBuff[0],"V=%.2fV\0",ADC_Final_DisplayValue[0]);//电压显示
  51.                   sprintf(DispADBuff[1],"I1=%.3fA\0",ADC_Final_DisplayValue[1]);//电流显示
  52.                         OLED_ShowString(0,0,DispADBuff[0]);
  53.                   OLED_ShowString(0,2,DispADBuff[1]);
  54.                         Display_flag=2;               
  55.                 }
  56.                
  57. //                if(ADC_Final_DisplayValue[2]>current_threshold)
  58. //                {               
  59. //                        GPIO_SetBits(SD_io_PORT,SD_io_I1|SD_io_I2);
  60. //                        delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);delay_ms(1000);
  61. //                        pid_voltage.SEk=0;
  62. //            GPIO_ResetBits(SD_io_PORT,SD_io_I1|SD_io_I2);
  63. //                }
  64.                
  65.         }
  66. }
复制代码

所有资料51hei提供下载:
互补SPWM+模拟死区开关方波+PID+ADC (单极性)1.7z (326.91 KB, 下载次数: 184)
回复

使用道具 举报

ID:1 发表于 2019-7-30 17:13 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:511461 发表于 2019-8-1 18:59 | 显示全部楼层
多谢大佬分享
回复

使用道具 举报

ID:440028 发表于 2022-1-28 10:41 | 显示全部楼层
资料不完整的最好不上传
回复

使用道具 举报

ID:859852 发表于 2022-2-8 22:56 来自手机 | 显示全部楼层
资料不全,误人子弟  .道德沦陷.......
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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