初学开关电源,搭了一个boost的基本原理图,但是在进行mosfet采样电流的时候发现功率管上的电流有过冲现象。(应该是加在功率管栅极的周期信号所导致)。请问pwm输出信号反馈回来后也会导致功率管上的电流过冲吗?应该怎么改善?这样能正确采样出电感电流吗?图为电感电流和功率管电流,功率管栅极电压
可能是由于PWM信号控制的MOSFET的开关速度太快,导致了电流过冲的现象。可以尝试通过增加RC滤波电路来缓解这个问题。可以在MOSFET的栅极和源极之间添加一个小电阻和大电容的滤波电路,使得栅极信号的变化更加平缓,从而减小电流过冲的现象。至于PWM输出信号反馈回来后是否会导致功率管上的电流过冲,这要看具体的电路设计。一般来说,反馈信号不会直接导致功率管上的电流过冲,但是如果反馈信号存在噪声或者干扰,可能会对电路稳定性产生影响。在采样电感电流时,可以使用一个电流采样电阻来实现。将电流采样电阻串联在电感上,然后通过差分放大器将电压信号转换为电流信号。在选取电流采样电阻时需要注意其功率和阻值,以保证采样精度和稳定性。
答:是的,当加在功率管栅极的周期信号被反馈回来时,会导致功率管上的电流过冲。为了改善这种情况,可以通过在输入回路中串联一个电容器来限制周期脉冲的幅值,从而减小过冲的影响。
这样能正确采样出电感电流吗?
答:可以,因为电感电流和功率管电流的幅值相等,因此可以用同频率的正弦波进行采样。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,当pwm信号导致开关管电流过冲现象时,有可能是由于 MOSFET 的上升沿和下降沿太陡峭导致的,因此可以考虑添加反馈电路降低 MOSFET 的开关速度。其次,可以在 MOSFET 的栅极和源极之间添加一个二极管,来防止反向电流的冲击。
如果PWM输出信号反馈回来也会导致功率管上的电流过冲,那么可以考虑使用滤波器和保护电路,如添加保护二极管和约束电阻等。
至于如何采样电感电流,可以使用差分放大器或者霍尔传感器等方法进行电流测量。采样电流需要使用ADC进行数据转换,可以使用STM32、Arduino等单片机开发板进行开发。
下面是一份Python代码实现基于STM32F103C8T6单片机测量电感电流的示例:
#include "stm32f10x.h"
#define Sample_Number 100 //采样次数
#define V_REF 3300 // ADC参考电压(mV)
uint16_t ADC_Value = 0;
float ADC_Voltage = 0;
float ADC_Current = 0;
float sum = 0;
float gain = 3.3 / 4096;
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); //使能ADC1和GPIOA时钟
//GPIOA.1配置为模拟输入口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式下
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模拟通道禁止扫描模式,扫描模式将由程序控制转换通道
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //禁止连续转换模式,只作为单次转换使用
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //禁止外部触发转换,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采样数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //采样通道数
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); //配置ADC1的通道1,采样时间为239.5个时钟周期
ADC_DMACmd(ADC1, DISABLE); //禁止DMA请求
ADC_Cmd(ADC1, ENABLE); //使能ADC1
}
float Current_Calculation(float value)
{
float ADC_Current = 0;
ADC_Voltage = (float)value / 4096 * V_REF;
ADC_Current = (ADC_Voltage - (V_REF/2)) / (0.1*gain);
sum += ADC_Current;
return ADC_Current; //返回电流值
}
int main(void)
{
ADC_Configuration();
while(1)
{
for(int i = 0; i < Sample_Number; i++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开启ADC转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换结束
ADC_Value = ADC_GetConversionValue(ADC1); //得到ADC采样值
ADC_Current = Current_Calculation(ADC_Value);
}
ADC_Current = sum / Sample_Number; //取100次采样的平均值,防止采样噪声
sum = 0; //清零
}
}
如果我的回答解决了您的问题,请采纳!