电流
直播中

爱与友人

9年用户 985经验值
擅长:可编程逻辑 模拟技术 存储技术
私信 关注
[问答]

数控电源的原理是什么

数控电源的原理是什么?
Buck电路的工作原理是什么?Buck电路有哪几种工作模式?

回帖(2)

张明

2021-10-15 11:58:58
  话说最近做了一个数控电源
  首先原理图来一个 看看原理
  
  既然讲到数控电源,难免讲解一下数控电源的知识点,升降压 MOS管,
  我所做的是BUCK降压电路
  一、Buck电路原理图
  
  Buck电路,又称降压电路,其基本特征是DC-DC转换电路,输出电压低于输入电压。输入电流为脉动的,输出电流为连续的
  二、Buck电路工作原理
  当开关管Q1驱动为高电平时,开关管导通,储能电感L1被充磁,流经电感的电流线性增加,同时给电容C1充电,给负载R1提供能量。等效电路如图二
  
  图二
  当开关管Q1驱动为低电平时,开关管关断,储能电感L1通过续流二极管放电,电感电流线性减少,输出电压靠输出滤波电容C1放电以及减小的电感电流维持,等效电路如图三
  
  图三
  三、Buck电路的三种工作模式:CCM,BCM,DCM
  1、CCM Mode:关键点原件波形见图四
  
  图四
  开关管Q1导通时,根据KVL定律:
  
  
  2、BCM Mode:关键点原件波形见图五
  
  图五
  
  3、DCM Mode:关键点原件波形见图六
  
  图六
  
  四、外为参数对系统工作模式的影响:
  
  图七
  
  五、BUCK电路仿真验证:
  
  
  图八
  
  
  2、CCM模式仿真验证:在上述BCM分析的基础上,得出储能电感的电感量80uH为临界点,由系统工作在CCM的条件,可以将储能电感电感量设置为120uH,理论计算:
  
  参照图十,可以得出仿真结果,
  
  
  3、DCM模式仿真验证:在上述BCM分析的基础上,得出储能电感的电感量80uH为临界点,由系统工作在DCM的条件,可以将储能电感电感量设置为40uH。重点验证输入输出电压关系以及输出平均电流关系。
  
  
  
  
  以上的知识点 是我在其他网站上看到的,觉得很不错,大家可以学习基本的BUCK电路,以此来设计属于自己的电路
  调压调流 具有过压保护
  过流保护
  MOS管的开启关断 ,双闭环控制 输出电压 电流采样
  输入电压采样 PID 算法
 #include "pid.h"

/**
  * @brief  pidInit
  * @param  None
  * @retval None
  */
void pidInit(PidObject* pid)
{
        pid->ap        = pid->kp * (1 + pid->dt / pid->ki + pid->kd / pid->dt);
        pid->ai        = pid->kp * (1 + 2 * pid->kd / pid->dt);
        pid->ad        = pid->kp * pid->kd / pid->dt;
}

/**
  * @brief  pidUpdate
  * @param  None
  * @retval None
  */
float pidUpdate(PidObject* pid, const float desired, const float now_value)
{
        float output=0.0f;
        
        pid->error = desired - now_value;

        pid->inc = (pid->ap * pid->error) - (pid->ai * pid->prevError1) + (pid->ad * pid->prevError2);
        
        output = pid->inc + pid->outLast1;
        
        if(output > pid->iLimitHigh)
        {
                output = pid->iLimitHigh;
        }
        
        if(output < pid->iLimitLow)
        {
                output = pid->iLimitLow;
        }
        
        pid->prevError2        = pid->prevError1;
        pid->prevError1        = pid->error;
        pid->outLast1        = output;
        
        return output;
}

/**
  * @brief  pid calear
  * @param  None
  * @retval None
  */
void pidClear(PidObject* pid)
{
        pid->error             = 0;
        pid->prevError1 = 0;
        pid->prevError2 = 0;
        
        pid->outLast1        = 0;
        pid->inc                = 0;
}


/**
  * @brief  pidReset
  * @param  None
  * @retval None
  */
void pidReset(PidObject* pid)
{
        pid->error             = 0.0f;
        pid->prevError1 = 0.0f;
        pid->prevError2 = 0.0f;
        pid->outLast1        = 0.0f;
        pid->inc                = 0.0f;
        
        pid->desired = 0.0f;
        pid->iLimitHigh = 0.0f;
        pid->iLimitLow = 0.0f;
        
        pid->dt = 0.0f;
        pid->kp = 0.0f;
        pid->ki = 0.0f;
        pid->kd = 0.0f;
        
        pid->ad = 0.0f;
        pid->ai = 0.0f;
        pid->ap = 0.0f;
        
}
   * @brief  This function ...
  * @param  None
  * @retval None
  */
static uint16_t cnt=0;
void myControlTask(void)
{
float fb_io=0.0f;
float fb_vo=0.0f;
float fb_w=0.0f;
// OLED_ShowChar(16, 2, ':', 16);
if(device.outputState!=0)
{
  
  device.iovp = (power.Vi>PW_VOLTAGV_IN_MAX)?1:0;  //输入过压保护
  device.iuvp = (power.Vi   device.oocp = (power.Io>PW_CURRENT_OUT_MAX)?1:0; //输出过流保护
  device.oovp = (power.Vo>(PW_VOLTAGV_OUT_MAX+0.5f))?1:0; //输出过压保护
  
  if(device.iovp||device.iuvp||device.oocp||device.oovp)
  {
   PWM_Stop();
   device.recoveryCnt = 0;
   LED_OUT_OFF;
   LED_CV_CC_OFF;
  }
  else
  { //故障恢复
   device.recoveryCnt = (device.recoveryCnt>device.faultTime)?device.recoveryCnt:device.recoveryCnt+1;
  }

  fb_io = ((float)power.channel[1] - calib.ioZero) * calib.ioRatio;
  fb_vo = power.channel[2] * calib.voRatio;
  if(fb_io<0)
  {
   fb_io = 0;
  }
  /* 大电流补偿压差 */
  #if _USE_COMPENSATE
  fb_vo -= (fb_io * 0.05f);
  if(fb_vo<0)
  {
   fb_vo = 0;
  }
  #endif
  /*  */
  
  /* 恒功率 */
  #if 1
  fb_w = fb_vo*fb_io;
  if(fb_w>250.0f)
  {
   PWM_Stop();
   device.recoveryCnt = 0;
   LED_OUT_OFF;
   LED_CV_CC_OFF;
  }
  #endif
  /* */

  if(device.recoveryCnt==device.faultTime) //恢复PWM波形输出
  {
   pidClear(&vPID);
   pidClear(&iPID);
   device.controlPWM = 0;
   PWM_Start();
   PWM_Update(device.controlPWM);
   LED_OUT_ON;
  }

  if(device.recoveryCnt>=device.faultTime)
  {
   switch(device.controlMode)
   {
    case CV_MODE:
     device.controlPWM = pidUpdate(&vPID, vPID.desired, fb_vo); //电压环PID计算     
     iPID.outLast1 = device.controlPWM;
     device.controlMode = (fb_io      if(cnt%50==0) { LED_CV_ON; }
     break;
    case CC_MODE:
     device.controlPWM = pidUpdate(&iPID, iPID.desired, fb_io); //电流环PID计算
     vPID.outLast1 = device.controlPWM;
     device.controlMode = (fb_vo>vPID.desired)?CV_MODE:CC_MODE;
     if(cnt%50==0) { LED_CC_ON; }
     break;
    default:
     device.controlMode = CV_MODE;
     break;
   }
   
   PWM_Update(device.controlPWM);
  }

  cnt++;
}
}
举报

王栋春

2021-10-15 22:39:38
了解一下,没有软件基础不行呀
举报

更多回帖

发帖
×
20
完善资料,
赚取积分