谈一谈灭弧电路部分。
因为是理论论证,为了节约开发周期和成本。
我把灭弧电路与BUCK驱动电路做在一起。
所以这块PCB是有独立调制功能的,也可以从远端通过光纤进行控制。
这些功能的选择通过跳线帽来实现。
原理图如下
清晰原理图PDF下载:
Qbuck_control.pdf
209.76KB
PDF
306次下载
预览
这张原理图的BUCK部分与新加坡的Gaoguangyan提供的原理相同。
同为使用TL3016高速比较器对输入电压与反馈电压进行比较跟随。
通过乒乓控制的方式,使电流波形在一定程度上保持稳定。
实际工作的过程中,我观察到波形的形状与电弧长度与形状关系很大。
闭环能够有效解决电容电压下降,带来的波形失真。
当然还有一种方法是实现同步整流,这样要多出一个死区发生电路与低端驱动。
从最简化设计的角度来看,我选择了比较器方案。
-
而驱动部分,则由于并管数量较多。
并且考虑到未来可能把BUCK功率管拓展为功率模块。
驱动的负载大约在20-40nF大小。
为保险起见,使用了来自大M设计的单供电,正负电压输出IGBT驱动。
实测驱动30nF的负载,上升下降时间能够有效控制在200/150nS。
驱动电压的幅度为-9~+15V。能够有效满足IGBT驱动的需求。
这部分电路优秀的性能确定了,在脉冲功率高达20KW时,以1BPS的频率工作。
BUCK桥整体冰凉,为增加稳定性创造了一个良好的先决条件。
-
MCU部分则是使用了STM8S105K4系列的单片机。
我选择STM8S单片机作为智能灭弧的控制方案的原因有三个
1:我喜欢用这个单片机
2:资源数量刚好足够
3:电源允许变化范围较大
从电路设计的角度上讲,3.0~5.5V的供电电压,完全可以使用锂电池对单片机直接供电。
但是出于保险考虑,TOSHIBA的光纤头DLT1150/DLR1150的供电电压必须是5V。
所以最终选用的电源电压由一个升压模块提供。
升压模块的型号为UMT3608。输入电压范围为0.8V-VCC。
所以这套灭弧系统可以使用一节、两节、三节干电池进行供电。
实际上我是使用一块手机锂电池进行供电。
为了防止过放和电量检测,我在STM8上分出一路ADC对电池电压进行采集。
而基准电压可以由VCC和内部1.8V电压基准进行对比,精度对于保护过放足够。
另一路ADC资源分配给了NTC电阻,这个电阻可以用来指示工作温度。
或者在整板使用的时候,贴在散热器上,对BUCK桥工作温度进行监测保护。
代码灵活性非常大,可以拓展的用途也许会很多。。。
灭弧实际使用的资源为TIM1 旋转编码器 TIM2 TIM3产生调制PWM&灭弧方波
TIM4则负责辅助以上定时器完成系统节拍,与全局变量更新获取。
实际上数字灭弧的好处是发生脉宽准确且易于调节。
QCW的调制波形是一段有台阶的上升波形。
影响电弧的因素包括初始台阶的高度、上升斜率、下降斜率、最大电平高度。
重复频率的影响则不是很大,这一点与工作在S路线的DR有着很大区别。
而模拟电路使用触发器+RC电路的方式,也能够实现锯齿波发生。
相对来说是不需要写代码,简单,缺点则是参数较为固定单一。
-
而代码的核心部分在于一个波形发生函数。
贴在下面仅供参考:
typedef struct {
uint S_ontime; //per100us 10-250(1ms-25ms)<*100>
uint S_offtime; //pr100ms 2-50(0.2s-5s)
uint S_top; //top(%)10~200(5%-100%)
uint S_scale; //scale = rise/rise+fall time 10~190(5%-95%)
}Slope_param_info;
/*global struct info*/
Slope_param_info SPARAMINFO ={100,2,200,180};
/* CUT LINE */
void Reload_Slope_Table(Slope_param_info SPF_info)
{
static uint S_risetime,S_falltime;
static float Ua,Fa;
S_risetime=(uint)(SPF_info.S_ontime*SPF_info.S_scale/200);//(100uS)
S_falltime =(uint)(SPF_info.S_ontime-S_risetime);//(100uS)
Ua=(float)(SPF_info.S_top/S_risetime);//bit
Fa=(float)(SPF_info.S_top/S_falltime);//bit
for(uint i=1;i<250;i++) { if(i<s_risetime) { if((spf_info.s_top-slope_table[i-1])<ua) { slope_table[i]="SPF_info.S_top;" } else } if(i>=S_risetime)
{
if(Slope_Table[i-1]<fa) { slope_table[i]="0;" goto end_table; } else } } end_table: return ; } < code></fa)></250;i++)></*100>
代码非常简洁易懂。
主体控制思想来自于使用一个名为Slope_param_info的结构体。
来把锯齿波进行抽象化。
其中
Ontime成员对应锯齿波宽度
top成员对应锯齿波最高电平
scale成员则是对应锯齿波上升与下降时间占比
这样就把锯齿波通过程序抽象控制,任何一个锯齿波可以视为结构体的例化。
而
void Reload_Slope_Table(Slope_param_info SPF_info)
函数则描述了一个可以将这个抽象变量重载入一个名为Slope_Table[250]的一位数组的方法。
具体控制原理也非常简单,浮点精确计算出斜率。
并且由for循环控制,把需要产生的锯齿波形载入表格,从而完成调制PWM。
来看看程序仿真结果
这是产生的表格文件导出
Watch1.log
8.03KB
LOG
130次下载
点击下载波形文件
可以看到,按照结构体设定的变化,产生了一个从0-高从高-0的波形文件。
这个文件按照一定时间载入PWM发生器中,就可以实现调制。
用ST-LINK V2的Data Graph功能能够观察到数据的变化趋势。
这段代码来自V1.3.A版本。
现在的Reload函数与贴出来的部分有一点小小的区别。
针对波形顶端和精度有一定程度的优化,等最终定版会再做修改。
有兴趣可以保持关注。
这是灭弧器的内部,由于还是实验版本接线比较乱。
但是已经实现了插入充电自动断电,以及低电量报警保护等功能。
待进一步完善吧。