基于STM32的SPWM逆变器设计
Posted 森旺电子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STM32的SPWM逆变器设计相关的知识,希望对你有一定的参考价值。
目录
资料下载地址:STM32正弦波逆变器设计
一、逆变器控制板原理图和PCB
二、逆变器直流升压原理图和PCB
三、代码
四、电路讲解
1、12V 电池输入的辅助电源电路
对于 12V 电池供电的逆变器,一般经过一级 RC 滤波给 PWM 芯片如 TL494,SG3525 等 供电即可。需要注意的是 R 的压降控制在 0.5V-1V 比较合适,因为一般 PWM 芯片最低工作 电压在 8V 左右,为了使电池在 10V 电压时还能工作, R 上的压降不能过大。还有 PWM 芯 片供电电压过低容易引起不工作或对功率 MOS 管驱动不足。 在要求比较高的情况下可以先把 10-15V 的电池电压升压到 15V, 再用 L7812 降压到稳定 的 12V 给 PWM 芯片供电,电路如下: 上图中 BT 为来自 12V 电池,电压变动范围为 10-15V. 采用了 MC34063 单片 DCDC 芯 片比较简单经济地实现了上述功能。2、24V-48V 电池输入的辅助电源电路
3、 多路隔离辅助电源电路
4、高频逆变器前级电路的设计
逆变器前级电路一般采用推挽结构,这里主要讲解下开环和闭环的问题。供分析的电路 如下:5、闭环前级变压器匝数比的设计
逆变器前级无论是开环还是闭环只是变压器的匝比和反馈环路的参数不同而已。比如需 要设计一个输入 12V, 变化范围为 10.5-15V ,输出电压为交流 220V50Hz 的高频修正方波逆变 器。如果前级采用闭环结构, 12V 升压后的直流电压稳定在 270V 比较好,这样为了使输入 10.5V 时还能输输出 270V, 则变压器的变比大约为 (270+2VD)/(10.5-VDS)/D, 其中 VD 为高压 整流管的压降, VDS 为前级 MOS 管的压降, D 为最大占空比。计算出来的结果大约是 28 。 特别注意的是当前级工作在闭环状态时,比如输入电压比较高的话, D1,D3 正端整流出来的 脉冲的峰值将超过 270V, 占空比小于 1 需要 L1,C11 平滑滤波,所以 L1 不能省略,还要足够 大,否则 MOS 管发热损耗很大。具体计算可根据正激类开关电源输出滤波电感的计算,这 里就不再赘述了。6、 准开环前级变压器匝数比的设计
实际中的逆变器前级往往省略 L1 ,从电路上看还是闭环稳压,电压也是通过 R1 进行反 馈,又是怎么回事呢?从上面闭环稳压的计算中可以看出,为了保持输出的稳定,变压器的 变比设计的比较大。逆变器前后级都稳压当然比较好,但也可以只是后级稳压,后级稳压在 AC220V, 我们可以把前级直流高压设计在最低 220V 就可以了,此时占空比为 50% 。如果前 级直流高压大于 220V 我们可以自动把占空比调小点,这样输出交流电也稳定在 220V 了。 用这种方式的话我们的变压器变比可以按输入 10.5V 时输出 220V 设计,计算结果变比大约 是 22. 这样输入 10.5-15V 变化时,前级高压的变动范围大约是 220-320V. 如果 L1 直接短路, R1 去掉,这样就是一个纯开环的电路,只是有于变压器漏感尖峰的 存在,在逆变器空载时,前级输出的直流高压会虚高,对高压滤波电容和后级高压 MOS 管 的安全不利。我们可以也接上 R1 做一个浅闭环反馈,限制空载高压在 320V, 超过 320V 时, 占空比会被控制到很小,这样高压滤波电容和后级高压 MOS 管的安全得到了保证,空载电 流也减小了。前级这样设计的话,只要带很小的负载,前级占空比立刻拉到最大,前级直流 高压降到 320V 以下。 在正弦比逆变器的前级电路中也可以这样设计,对于输入 12V 输出 220V 的逆变器来说 可以把变压器的变比设计在 32 左右,这样前级直流高压的变化范围大约在 320-420V, 通过改 变后级 SPWM 的调制度也可以保证后级输出 220V 电压的稳定。 四.高频逆变器后级电路的设计: 后级电路的基本功能就是把前级升压的高压直流电逆变成交流电。从结构来说全桥结构 用得最多。 下面以单相正弦波逆变器的后级电路为例讲解下,部分电路如下图:7、正弦波逆变器 LC 滤波器参数的计算
要准确计算正弦波逆变器 LC 滤波器的参数确实是件繁琐的事,这里我介绍一套近似的 简便计算方法,在实际的检验中也证明是可行的。我的想法是 SPWM 的滤波电感和正激类 的开关电源的输出滤波电感类似,只是 SPWM 的脉宽是变化的,滤波后的电压是正弦波不 是直流电压。如果在半个正弦周期内我们按电感纹波电流最大的一点来计算我想是可行的。 下面以输出 1000W220V 正弦波逆变器为例进行 LC 滤波器的参数的计算,先引入以下 几个物理量: Udc:输入逆变 H 桥的电压,变化范围约为 320V-420V; Uo:输出电压, 0-311V 变化,有效值为 220V; D:SPWM 载波的占空比,是按正弦规律不断变化的; fsw: SPWM 的开关频率,以 20kHz 为例; Io:输出电流,电感的峰值电流约为 1.4 Io ; Ton:开关管的导通时间,实际是按正弦规律不断变化的; L: LC 滤波器所需的电感量; R:逆变器的负载电阻。 于是有: L=( Udc- Uo) Ton/(1.4 Io) (1) D= Uo/ Udc (2) Ton=D/ fsw= Uo/( Udc* fsw ) ( 3) Io=Uo/R (4) 综合(1),(3),(4) 有: L=( Udc- Uo)* Uo/(1.4 Io* Udc* fsw)=R(1-Uo/Udc)/(1.4 fsw) 例如,一台输出功率 1000W 的逆变器,假设最小负载为满载的 15% 则 , R=220*220/(1000*15%)=323Ω 从 L= R(1-Uo/Udc)/(1.4 fsw) 可以看出, Uo=Udc 的瞬间 L=0, 不需要电感; Uo 越小需要 的 L 越大我们可以折中取当 Uo=0.5Udc 时的 L=323*(1-0.5)/(1.4 *20000)=5.8 mH 这个值是按照输出 15% Io 时电感电流依然连续计算的,所以比较大,可以根据逆变器 的最小负载修正,如最小负载是半载 500W , L 只要 1.7 mH 了。 确定了滤波电感我们就可以确定滤波电容 C 了,滤波电容 C 的确定相对就比较容易, 基本就按滤波器的截止频率为基波的 5-10 倍计算就可以了。其计算公式为 f = 1/2 π LC五、资料清单
嵌入式STM32输出SPWM实现逆变
一、SPWM逆变原理
逆变是一个成熟的技术,无论是单极性逆变还是双极性逆变,都离不开SPWM调制。对于H桥全桥逆变,使用的是双极性SPWM逆变,因此本文只针对双极性逆变进行讲解,对于其硬件原理,可以参照【单相全桥逆变电路工作过程】。
SPWM逆变的精髓就是【冲量等效原理】——将一周期正弦波等分为N段,每段的长度为T,可以算出任意一段的积分面积S(即正弦波在T时间段内与横轴围成的面积),如果在每一段T时间段内,SPWM波与横轴围成的面积都等于T内正弦波的定积分S,那么在后级对SPWM进行滤波后即可得到正弦波。
如上图所示,只要能控制单片机输出这样的SPWM波,即可通过滤波得到正弦波。
那么如何让单片机输出这样的波形呢?主要分以下几步:
1.确定载波频率fb
载波即下图中红线标出的波形,占空比的调整都在每个载波周期内进行。对于单片机,我们只需要控制在某个载波周期内,高低电平所占的时间即可。一般来讲,载波频率越高,滤出的正弦波越细腻,能调出的正弦波频率上限也越高。
2.确定正弦波频率fs
3.得到正弦波一周波分段N
N=fb/fs ,由此可见,正弦波频率越低,N越大,基波频率越低,N越小。
4.分段计算正弦波积分S,得出PWM占空比序列
这里的分段计算,就是在整个正弦波一周期内,依次计算。计算出每段S后,另PWM与横轴围成的面积等于S,即可得出该段的PWM占空比。一周期计算完成后,即得出了PWM的占空比序列。
5.单片机输出SPWM
得到PWM序列后,其实就是个一维数组,写入单片机后,在每个定时器中断中更新占空比即可。
二、SPWM序列生成
掌握以上原理后,需要先通过软件计算生成spwm序列,根据以上原理,编写matlab程序如下:
%-----硬件设置-------------------------------------
timerCLK = 160000000;%timer时钟,160MHz/1分频
ARR = 7999;
baseRate = timerCLK / (ARR + 1);%载波频率
%-----正弦波设置------------------------------------
F = 25;%频率
T = 1/F;%周期
ampScale = 0.85;%调幅
N = round(baseRate / F);%一周波分多少段
stepTime = 1/F/N;%积分步进值
%-----计算------------------------------------------
CCR = (1:1:N)';
for i=1:1:N
area = double(quad(@(x)sin(2*pi*F*x),(i-1)*stepTime,i*stepTime));
CCR(i) = round((ampScale*area*ARR / stepTime + ARR) / 2);
end
这里的timerCLK即STM32 TIMER1的时钟频率,ARR即定时器重载值,这样就得到了载波频率。
然后对正弦波的各个参数进行设置,最后的for循环便计算了每一段的正弦波积分面积,并根据积分面积计算出高电平计数CCR。这样一来,将CCR序列放入单片机中,在每个定时器中断更新CCR即可。
三、单片机程序
1.时钟配置
双极性的全桥逆变需要生成互补极性的PWM,利用STM32CubeMx配置时钟1如下:
配置时钟分频为0,即不分频,时钟频率就是HCLK频率160MHz;配置ARR为8000-1,即和上述matlab程序吻合;
配置PWM为模式1,占空比pulse可以乱配,因为程序一运行就从CCR序列取数来更新pulse了;正负极性通道的极性配置为高电平,当计数值大于CCR时反转为低电平。
最后,还要使能配置TIM1的捕获/比较中断,即在一个ARR周期内,当计数值大于CCR后触发中断,进而在中断函数中更新CCR值,从而实现SPWM。
2.中断函数
//一周期内分多少段
#define SPWM_N 800
//序列计数
static int spwmCnt = 0;
//SPWM计数
static int spwmData[SPWM_N] =
4013,4040,4067,4093,4120,4147,4173,4200,4227,4253,4280,4307,4333,4360,4386,4413,4439,4466,4492,
4519,4545,4571,4598,4624,4650,4676,4703,4729,4755,4781,4807,4833,4858,4884,4910,4936,4961,4987,
5012,5038,5063,5089,5114,5139,5164,5189,5214,5239,5264,5289,5313,5338,5363,5387,5411,5436,5460,
5484,5508,5532,5555,5579,5603,5626,5650,5673,5696,5719,5742,5765,5788,5811,5833,5855,5878,5900,
5922,5944,5966,5988,6009,6031,6052,6073,6094,6115,6136,6157,6178,6198,6218,6238,6258,6278,6298,
6318,6337,6356,6376,6395,6414,6432,6451,6469,6488,6506,6524,6542,6559,6577,6594,6611,6628,6645,
6662,6678,6695,6711,6727,6743,6758,6774,6789,6805,6820,6834,6849,6864,6878,6892,6906,6920,6933,
6947,6960,6973,6986,6999,7011,7023,7035,7047,7059,7071,7082,7093,7104,7115,7126,7136,7146,7156,
7166,7176,7185,7194,7203,7212,7221,7229,7238,7246,7254,7261,7269,7276,7283,7290,7296,7303,7309,
7315,7321,7327,7332,7337,7342,7347,7352,7356,7360,7364,7368,7371,7375,7378,7381,7384,7386,7388,
7391,7392,7394,7396,7397,7398,7399,7399,7400,7400,7400,7400,7399,7399,7398,7397,7396,7394,7392,
7391,7388,7386,7384,7381,7378,7375,7371,7368,7364,7360,7356,7352,7347,7342,7337,7332,7327,7321,
7315,7309,7303,7296,7290,7283,7276,7269,7261,7254,7246,7238,7229,7221,7212,7203,7194,7185,7176,
7166,7156,7146,7136,7126,7115,7104,7093,7082,7071,7059,7047,7035,7023,7011,6999,6986,6973,6960,
6947,6933,6920,6906,6892,6878,6864,6849,6834,6820,6805,6789,6774,6758,6743,6727,6711,6695,6678,
6662,6645,6628,6611,6594,6577,6559,6542,6524,6506,6488,6469,6451,6432,6414,6395,6376,6356,6337,
6318,6298,6278,6258,6238,6218,6198,6178,6157,6136,6115,6094,6073,6052,6031,6009,5988,5966,5944,
5922,5900,5878,5855,5833,5811,5788,5765,5742,5719,5696,5673,5650,5626,5603,5579,5555,5532,5508,
5484,5460,5436,5411,5387,5363,5338,5313,5289,5264,5239,5214,5189,5164,5139,5114,5089,5063,5038,
5012,4987,4961,4936,4910,4884,4858,4833,4807,4781,4755,4729,4703,4676,4650,4624,4598,4571,4545,
4519,4492,4466,4439,4413,4386,4360,4333,4307,4280,4253,4227,4200,4173,4147,4120,4093,4067,4040,
4013,3987,3960,3933,3907,3880,3853,3827,3800,3773,3747,3720,3693,3667,3640,3614,3587,3561,3534,
3508,3481,3455,3429,3402,3376,3350,3324,3297,3271,3245,3219,3193,3167,3142,3116,3090,3064,3039,
3013,2988,2962,2937,2911,2886,2861,2836,2811,2786,2761,2736,2711,2687,2662,2637,2613,2589,2564,
2540,2516,2492,2468,2445,2421,2397,2374,2350,2327,2304,2281,2258,2235,2212,2189,2167,2145,2122,
2100,2078,2056,2034,2012,1991,1969,1948,1927,1906,1885,1864,1843,1822,1802,1782,1762,1742,1722,
1702,1682,1663,1644,1624,1605,1586,1568,1549,1531,1512,1494,1476,1458,1441,1423,1406,1389,1372,
1355,1338,1322,1305,1289,1273,1257,1242,1226,1211,1195,1180,1166,1151,1136,1122,1108,1094,1080,
1067,1053,1040,1027,1014,1001,989,977,965,953,941,929,918,907,896,885,874,864,854,844,834,824,
815,806,797,788,779,771,762,754,746,739,731,724,717,710,704,697,691,685,679,673,668,663,658,
653,648,644,640,636,632,629,625,622,619,616,614,612,609,608,606,604,603,602,601,601,600,600,
600,600,601,601,602,603,604,606,608,609,612,614,616,619,622,625,629,632,636,640,644,648,653,
658,663,668,673,679,685,691,697,704,710,717,724,731,739,746,754,762,771,779,788,797,806,815,
824,834,844,854,864,874,885,896,907,918,929,941,953,965,977,989,1001,1014,1027,1040,1053,1067,
1080,1094,1108,1122,1136,1151,1166,1180,1195,1211,1226,1242,1257,1273,1289,1305,1322,1338,1355,
1372,1389,1406,1423,1441,1458,1476,1494,1512,1531,1549,1568,1586,1605,1624,1644,1663,1682,1702,
1722,1742,1762,1782,1802,1822,1843,1864,1885,1906,1927,1948,1969,1991,2012,2034,2056,2078,2100,
2122,2145,2167,2189,2212,2235,2258,2281,2304,2327,2350,2374,2397,2421,2445,2468,2492,2516,2540,
2564,2589,2613,2637,2662,2687,2711,2736,2761,2786,2811,2836,2861,2886,2911,2937,2962,2988,3013,
3039,3064,3090,3116,3142,3167,3193,3219,3245,3271,3297,3324,3350,3376,3402,3429,3455,3481,3508,
3534,3561,3587,3614,3640,3667,3693,3720,3747,3773,3800,3827,3853,3880,3907,3933,3960,3987,
;
//比较中断服务函数
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
if(htim == &htim1)
TIM1->CCR1 = spwmData[spwmCnt++];
if(spwmCnt >= SPWM_N)
spwmCnt = 0;
最后,在程序中开启PWM输出即可:
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start_IT(&htim1,TIM_CHANNEL_1);
四、验证
程序运行后用逻辑分析仪观察PWM,PWMN的波形如下,其占空比是以正弦规律变化的。
最后,将SPWM输出接入全桥逆变电路,经过滤波后,用示波器测量输出端波形,是比较完美的正弦波。
以上是关于基于STM32的SPWM逆变器设计的主要内容,如果未能解决你的问题,请参考以下文章