---------------------------------- 1 / 20 更 新 -----------------------------------
前言
通常把直流电变成交流电的过程叫做逆变,完成逆变功能的电路称为逆变电路。本文主要介绍全桥逆变电路的拓扑结构、逆变原理及控制方法、单相逆变的软件实现思路,并结合simulink、proteus仿真软件进行仿真验证。
一、单相全桥逆变器组成原理
1.全桥逆变电路拓扑结构

逆变电路工作时,单极性调制和双极性调制时主要有以下两种工作状态:
在单极倍频调制时,还存在如下两工作状态
2.单相逆变器的SPWM调制方式
(1)SPWM调制的基本原理
如果对于交流电,如50HZ的正弦波,我们把它看成是有许许多多的呈阶梯状的直流信号组成 ,这样我们就可以用许许多多的宽窄不等的脉冲来等效这个正弦波了,从而实现了功率管工作在开关状态。如果在一个正弦波周期内的脉冲个数比较多,就能精度比较高地通过 LC滤波网络还原成正弦波,这就是SPWM调制的基本原理。
(2)SPWM调制波的实现方式
SPWM调制波实现方式:在模拟电路里,我们常常用调制基波(正弦波)和载波 (三角波或锯齿波)的幅值来做比较,幅值高时就输出高电平或低电平产生SPWM调制波,具体实现方法就是把基波和载波分别输入到比较器的正反相输入端
比较器输出的是占空比变化的矩形波,通过控制全桥电路4个功率管的导通顺序以及后级的LC滤波可得到正弦波形。
(3)单相全桥逆变器调制方式
单相全桥逆变器中根据调制策略不同分为单极性调制、双极性调制和单极性倍频调制。

①单极性调制


一般情况下,功率管驱动芯片上管和下管是互补导通的,因此导通时序也可如下图:
从上面的驱动时序可以看出典型的单极性调制有如下特点:高频臂Q1,Q2两个功率管工作在高频状态,低频臂Q3,Q4两个功率管工作在低频状态,只有一半的功率管有开关损耗,和其它4个功率管都工作在高频状态的调制方式相比,总的开关损耗只有一半。由此可以知道,高频臂Q1,Q2两个功率管工作在高频状态,损耗比低频臂Q3,Q4两个功率管工作在低频状态要高,因发热比较大,寿命要短。
②双极性调制


双极性可以看出,SPWM调制4个功率管都工作在高频载波频率,因而开关损耗比较大。但其实现方式比较容易,大部分半桥功率管驱动芯片自带上下管互补导通功能,所以只要给左右桥臂分别通以一对互补的SPWM信号即可实现。
③单极倍频调制
单极性倍频调制的原理和双极性调制有类似的地方,只是全桥输出在没有滤波之前的波形和功率管的工作频率变了。它来用采用正弦波和两路互为反相三角波相比较的方式,当然也可以是两路互为反相的正弦波和三角波相比较。


从UAB的波形可以看出,两路双极性调制经过全桥功率管的叠加之后最终的UAB波形变成了单极性,而且频率加倍,这就是这种调制方式称为单极性倍频调制的原因。这种调制方式波形完美,对各种负载的适应性好,因为倍频输出,LC的体积和成本可以比较小,缺点是4个功率管都工作在高频状态,因而开关损耗比较大。
二、单相全桥逆变器仿真
仿真采用双极性调制方式,因为实现方式较其它两调制方式种更为简单。
1.SPWM调制波仿真
要实现逆变,首先要有SPWM波形,SPWM波形正弦波和三角波通过比较器得到。在similink中仿真模型如下:
示波器观测得到:
黄色部分是得到的SPWM调制波形,占空比随正弦幅值变化,仿真成功。
2.全桥逆变仿真
总体仿真模型如下:
调制产生的路互补SPWM波形为SPWM1和SPWM2,两路调制波又分别连接同侧桥臂的上下管,模拟半桥驱动芯片的上下管互补。
在逆变器中通常采用滤波器来消除逆变器输出电流谐波,滤波器通常存在三种形式:L 滤波器、LC 滤波器和 LCL 滤波器。本文在此采用 LC 滤波器,LC 滤波器是一种二阶滤波器,其滤波效果比 L 型滤波器好,并且在设计和控制上不像LCL 存在固有谐振问题,更加易于稳定。此处逆变器的开关频率设置为 10k Hz,因此选取 LC 谐振频率为:
式中:为基波频率;
为开关频率;
为 LC 滤波器的谐振频率
在滤波器电感设计中,当电感选取较大时,能够有效的抑制电流谐波,但是会影响系统的动态特性,导致电流闭环跟踪缓慢;当电感选取较小时,电流闭环控制跟踪性能较好,但是滤除电流谐波能力较弱,因此在电感设计中通常需要折衷考虑两个方面,电感通常选取几mH,电容十几或几十uf,具体数值需要结合设计参数计算出来。
运行仿真得到:
逆变波形为50HZ的正弦波
三、SPWM单片机程序实现
通常,逆变电路需要单片机参与进行闭环控制,第一个问题就是如何用单片机产生SPWM波形,下面介绍使用STM32产生SPWM波形。
设计目标为载波10Khz,目标正弦波形为50hz。主要思路是利用定时器产生10Khz的PWM波形,每个PWM周期改变一次占空比,从而模拟出SPWM波形。
因为无示波器和实物单片机,所以以下操作是基于proteus仿真出来的,实际原理一样的。
1.CubeMX配置
①配置定时器及中断
定时器使用高级定时器1,高级定时器带互补输出功能。由于我使用的是proteus仿真,单片机主频设置为了8Mhz。因此定时器配置如下:
计数周期:8Mhz / 10Khz = 800 ,因此为800-1=799;72M主频下同理计算
②开启定时器1更新中断
2.SPWM正弦表数据生成
SPWM表格生成工具下载链接:点击跳转
周期点数 :10Khz / 50 Hz = 200 ,每个正弦波由200个调制PWM波形组成
3.Keil5代码
①定义查表数据
#define SPWM_N 200
uint16_t SPWM_Cnt = 0;
uint16_t SPWM_List[SPWM_N] = {
400,412,425,437,450,462,474,487,499,511,523,535,547,558,570,581,
592,603,614,624,635,645,654,664,673,682,691,700,708,716,723,730,
737,744,750,756,761,767,771,776,780,784,787,790,792,795,796,798,
799,799,800,799,799,798,796,795,792,790,787,784,780,776,771,767,
761,756,750,744,737,730,723,716,708,700,691,682,673,664,654,645,
635,624,614,603,592,581,570,558,547,535,523,511,499,487,474,462,
450,437,425,412,400,387,374,362,349,337,325,312,300,288,276,264,
252,241,229,218,207,196,185,175,164,154,145,135,126,117,108,99,
91,83,76,69,62,55,49,43,38,32,28,23,19,15,12,9,7,4,3,1,0,0,0,0,0,
1,3,4,7,9,12,15,19,23,28,32,38,43,49,55,62,69,76,83,91,99,108,117,
126,135,145,154,164,175,185,196,207,218,229,241,252,264,276,288,
300,312,325,337,349,362,374,387
};
②定时器初始化
HAL_TIM_Base_Start_IT(&htim1); //开启定时器中断
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_1); //开启PWM输出
HAL_TIMEx_PWMN_Start_IT(&htim1,TIM_CHANNEL_1); //开启互补PWM输出
③中断回调函数设置
主要功能是每次定时器溢出时,更新比较值,从而改变下一次PWM的占空比。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim1)
{
TIM1->CCR1 = SPWM_List[SPWM_Cnt++];
if(SPWM_Cnt >= SPWM_N)
{
SPWM_Cnt = 0;
}
}
}
4.protues仿真观测波形
仿真模型如下:
波形观测如下:
黄色波形与蓝色波形为调制SPWM波形,两者电平互补,粉色波形为黄色波形的单位面积等效。实际要得到粉色50HZ正弦波需要将SPWM通过全桥电路和LC滤波后得到。
---------------------------------- 1 / 20 更 新 -----------------------------------
以下是2023年电赛电源题的经验分享,采用的逆变硬件电路与上文介绍不一致,因为当时备赛期间准备了三相逆变,为了灵活化,方便三相改单相,采用的方法是两路半桥SPWM调制得到两路带直流偏置正弦波,最后合成得到没有直流偏置的正弦波,实现逆变。示意图如下:
1.硬件
实际采用的硬件电路如下:
调制方法还是双极性SPWM调制,STM32单片机产生的两路互补波形分别控制两个IR2104,示波器地线端子和信号线端子直接夹上述原理图U、V的位置即可观测逆变波形。
2.仿真
考虑到很多人实际上手做硬件实操的机会不多,把仿真过程也分享出来吧。 仿真使用的是软件protues(版本8.17)。如果按照前文能仿真出极性互补的SPWM波形,则不用管下面这一步。
在8.17版本中,定时器的时钟分频系数不能是0,我也不懂为啥,所以按照前文产生SPWM的方法,需要修改一下,在Cubemx定时器配置界面,如下:
这里将分频系数设置为8,时钟树那边不用配置,默认即可,后续在protues软件直接设置其主频为72M,再分频 72 /(8+1)= 8 M,得到最终8Mhz的定时器时钟源,与前文一致。
好了,经过上述步骤,如果在protues中已经能仿真出了SPWM波形,那么继续绘制仿真原理图,如下:
仿真结果如下图,如果运行仿真,没图像,鼠标点一下那个one-shot按钮。
这个仿真结果是与实际理论有些误差的,一个正弦波的周期应该是20ms,出现误差的原因尚未清楚。
3.软件
3.1 双极性SPWM调制算法
虽然前文已经介绍了SPWM产生的软件代码,但是仅仅是产生了这个波形,如果涉及到调频、调幅则不止这么简单。
算法原理将用当时比赛的代码进行解释,比赛的指标逆变频率是50hz,我使用的是STM32F103C8T6主控,最大主频72Mhz,如前文所述直接使用定时器1产生互补SPMW波,也是采用查表法更新定时器的比较值。
定时器配置如下:
这里设置了分频系数为1,则定时器时钟源频率为72M / (1+1) = 36 M,计数周期为2048,则载波频率为 36M / 2048 = 17578 hz 。这里为什么不直接使用72M,是因为实际中发现载波频率是17.578Khz还是其两倍,对最终的逆变波形影响不大,为了减小开关损耗提高效率,所以采用36M。分频系数和计数周期可以设置成别的,但最终得到的载波频率最好是十几Khz。
3.1.1 确定表格数据
首先是表格的点数,在载波频率一定的情况下,不同的逆变频率需要的点数不一样。假设载波是20khz,如果我需要50hz的逆变频率,则一个正弦周期的需要的查表点数是400个;那如果我需要20hz的逆变频率,则一个正弦周期需要的查表点数是1000个。所以这个表格需要多少点数决定了调频的范围,表格的点数我也是采用2048个,如果载波频率是20Khz,一个正弦周期内2048个点数全部用完,逆变频率大约是10hz。表格数据生成如下所示:
这样生成的2048个数据点,注意数值范围为[-1024 1024],不是[0 2048]。上面软件中SPWM的幅值是定时器计数周期的一半。
3.1.2 SPWM算法代码
主要是spwm.c和spwm.h两个文件。
spwm.h如下:
#ifndef _SPWM_H_
#define _SPWM_H_
#include "main.h"
#include "tim.h"
#define SPWM_N 2048 //表格点数
extern uint16_t SPWM_Cnt;
extern const int SPWM_List[SPWM_N];
//extern uint32_t result;
//extern uint32_t inputNum;
void Para_calculate(void);
void Para_calibration(char adj);
#endif
spwm.c如下:
#include "spwm.h"
const int SPWM_List[SPWM_N] = {
0,3,6,9,12,15,18,21,25,28,31,34,37,40,43,47,
50,53,56,59,62,65,69,72,75,78,81,84,87,90,94,97,
100,103,106,109,112,115,119,122,125,128,131,134,137,140,144,147,
150,153,156,159,162,165,168,171,175,178,181,184,187,190,193,196,
199,202,205,209,212,215,218,221,224,227,230,233,236,239,242,245,
248,251,254,257,260,264,267,270,273,276,279,282,285,288,291,294,
297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,
344,347,350,353,356,359,362,365,368,371,374,377,380,383,386,388,
391,394,397,400,403,406,409,412,414,417,420,423,426,429,432,434,
437,440,443,446,449,451,454,457,460,463,466,468,471,474,477,479,
482,485,488,491,493,496,499,501,504,507,510,512,515,518,521,523,
526,529,531,534,537,539,542,545,547,550,553,555,558,561,563,566,
568,571,574,576,579,581,584,587,589,592,594,597,599,602,604,607,
609,612,615,617,620,622,625,627,629,632,634,637,639,642,644,647,
649,652,654,656,659,661,664,666,668,671,673,675,678,680,683,685,
687,690,692,694,696,699,701,703,706,708,710,712,715,717,719,721,
724,726,728,730,732,735,737,739,741,743,745,748,750,752,754,756,
758,760,762,765,767,769,771,773,775,777,779,781,783,785,787,789,
791,793,795,797,799,801,803,805,807,809,811,813,814,816,818,820,
822,824,826,828,829,831,833,835,837,839,840,842,844,846,847,849,
851,853,854,856,858,860,861,863,865,866,868,870,871,873,875,876,
878,879,881,883,884,886,887,889,890,892,894,895,897,898,900,901,
903,904,906,907,908,910,911,913,914,916,917,918,920,921,922,924,
925,927,928,929,930,932,933,934,936,937,938,939,941,942,943,944,
946,947,948,949,950,951,953,954,955,956,957,958,959,960,962,963,
964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,978,
979,980,981,982,983,984,985,986,986,987,988,989,990,990,991,992,
993,994,994,995,996,997,997,998,999,999,1000,1001,1001,1002,1003,1003,
1004,1004,1005,1006,1006,1007,1007,1008,1008,1009,1009,1010,1010,1011,1011,1012,
1012,1013,1013,1014,1014,1015,1015,1015,1016,1016,1017,1017,1017,1018,1018,1018,
1019,1019,1019,1019,1020,1020,1020,1020,1021,1021,1021,1021,1022,1022,1022,1022,
1022,1022,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,
1024,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1023,1022,
1022,1022,1022,1022,1022,1021,1021,1021,1021,1020,1020,1020,1020,1019,1019,1019,
1019,1018,1018,1018,1017,1017,1017,1016,1016,1015,1015,1015,1014,1014,1013,1013,
1012,1012,1011,1011,1010,1010,1009,1009,1008,1008,1007,1007,1006,1006,1005,1004,
1004,1003,1003,1002,1001,1001,1000,999,999,998,997,997,996,995,994,994,
993,992,991,990,990,989,988,987,986,986,985,984,983,982,981,980,
979,978,978,977,976,975,974,973,972,971,970,969,968,967,966,965,
964,963,962,960,959,958,957,956,955,954,953,951,950,949,948,947,
946,944,943,942,941,939,938,937,936,934,933,932,930,929,928,927,
925,924,922,921,920,918,917,916,914,913,911,910,908,907,906,904,
903,901,900,898,897,895,894,892,890,889,887,886,884,883,881,879,
878,876,875,873,871,870,868,866,865,863,861,860,858,856,854,853,
851,849,847,846,844,842,840,839,837,835,833,831,829,828,826,824,
822,820,818,816,814,813,811,809,807,805,803,801,799,797,795,793,
791,789,787,785,783,781,779,777,775,773,771,769,767,765,762,760,
758,756,754,752,750,748,745,743,741,739,737,735,732,730,728,726,
724,721,719,717,715,712,710,708,706,703,701,699,696,694,692,690,
687,685,683,680,678,675,673,671,668,666,664,661,659,656,654,652,
649,647,644,642,639,637,634,632,629,627,625,622,620,617,615,612,
609,607,604,602,599,597,594,592,589,587,584,581,579,576,574,571,
568,566,563,561,558,555,553,550,547,545,542,539,537,534,531,529,
526,523,521,518,515,512,510,507,504,501,499,496,493,491,488,485,
482,479,477,474,471,468,466,463,460,457,454,451,449,446,443,440,
437,434,432,429,426,423,420,417,414,412,409,406,403,400,397,394,
391,388,386,383,380,377,374,371,368,365,362,359,356,353,350,347,
344,342,339,336,333,330,327,324,321,318,315,312,309,306,303,300,
297,294,291,288,285,282,279,276,273,270,267,264,260,257,254,251,
248,245,242,239,236,233,230,227,224,221,218,215,212,209,205,202,
199,196,193,190,187,184,181,178,175,171,168,165,162,159,156,153,
150,147,144,140,137,134,131,128,125,122,119,115,112,109,106,103,
100,97,94,90,87,84,81,78,75,72,69,65,62,59,56,53,
50,47,43,40,37,34,31,28,25,21,18,15,12,9,6,3,
0,-3,-6,-9,-12,-15,-18,-21,-25,-28,-31,-34,-37,-40,-43,-47,
-50,-53,-56,-59,-62,-65,-69,-72,-75,-78,-81,-84,-87,-90,-94,-97,
-100,-103,-106,-109,-112,-115,-119,-122,-125,-128,-131,-134,-137,-140,-144,-147,
-150,-153,-156,-159,-162,-165,-168,-171,-175,-178,-181,-184,-187,-190,-193,-196,
-199,-202,-205,-209,-212,-215,-218,-221,-224,-227,-230,-233,-236,-239,-242,-245,
-248,-251,-254,-257,-260,-264,-267,-270,-273,-276,-279,-282,-285,-288,-291,-294,
-297,-300,-303,-306,-309,-312,-315,-318,-321,-324,-327,-330,-333,-336,-339,-342,
-344,-347,-350,-353,-356,-359,-362,-365,-368,-371,-374,-377,-380,-383,-386,-388,
-391,-394,-397,-400,-403,-406,-409,-412,-414,-417,-420,-423,-426,-429,-432,-434,
-437,-440,-443,-446,-449,-451,-454,-457,-460,-463,-466,-468,-471,-474,-477,-479,
-482,-485,-488,-491,-493,-496,-499,-501,-504,-507,-510,-512,-515,-518,-521,-523,
-526,-529,-531,-534,-537,-539,-542,-545,-547,-550,-553,-555,-558,-561,-563,-566,
-568,-571,-574,-576,-579,-581,-584,-587,-589,-592,-594,-597,-599,-602,-604,-607,
-609,-612,-615,-617,-620,-622,-625,-627,-629,-632,-634,-637,-639,-642,-644,-647,
-649,-652,-654,-656,-659,-661,-664,-666,-668,-671,-673,-675,-678,-680,-683,-685,
-687,-690,-692,-694,-696,-699,-701,-703,-706,-708,-710,-712,-715,-717,-719,-721,
-724,-726,-728,-730,-732,-735,-737,-739,-741,-743,-745,-748,-750,-752,-754,-756,
-758,-760,-762,-765,-767,-769,-771,-773,-775,-777,-779,-781,-783,-785,-787,-789,
-791,-793,-795,-797,-799,-801,-803,-805,-807,-809,-811,-813,-814,-816,-818,-820,
-822,-824,-826,-828,-829,-831,-833,-835,-837,-839,-840,-842,-844,-846,-847,-849,
-851,-853,-854,-856,-858,-860,-861,-863,-865,-866,-868,-870,-871,-873,-875,-876,
-878,-879,-881,-883,-884,-886,-887,-889,-890,-892,-894,-895,-897,-898,-900,-901,
-903,-904,-906,-907,-908,-910,-911,-913,-914,-916,-917,-918,-920,-921,-922,-924,
-925,-927,-928,-929,-930,-932,-933,-934,-936,-937,-938,-939,-941,-942,-943,-944,
-946,-947,-948,-949,-950,-951,-953,-954,-955,-956,-957,-958,-959,-960,-962,-963,
-964,-965,-966,-967,-968,-969,-970,-971,-972,-973,-974,-975,-976,-977,-978,-978,
-979,-980,-981,-982,-983,-984,-985,-986,-986,-987,-988,-989,-990,-990,-991,-992,
-993,-994,-994,-995,-996,-997,-997,-998,-999,-999,-1000,-1001,-1001,-1002,-1003,-1003,
-1004,-1004,-1005,-1006,-1006,-1007,-1007,-1008,-1008,-1009,-1009,-1010,-1010,-1011,-1011,-1012,
-1012,-1013,-1013,-1014,-1014,-1015,-1015,-1015,-1016,-1016,-1017,-1017,-1017,-1018,-1018,-1018,
-1019,-1019,-1019,-1019,-1020,-1020,-1020,-1020,-1021,-1021,-1021,-1021,-1022,-1022,-1022,-1022,
-1022,-1022,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,
-1024,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1023,-1022,
-1022,-1022,-1022,-1022,-1022,-1021,-1021,-1021,-1021,-1020,-1020,-1020,-1020,-1019,-1019,-1019,
-1019,-1018,-1018,-1018,-1017,-1017,-1017,-1016,-1016,-1015,-1015,-1015,-1014,-1014,-1013,-1013,
-1012,-1012,-1011,-1011,-1010,-1010,-1009,-1009,-1008,-1008,-1007,-1007,-1006,-1006,-1005,-1004,
-1004,-1003,-1003,-1002,-1001,-1001,-1000,-999,-999,-998,-997,-997,-996,-995,-994,-994,
-993,-992,-991,-990,-990,-989,-988,-987,-986,-986,-985,-984,-983,-982,-981,-980,
-979,-978,-978,-977,-976,-975,-974,-973,-972,-971,-970,-969,-968,-967,-966,-965,
-964,-963,-962,-960,-959,-958,-957,-956,-955,-954,-953,-951,-950,-949,-948,-947,
-946,-944,-943,-942,-941,-939,-938,-937,-936,-934,-933,-932,-930,-929,-928,-927,
-925,-924,-922,-921,-920,-918,-917,-916,-914,-913,-911,-910,-908,-907,-906,-904,
-903,-901,-900,-898,-897,-895,-894,-892,-890,-889,-887,-886,-884,-883,-881,-879,
-878,-876,-875,-873,-871,-870,-868,-866,-865,-863,-861,-860,-858,-856,-854,-853,
-851,-849,-847,-846,-844,-842,-840,-839,-837,-835,-833,-831,-829,-828,-826,-824,
-822,-820,-818,-816,-814,-813,-811,-809,-807,-805,-803,-801,-799,-797,-795,-793,
-791,-789,-787,-785,-783,-781,-779,-777,-775,-773,-771,-769,-767,-765,-762,-760,
-758,-756,-754,-752,-750,-748,-745,-743,-741,-739,-737,-735,-732,-730,-728,-726,
-724,-721,-719,-717,-715,-712,-710,-708,-706,-703,-701,-699,-696,-694,-692,-690,
-687,-685,-683,-680,-678,-675,-673,-671,-668,-666,-664,-661,-659,-656,-654,-652,
-649,-647,-644,-642,-639,-637,-634,-632,-629,-627,-625,-622,-620,-617,-615,-612,
-609,-607,-604,-602,-599,-597,-594,-592,-589,-587,-584,-581,-579,-576,-574,-571,
-568,-566,-563,-561,-558,-555,-553,-550,-547,-545,-542,-539,-537,-534,-531,-529,
-526,-523,-521,-518,-515,-512,-510,-507,-504,-501,-499,-496,-493,-491,-488,-485,
-482,-479,-477,-474,-471,-468,-466,-463,-460,-457,-454,-451,-449,-446,-443,-440,
-437,-434,-432,-429,-426,-423,-420,-417,-414,-412,-409,-406,-403,-400,-397,-394,
-391,-388,-386,-383,-380,-377,-374,-371,-368,-365,-362,-359,-356,-353,-350,-347,
-344,-342,-339,-336,-333,-330,-327,-324,-321,-318,-315,-312,-309,-306,-303,-300,
-297,-294,-291,-288,-285,-282,-279,-276,-273,-270,-267,-264,-260,-257,-254,-251,
-248,-245,-242,-239,-236,-233,-230,-227,-224,-221,-218,-215,-212,-209,-205,-202,
-199,-196,-193,-190,-187,-184,-181,-178,-175,-171,-168,-165,-162,-159,-156,-153,
-150,-147,-144,-140,-137,-134,-131,-128,-125,-122,-119,-115,-112,-109,-106,-103,
-100,-97,-94,-90,-87,-84,-81,-78,-75,-72,-69,-65,-62,-59,-56,-53,
-50,-47,-43,-40,-37,-34,-31,-28,-25,-21,-18,-15,-12,-9,-6,-3
};
//
float frequency = 50; // 目标频率
//uint16_t pwmFrequency = 35156; // PWM频率 72M / 2048 (定时器时钟频率 / 计数周期)
uint16_t pwmFrequency = 17578; // PWM频率 36M / 2048
uint16_t totalPoints=0; //根据需要的频率取点 totalPoints = pwmFrequency / frequency;
float increment=0; //增量,每次索引的步进值 (浮点型数据)
uint16_t integerPart=0; //取整数
float decimalPart=0; //取小数
uint32_t highBits=0; //高位
uint32_t lowBits=0; //低位
uint32_t result=0; //最后的增量结果(32位整型数据)
uint32_t indexNum=0; //查表轮询值
uint32_t TIM_Value=0; //定时器最终装载值
float V_Factor=1; //幅度衰减因子,调幅用,取值0-1
/**********************************************************************************
* 函数功能: 计算步进值
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void Para_calculate( )
{
totalPoints = pwmFrequency / frequency; // 需要选择的总点数
increment = (float)SPWM_N / totalPoints; // 频率字的增量,大部分情况下是小数
integerPart = (uint32_t)increment; // 取整数部分
decimalPart = increment - integerPart; // 取小数部分
highBits = integerPart << 21; // 将整数部分左移21位,得到高11位整数
lowBits = (uint32_t)(decimalPart * (1 << 21)); // 将小数部分乘以2的21次方,转换为整数表示
result = highBits | lowBits; // 结合高11位和低21位
}
/**********************************************************************************
* 函数功能: 定时器1
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim1)
{
TIM_Value = 1027 + ((SPWM_List[indexNum>>21])*V_Factor); //乘以衰减因子
TIM1->CCR1 = TIM_Value; //装载
indexNum += result; //索引步进
}
}
这里需要解释一下spwm.c的Para_calculate( )函数的作用,这个函数主要是计算特定频率下,一个正弦波需要从表格均匀地取多少个点,且称为查表点数。 然后又有 表格点数 / 查表点数 = 步进增量 (每次在表格上间隔多少取一个点),一般情况下这个 步进增量不是整数,如果忽略小数部分,就会出现误差,得不到所需的频率(当然,你可以将点数变量设置为浮点型,但是单片机做浮点运算的能力是不如整型数据运算的)。所以这个函数的另一个作用是将计算的步进增量(为浮点型数据,即小数)转为整型数据(即代码里的参数result)。
讲一下怎么调频,Para_calculate( )函数运行后可以得到该频率下所需的步进增量,如果调频,直接改变步进增量值即可。比如通过按键控制频率快慢,直接改变步进增量result即可。这里的自加或自减是1000还是其它数值,取决于实际要实现的频率分辨率。
//调频
void Frequency(int8_t Key)
{
if(Key == 1 ) result+=1000;
else if(Key == 0) result-=1000;
}
讲一下怎么调幅,调幅实质是改变定时器装载的比较值大小,在代码中是下面的语句,1027是定时器计数周期2048一半的数值,计数周期不一样的话需要修改。
TIM_Value = 1027 + ((SPWM_List[indexNum>>21])*V_Factor); //乘以衰减因子
TIM_Value是装载定时器的比较值,SPWM_List[indexNum>>21]是从表格取到的数据,V_Factor是衰减因子,调幅就是改变V_Factor衰减因子的大小,从0-1,假如想通过按键修改波形幅度,可以参考如下:
//调幅
void Amplitude(int8_t Key)
{
if(Key == 1 ) V_Factor += 0.01;
else if(Key == 0) V_Factor -= 0.01;
}
针对以上代码,也去protues跑了个仿真,结果如下:
这里的波形周期是20ms,即50hz。我所使用的protues(8.17版本)中定时器分配系数不能小于2,我在代码中设置是2,在tim.c中设置如下:
但是要注意,现实中要是1才能得到50hz。protues中的分频计算跟STM32理论好像不一样。
实际STM32的定时器时钟源计算是 = 主频 /(分频系数+1),如果在protues中仿真,那么时钟源计算是 = 主频 /(分频系数),仅针对我所使用的8.17版本。
3.2 三相逆变
这里分享一下从单相实现三相逆变的软件思路,单相是两路半桥,三相是三路半桥,所以三相逆变就需要三路SPWM波。这三路波形不需要互补,但是相差需要是120度。可以这样实现,定时器设置三路PWM输出,假设某一逆变频率下所需的查表点数是300,在定时器更新中断中,第一路PWM装载的值在表格索引位置是X,那第二路即为100+X,第三路为200+X,也就是说每次更新装载值,三路装载值都保持1/3的点数间距,就实现相差控制了。