打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32控制的闭环zvs升压器(PID控制)
本文来源于  科创研究院
一直以来看了论坛很多的电P帖子,一直想要做个多级加速的,材料也买了不少,结果总使因为各种原因耽搁下来。在我爸的鼓励下终于准备设计制作一个多级加速的电磁P,目前的准备是做一个磁阻P。在今年五月份的时候其实已经做了一个电磁P,不过是单极的。当时学校组织了个比赛要求做个两轮平衡车,我感觉光做平衡车没啥意思然后又开板整了个遥控器,缠了个单极的磁阻P加上云台和上弹装置。我叫它“平衡P台”
。晒一下我的平衡P台~
咳咳,有些跑题了,但其实在焊这个平衡炮台电路时就有用闭环控制ZVS的想法,就是将被充电电容两端的电压分压后经过运放构成的电压跟随器后由STM32adc采集然后用50HZ的PWM脉宽调制MOS管。这是之前看金坷居士在一篇帖子中提到的,金坷居士:“我目前认为唯一的可能就是低频PWM(50Hz左右,高了照样破坏ZVS,50Hz也会多少破坏)控制ZVS,像我已经实现了ZVS的准闭环,但我还是觉得闭环ZVS有难度,如果要搞调压的软开关电源,还是选择它激方案吧”。只是当时比赛时间有限,加上了电路却没这么用,只是大概延时充电了2秒然后发射。  因为ZVS简单好焊,所以一直以来都是用的普通的ZVS电路。电路在金坷居士的终于驾驭了ZVS这匹烈马!电磁仓升压电路发布!上改的。
在画红圈处加了个10k的电阻,在之前的“平衡炮台”上没加这个电阻,也没配置于与PWM_IN连接的stm32的引脚,然后两个MOS管莫名奇妙就炸了。。。然后只好加一个接地跳线帽,不用时给PWM_IN接地。但现在加上这个10k电阻就没再炸过。画蓝圈的地方最好加上个3.3v稳压管,不然如果电压过高直接进入STM32的ADC采集引脚会把STM32烧坏的(我就烧了一个)。实物图如下:
我没接运放直接分压接到STM32的ADC采集引脚了,因为第一次焊的lm324不管用,没有驱动能力,以为是电路的焊接问题,然后又重新焊了一个,结果还是没有驱动能力。。。然后量了下lLM324输入电阻甚至低到了几百欧姆,因为手里只有双电源运放op07了,所以就没有接运放。
因为STM32的ADC输入电阻最大只有350k,而且受采集速度的影响,速度越快,电阻越小,我把速度调到最慢,用万用表测了下大概是16M左右(知道是不是因为万用表坏了的原因,之前测电压超量程了,之后测什么的电压都会比实际高上一些)所以我感觉不太影响就直接接上了(当然接齐纳二极管了
,可不想再烧个32)。
代码就是配置了一路ADC和通用定时器TIM3,ADC在触发转换完成中断时更新全局变量ADC_ConvertedValue的值。考虑到不能让ZVS开启时间太短,又测了该ZVS率是40kHz,所以设置TIM3的预分频(PSC)为7199,自动装载寄存器(ARR)为1999。这样产生的PWM频率为72MHz/(PSC*ARR) = 50HZ,占空比可以在0~2000间调节。
int Voltage_Control(int v_now,int v_want){ static int e_v_integral; int Voltage_pwm = 0; int e_voltage = 0; //电压误差 static int e_voltage_old; //前次电压误差 static int voltage; voltage = voltage *0.7 + v_now*0.3; //滤波 e_voltage = v_want - voltage; //求出误差 e_v_integral += e_v_integral ; //对误差积分 e_v_integral = LIMIT(e_v_integral,10000,10000); //积分限幅 Voltage_pwm = kp * e_voltage + ki*e_v_integral + kd * (e_voltage - e_voltage_old); e_voltage_old = e_voltage; Voltage_pwm = LIMIT(Voltage_pwm,0,2000); //对输出的占空比限幅 return Voltage_pwm;}int main(void){ /* led 端口配置 */ LED_GPIO_Config(); /* 定时器初始化 */ GENERAL_TIM_Init(); // 配置串口 USART_Config(); // ADC 初始化 ADCx_Init(); TIM3->CCR1 =0; while(1) { TIM3->CCR1 = Voltage_Control(ADC_ConvertedValue,2048); //调节占空比 printf("\r\n%d",ADC_ConvertedValue); Delay(0xffff); }}  写了个简单的PID控制电压函数,在while(1)里循环调用,并把返回值赋值给TIM3通道1的CCR寄存器控制PWM输出的占空比。因为占空比最大是2000,而输入的电压值为0-4096对应0-3.3v(因为32里的ADC是12位的所以是4096)。最大占空比2000除最大误差4096大概是0.48,所以kp大概可以在0.4左右取,调试几个数后发现有过充和低频的电压上下浮动,于是加上kd,然后发现有一直有个静差,果断加上ki,经过几个数的调试后可以达到不错的控制效果,电压在正负2v内变化。
上图是stm32采集到的电压值,看起来还是大概在我设置的2048上的,再仔细调调PID的kp,ki,kd参数估计会有更好的效果。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32 ADC规则组和注入组配置方法
STM32学习之PWM DAC实验中的滤波电路部分元件参数的由来问题
STM32脉宽调制(PWM)控制直流风扇的速度占空比
创意DIY:改造9.9元包邮的小电磨,增加堵转保护和点动功能且开源
​Robomaster C板再体验
STM32F0单片机 PWM + ADC 控制有刷电机
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服