STC89C51单片机输出两路频率为30KHz的PWM波控制DC-AC半桥逆变电路程序
时间: 2023-05-29 18:01:53 浏览: 255
以下是STC89C51单片机输出两路频率为30KHz的PWM波控制DC-AC半桥逆变电路的程序:
#include <reg51.h>
sbit P11 = P1^1; // P1.1口控制半桥逆变器中的N沟MOS管
sbit P12 = P1^2; // P1.2口控制半桥逆变器中的P沟MOS管
void Init_PWM() // 初始化PWM控制器,使其输出30kHz的PWM信号
{
TMOD |= 0x01; // 定时器0工作在模式1中
TH0 = 0xFC; // 定时器初值,控制每个PWM周期的时间为50us
TL0 = 0x6C;
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
TMOD |= 0x10; // 定时器1工作在模式1中
TH1 = 0xFA; // 定时器初值,控制每个PWM脉冲的时间为416us
TL1 = 0xAE;
ET1 = 1; // 打开定时器1中断
TR1 = 1; // 启动定时器1
EA = 1; // 打开总中断开关
}
void main()
{
Init_PWM(); // 初始化PWM控制器
while (1)
{
P11 = 1; // 打开N沟MOS管
P12 = 0; // 关闭P沟MOS管
}
}
void Timer0_ISR() interrupt 1 // 定时器0中断服务函数
{
static unsigned char cnt = 0; // 用于计数,控制PWM脉冲的宽度
if (cnt <= 3) // 当cnt小于等于3时,P11口输出高电平,表示半个PWM周期的第一段
{
P11 = 1;
}
else // 否则,P11口输出低电平,表示半个PWM周期的第二段
{
P11 = 0;
}
cnt++; // 计数值加1
if (cnt == 7) // 当cnt等于7时,半个PWM周期结束
{
cnt = 0; // 计数值清0
}
}
void Timer1_ISR() interrupt 3 // 定时器1中断服务函数
{
P11 = 0; // 关闭N沟MOS管
P12 = 1; // 打开P沟MOS管
}
在程序中,我们使用了定时器0和定时器1来生成两路频率为30kHz、占空比各为50%的PWM波。在定时器0的中断服务函数中,我们通过计数器控制半个PWM周期内PWM脉冲的宽度,从而生成符合要求的PWM波形。在定时器1的中断服务函数中,我们将P11口的电平拉低,关闭N沟MOS管,同时将P12口的电平拉高,打开P沟MOS管,从而实现DC-AC半桥逆变器的控制。
阅读全文