51单片机输出两路SPWM控制半桥逆变电路程序
时间: 2023-05-29 09:01:14 浏览: 414
本程序是基于STC89C52单片机实现的,输出两路SPWM控制半桥逆变电路的程序。程序使用Port2口作为输出控制信号口,其中P2.2和P2.3口分别用于控制两个半桥逆变电路的开关管状态。
程序首先定义了一个包含48个元素的正弦波表,每个元素表示正弦波每个时刻的输出电平。然后定义了一个表示SPWM输出频率的变量,通过调节该变量的值,可以实现不同频率的输出。
程序中使用了定时器0和定时器1来生成两路SPWM控制信号,定时器0用于控制第一路SPWM信号的输出,定时器1用于控制第二路SPWM信号的输出。
程序最后进入无限循环,在循环中不断更新SPWM输出信号的占空比,实现正弦波的平滑变化。同时控制P2.2和P2.3输出信号,控制半桥逆变电路的开关管状态。
```
#include <STC89C5xRC.H>
#define PI 3.1415926
#define N 48
unsigned char code sin_tab[N] = {128, 153, 178, 203, 227, 251, 274, 296, 317, 337, 355, 372, 387, 400, 412, 422, 431, 437, 441, 444, 444, 442, 438, 432, 424, 415, 404, 391, 377, 362, 345, 328, 310, 291, 271, 251, 231, 209, 188, 166, 144, 121, 99, 76, 53, 31, 9};
//正弦波表
unsigned int freq=500; //输出频率
void TIMER0_ISR() interrupt 1
{
static unsigned char cnt = 0, k = 0;
unsigned int tmp;
cnt++;
if (cnt > 20)
{
cnt = 0;
k++;
if (k >= N)
k = 0;
}
tmp = (unsigned int)freq*sin_tab[k];
tmp = tmp / 255;
tmp = 256 - tmp;
TH0 = (65536 - tmp) / 256;
TL0 = (65536 - tmp) % 256;
}
void TIMER1_ISR() interrupt 3
{
static unsigned char cnt = 0, k = N/2;
unsigned int tmp;
cnt++;
if (cnt > 20)
{
cnt = 0;
k++;
if (k >= N)
k = 0;
}
tmp = (unsigned int)freq*sin_tab[k];
tmp = tmp / 255;
tmp = 256 - tmp;
TH1 = (65536 - tmp) / 256;
TL1 = (65536 - tmp) % 256;
}
void main()
{
unsigned int duty1 = 0, duty2 = 0;
TMOD = 0x11;
TH0 = TL0 = TL1 = 0;
ET0 = ET1 = 1;
EA = 1;
while (1)
{
duty1++;
duty2--;
if (duty1 > 100)
duty1 = 0;
if (duty2 < 0)
duty2 = 100;
if (duty1 <= 50)
P2 &= 0xFB;
else
P2 |= 0x04;
if (duty2 <= 50)
P2 &= 0xF7;
else
P2 |= 0x08;
}
}
```
阅读全文