锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

关于直流稳压稳流软件的实现

时间:2023-07-09 04:37:00 直流大电容需要软起动

直流稳压源软件的实现

在电力电子中,主要的核心知识点是稳压稳流和稳功率,就像实验室中的稳压直流电源一样,你设置输出多少伏,比如25伏v,直流稳压电源为25v,不管你接什么负载,都是25v,也不能说是24.9v或者25.1v,要体现在一个稳定上面。

实验室的直流稳压电源基本上是一个整流模块和一个SG3525硬件闭环电路由同样的采样电路组成,但要达到高精度并不容易。在这里,我将分享我用软件实现的过程。

1、基础电路

博主所有的单片机都是stm32f4系列核心版,所需硬件电路大概是输入滤波电路,IR2184buck电路,电压电流电流。

1.1 滤波电路

滤波电路由大容量滤波电容组成,如63v 2200uF大电容主要是为了减少输入电压的波动。
我们使用大
滤波器电容器和钽电容器混合,但注意电容器的耐压值,输入电压不超过电容器的耐压值,否则电容器会爆炸!

1.2 IR2184驱动电路

相信所有做电力电子的同学都应该知道这个驱动芯片。熟练使用这个驱动芯片,可以掌握电力电子电流和交流的大片江山IR2210驱动芯片也能掌握半壁江山。

在这里,博主展示了电路图。如果想学的人有问题,他们会仔细思考,学到更多。让我们对伸手党说不!
这里IR2184电路的一般功能是你给出多少输入,他乘以你给出的输出PWM输出。良心很强。

1.3 采样电路

采样电路,一个是电压采样,另一个是电流采样。

1.3.1 电压采样电路

电压采样电路基本上是一个电阻分压电路。但是,您应该仔细检查采样系数,然后写下您的软件

1.3.2电流采样电路

电流采样,这里不涉及交流电流和电压,不需要额外的偏置,电流采样基本上是您串入采样电阻,然后通过测量电阻两端的电压,通过电压除以已知的电阻是电流。如果电流太小,请通过放大芯片放大电流,然后测量线性放大关系。一般来说,例如10m欧的电阻你放大100倍就刚刚好了。

由软件模块组成

2、PWM输出模块

pwm输出用于控制输出频率。虽然直流电路没有必要关心频率,但当电路应用于特定的地方时,如需要FFT分析等等之类的,这里pwm也是按照stm32正常配置相同。

//初始化TIM2 Channe2 PWM模式    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时模式;TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性 TIM_OC2Init(TIM2, &TIM_OCInitStructure);  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  TIM_ARRPreloadConfig(TIM2,ENABLE);ARPE使能  TIM_Cmd(TIM2, ENABLE);  //使能TIM2 

2.1 配置pwm输出频率和预装载值

TIM2_PWM_Init(400-1,7-1);    

定时器2挂在APB1上,APB1是84M的主频
有 84M/7=12Mh重装载值为400的计数频率pwm的频率为12M/400=30kHz

2.2 控制pwm占空比

定义一个叫duty变量表示占空比控制pwm的占空比为

if(duty>395)duty=200; if(duty<5)duty=200; TIM_SetCompare2(TIM2,duty); 

按键控制模块

按钮,即设置输出电压值,涉及大小步进、稳压、稳流模式切换、显示屏切换。还有其他的控制等等
以下是按键控制不同步进的实现:

void key_action(void){        key=KEY_Scan(0);        if(key!=lastkeyvalue){       if(key!=0){                          switch(key){              ... ...               case 10:if(goal_voltage<24)goal_voltage =index_goal;key=0;break;                case 11:if(goal_voltage>0)goal_voltage-=index_goal;key=0;break;                case 12:if(index_goal==0.05f)                              index_goal=0.2f;                         else if(index_goal==0.2f)                              index_goal=1;                         else if(index_goal==1)                               index_goal=0.05f;                          key=0;break;                     ... ...                 default:break;                 }             }             }         lastkeyvalue=key; } 

4、采样处理模块

事实上,这种直流采集更随意,随意采集,滤波处理不多,但我们最好同时采集,我们可以在大循环中单独控制时间,这里我借博客pwm输出定时器的计数时间采样。

void sample_process(void)//AD模块采样处理    {                  if(TIM_GetCounter(TIM2)>=360)     {         u8 j,k;         u32 adc_getvalue[4];         memset(&adc_getvalue,0,sizeof(adc_getvalue));         for(j=0;j<40;j  )         {             for(k=0;k<4;k  )                 adc_getvalue[k]  = adc_filter(10,aADCConvertedValue[k]);         }//PC3--[1] PC1--[3] PC2--[0] PA5--[2]         voltage1_calculate= (float)adc_getvalue[1]*33/(400*4096);         //voltage2_calculate= (float)adc_getvalue[2]*33/(400*4096);         current1_calculate= (float)adc_getvalue[0]*33/(400*4096);         //current2_calculate= (float)adc_getvalue[3]*33/(400*4096);                  memset(&adc_getvalue,0,sizeof(adc_getvalue));                  //线差,以前采样电路的实现         //adc_voltage1=6.157f*voltage1_calculate 0.06f;         adc_voltage1=6.222f*voltage1_calculate 0.012f;         adc_voltage2=voltage2_calculate;         adc_current1=current1_calculate;         adc_current2=current2_calculate;     }  

5、软起动,PI处理

在电路发生重大变化的过程中,一开始我们不想直接PI调节,因为PI一开始,调整范围相当大,希望有一个缓慢但不失去调整效果的过程,我们可以通过软启动来实现。

5.1 给标志位

什么时候软起动,什么时候PI调整,沿着上面,当软启动时,变化大,相对较小,PI调整稳定的电压电流

//处理标志 if(adc_voltage1-goal_voltage<=-0.3f || adc_voltage1-goal_voltage>=0.3f)    soft_flag=1;       if(adc_voltage1-goal_voltage<0.15f || adc_voltage1-goal_voltage>-0.15f)    PIDflag=1;

5.2 开闭环

之所以有开环,只是为了方便调节和校准之前的系数,当功能基本实现后们就可以不开闭环标志去掉了。

//开环模式
if(close_open_flag==1)
{
    if(duty-expect_open_duty<-5)duty+=1;
    if(duty-expect_open_duty>5)duty-=1;
    if(duty-expect_open_duty<-2)duty+=0.05f;
    if(duty-expect_open_duty>2)duty-=0.05f;
    
}
else if(close_open_flag==0)//闭环模式
{
    if(soft_flag==1)
    {            
        if(adc_voltage1-goal_voltage<-0.5f)duty+=1;
        if(adc_voltage1-goal_voltage>0.5f)duty-=1;

        soft_flag=0;
    }
    if(PID_flag==1)
    {
        pid.ActualSpeed = adc_voltage1;                
        duty += PID_realize(goal_voltage);
        
        PID_flag=0;
    }
}

可能有要求,软起动要一秒等等之类的,这时候只要改部分系数就好了。

6、显示+过流短路保护

6.1 显示部分

取决于你所用的显示器,博主我用的是OLED显示屏,像这些经常用的比如按键函数,显示函数等等功能明显,常用的自己一定要把它函数化,写成自己喜欢的形式。下面是博主我的部分显示:

void Oled_show(void)
{
   ... ...
   OLED_Refresh_Gram();
   OLED_ShowString(0,16,"goalInde:",16);
   OLED_ShowFloatNum(72,16,index_goal,7,16);    

   OLED_ShowString(0,32,"goal_val:",16);
   OLED_ShowFloatNum(72,32,goal_voltage,7,16);    
           
   OLED_ShowString(0,48,"real_val:",16);
   OLED_ShowFloatNum(72,48,adc_voltage1,7,16);
   ... ...
}    

6.2 过流保护短路保护

这里过流短路测试点都在电流大小上,可以软件实现也可以硬件实现,硬件电路可以用LM393比较电路,检测上升沿
软件实现的话,就只要判断电流是不是过大了。

if(adc_current1>=curr_given)
{
   A_Over=1;
   GPIO_ResetBits(GPIOD,GPIO_Pin_1);
   GPIO_SetBits(GPIOD,GPIO_Pin_2);            
}else
{
   duty=duty;
   cnt=100;
   A_Over=0;
   GPIO_SetBits(GPIOD,GPIO_Pin_1);
   GPIO_ResetBits(GPIOD,GPIO_Pin_2);
 }

过流保护短路都需要挂断一段时间,注意这个时间上的控制。

下篇文章中,博主也会讲解稳流源,稳功率电源的制作,但这一篇是最为重要的,希望能加强理解,下面是stm32源程序的下载链接,感兴趣的同学可以下载来看一下。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章