• 3
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【你买套件我买单】stm32M0数字电源学习板

很荣幸能够参加电源网的你买套件我买单活动,此次我选择的套件是基于STM32M0的数字电源学习板。苦于对模拟环路调试的一脸懵逼,每次牵一发而动全身的阻容匹配,决心学习数字环路。

①开箱检查:

开箱,结果发现只有一块电路板,啥也没有。打开盒子,取出学习板套件。检查套件内部是否完整,包括STM32M0主板、电源模块(没有送,可能卖家没配?)、显示屏模块(看起来是OLED12864)。

所以我自己准备了一个24V的可调电源和一个电子负载用来做测试。将主板与电源模块端子相连接,要注意正负极,并进行紧固。然后将数字电源输出端和电子负载相连接,固定。将显示屏的插头与主板相对应插入,插好后轻轻按紧。

测试平台如下图所示:

设置电子负载:根据实际需求,设置电子负载的电流、电压等参数,并开启电子负载。设置STM32M0电源模块,可以设置的只有电压和电流(它们会根据负载电阻的大小工作在CC或者CV模式)

进行测试:启动电子负载并进行测试,观察电子负载的输出情况,以及数字电源信号调节模块,可以用显示屏模块观察实时电压和电流,以判断模块是否正常工作。在测试之前,一定要先确认连接线路是否正确并保证电压和电流值不要超出标准范围(0-24V),以避免对设备造成损坏。同时,在测试过程中,注意不要加太大的电流,电流大于5A会导致模块发热严重。

数字电源学习板套件的原理图如下图所示:

该电路原理图包含了BUCK主电路拓扑,电压电流检测,输入电压检测,辅助电源XL7005A,辅助电源AMS1117,下载接口,按键,编码器,OLED接口,LED显示,EG3013驱动芯片,蜂鸣器和STM32F030K6T6等部分。

BUCK主电路拓扑:该部分包含BUCK转换器的核心电路,用于实现输入电压的降压转换,产生可控的输出电压以供后续电路使用。

电压电流检测:该部分主要用于检测输出电压和电流,以便进行电路保护和数据采集等操作。

输入电压检测:该部分用于检测输入电压,以便进行过压保护和数据采集等操作。

辅助电源:该部分包括XL7005A和AMS1117两种辅助电源,用于提供稳定的供电电压,以支持后续电路的正常工作。

下载接口:该部分用于与计算机进行连接,实现固件程序的下载和烧录。

按键和编码器:该部分主要用于人机交互,通过按键和编码器进行参数设置和调整操作。

OLED显示:该部分用于显示输出电压和电流等相关信息,以方便实时监测和调整。

EG3013驱动芯片和蜂鸣器:该部分用于实现电路保护和报警功能,例如当输出电流超过一定范围时,可以通过EG3013驱动芯片进行输出短路保护,同时也可以通过蜂鸣器进行报警提示。

 

STM32F030K6T6:该部分为控制核心,通过控制BUCK主电路拓扑和电路保护等部分,实现对输出电压和电流的精确控制和保护。

电路非常简单,难就难在控制部分设计和代码架构上。

②分享学习STM32控制电源的相关知识:

2.1定时器配置

不同于电机控制或温度控制的PID程序,电源PID对MCU实时性要求很高,因此定时器的配置很大程度上影响了控制算法的效果。电源的环路通常都是开关频率的十分之一左右,100kHz的开关频率,对应的控制带宽就是十kHz。因此,首先讨论定时器配置。

上电之前先要进行初始化,初始化包括以下内容:

这里我们暂时不知道定时器3和定时器14的功能。但是可以看到作者应该把编码器设置的电压电流值保存在了系统Flash的固定地址中并进行开机跟新。可以看到ecall的数组结构如下图所示,内部保持了一些编码器的设置参数。预计这个结构体在每次编码器发生变化时都会进行跟新并保存到内存。

从编码器的代码看出,并没有保存到内存,但是有对结构体进行跟新,如下图所示。

这里用到了两个定时器

直接看timer.h文件,看定时器的频率。TM14是12.5kHz,TIM3是100Hz。系统时钟是48MHz,定时器时钟是1M和10k.定时器配置.C程序就不多解释了,基本就是设置时钟,设置装载值。关键看在定时器中断中程序做了什么。定时器做了什么在STM32存放中断的.C文件中:STM32F0xx_it.C.如下图所示。

可以定时器14是用来执行控制算法的,说明控制带宽是12.5kHz。另一个定时器3是这段代码是针对定时器TIM3的中断服务函数,主要作用是在定时器产生更新事件时,对该事件进行处理。首先,通过判断TIM3是否产生了update事件,来确定是否需要进行处理。如果确实发生了update事件,就先清除该事件的标志位。然后,代码检测是否需要打开蜂鸣器,如果需要,则每次定时器中断时对计数器buzzer_cnt进行累加,并判断其是否已经超过BUZZER_SOUND_TIME(定义在其他地方的宏),如果超过了,则关闭蜂鸣器,并将计数器清零,以实现蜂鸣器的持续声音时间控制。需要说明的是,该中断服务函数并没有对定时器计数器进行操作,而是仅仅在update事件发生时进行了处理,所以就是用来控制蜂鸣器的,有点浪费。

可以看到,是以12.5kHz的速率去更新PWM的。也就是全靠定时器14的中断触发来执行PWM更新。问题是ADC采集发生在定时器触发的哪一时刻呢?

从上图中可知ADC采集的电压电流应该是存放在结构体POWER中。

看到采集了输入电压,输出电压和输出电流,因此需要用到3个ADC通道。同时采用长度用了32个。

2.2 ADC中断采集

一直以为ADC需要依赖中断去控制采集,实际上这里作者巧妙的利用了DMA来分担ADC的采样工作。

这段代码是用于配置DMA1通道1,以实现ADC采样数据的自动采集和传说。但是似乎只是传输3个通道,然后再通道间循环跟新(这里并没有用到inV,ouV,ouI这三个32单元的大数组)。

再看看ADC采集部分,最关心的就是ADC采集的触发沿,因为这关系到ADC采到的电压和控制算法执行间的延迟。

触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制EXTSEL[3:0]用于规则通道的触发源。看起来是通过定时器1来进行触发的。我猜测定时器1既然是高级定时器肯定也是用来产生PWM的定时器。

果然不出我所料,定时器1被配置成用于PWM输出,所以PWM输出和ADC是关联起来的。

到此大部分代码的架构已经初步理解。作者还用到了操作系统来处理显示和输入任务。

2.3 BUCK电路小信号传递模型的仿真

然后绘制它的bode图,我们来观察这个bode图的特点。

然后我们来观察这个bode图的特点。

增益在w0之前都是基本平坦的,然后0频率点的位置对应于直流增益。在靠近w0之前输入与输出的相移都是0°。

W0是谐振点,谐振点意味着选频,意味着q值越大,那么这个突起会越高。额这一点附件的相位突变也会越发的陡峭。

同时,因为是LC网络,毕竟是低通滤波器所以对于高频是有衰减的。高到多少会开始不放大信号而开始衰减信号呢?高到fc的位置。同时也看到fc位置的信号已经超过负的135度,接近于负180度了,这就很可能直接反向出现变换器震荡。

利用在 matlab 下运行如下脚本:

Vin=20;l=50e-6;c=500e-6;r=1;rc=0.01;rl=0.25;

omeg0=1/(l*c)^0.5;

omegz=1/rc/c;

omegzl=rl/l;

Q=r/(l/c)^0.5;

G1=tf(Vin*[1/omegz 1],[1/omeg0^2 1/Q/omeg0 1]);

margin(G1);

可得所设计的开环 buck 幅频相频特性曲线如下图所示:

fc这里画一条竖线下来,在相位图上的相位离-180°边界的距离大约是12.4°,小于45°。需要补偿。

另一方面增益裕度,因为相位没有靠近负180°的,所以增益裕度无线。

补偿目标:相位裕度大于等于45°,增益裕度大于7dB。

可以通过在反馈信号上增加放大的方式来抬高增益,使曲线整体上移,那么穿越频率就可以变大。穿越频率变化大,说明系统对这个频率下的噪声都有一定的控制能力。

考虑到采样定理,穿越频率最大可以放在十分之一开关频率的地方。我们的例子是100kHz所以可以放在10kHz的地方,那么在10kHz的地方我们看到这里的增益是-13.4,因为我们希望设置这个点做穿越频率,所以要把增益曲线抬上去,那就加大比例系数,因为比例系数起到放大作用。(需要比例)

2.4 PID补偿器的参数设计

问题是比例系数不改变系统的相位特性,所以即使通过增加比例,这个相位图还是不变,所以10khz的点的相位裕度是-161-(-180)=19°,小于45°。可见,直接加比例不行。(需要微分)

还有另外一个问题,比例是整体的提升,所以在fc之前的曲线还是平坦的,低频部分的增益不够大,控制器对低频的控制响应就小,稳态误差大。(需要积分)

紫色是积分器的在对数坐标下的近似特性,幅值上满足10倍频程衰减20db。黑色是原系统的幅频特性,红色是补偿后的幅频特性。

由于是对数坐标系,系统级联相乘,在对数图上表示为两张图每一频率点上的量之和,所以我们需要找到在10kHz处,可以把这一点顶起来的补偿对数图。(需要微分)

知道了为什么需要P,需要I,需要D,我们还需要知道三者怎么搭配,或者说积分时间常数,微分时间常数,比例放大系数应该设置多大(对应的幅频特性曲线拐点在哪里)。

上图是PI补偿后的结果,可见穿越频率和直流增益都扩大了,但是相位裕度确很极限。

第三步:调节D来改变相位裕度。

10kHZ的创越频率如竖的虚线所示,要把这一点从距离-180°有18.6°到距离-180°有45°的余量,需要向上再顶高25.4°。

最后一步因为只剩下C1的值可以调,所以可以用试验的方式去多次尝试。

问题是初值怎么确定?

把C1加到2nF,发现顶高了不少。

到这里就完成了模拟PID参数设计。

如何将模拟PID转换为数字PID控制器?在matlab中使用离散化指令即可.

3.学习总结

通过本次电源网的套件学习活动,学习了PID控制BUCK电路的软件框架,对补偿器参数设计有了一定了解。

看了这么多大家一定累了,这就把代码分享出来

链接:https://pan.baidu.com/s/1w0TjZliJfFV8MTcMq7BizQ?pwd=1234 提取码:1234

全部回复(3)
正序查看
倒序查看
ruohan
LV.9
2
2023-04-22 14:21

闭环程序有吗

 

0
回复
2023-06-14 16:57

你好,网盘链接失效了,请问可以在发一次吗

0
回复
01-30 09:25
@dy-xyjG9uzx
你好,网盘链接失效了,请问可以在发一次吗

没有失效,是那个链接有问题,直接复制文字粘贴到浏览器就可以了

0
回复