晶振为12MHz的51单片机输出两路相位差为180度的PWM控制半桥逆变电路程序
时间: 2023-05-29 09:01:28 浏览: 176
以下是晶振为12MHz的51单片机输出两路相位差为180度的PWM控制半桥逆变电路的示例代码。该代码使用了Timer0和Timer2定时器,并且采用了C语言的编程语言。
首先,需要定义相应的宏定义、变量和引脚。
```c
#include <reg52.h>
#define FREQ 20000 // PWM频率为20kHz
#define PERIOD 500 // PWM占空比周期为500
sbit PWM1 = P1^0; // PWM1输出引脚
sbit PWM2 = P1^1; // PWM2输出引脚
```
接下来,需要初始化Timer0和Timer2定时器,并设置对应的中断处理函数。```init_timer0()```函数和```init_timer2()```函数分别设置Timer0和Timer2定时器的工作模式和中断处理方式。同时,需要定义相应的中断处理函数```timer0_isr()```和```timer2_isr()```,用于产生PWM波形。
```c
void init_timer0() {
TMOD |= 0x01; // 设置定时器0为16位定时器
TH0 = 0xFC; // 设置定时器0的初值为65536-46080=19456,使其工作频率为50Hz
TL0 = 0x67;
ET0 = 1; // 打开定时器0中断
TR0 = 1; // 启动定时器0
}
void init_timer2() {
T2CON = 0x07; // 设置定时器2为16位定时器,工作方式1,启动定时器2
RCAP2H = 0xFF; // 设置定时器2的重装载值为65536-48=65488,使其工作频率为20kHz
RCAP2L = 0xD0;
ET2 = 1; // 打开定时器2中断
}
void timer0_isr() interrupt 1 {
TR0 = 0; // 关闭定时器0
TF0 = 0; // 清除定时器0溢出标志
TH0 = 0xFC; // 重置定时器0初值
TL0 = 0x67;
TR0 = 1; // 启动定时器0
PWM1 = 1; // PWM1输出高电平
}
void timer2_isr() interrupt 5 using 1 {
ET2 = 0; // 关闭定时器2中断
if (TH2 == 0x00 && TL2 == 0x00) { // 判断是否达到占空比周期的末状态
PWM1 = 0; // PWM1输出低电平
}
if (TH2 == 0x80 && TL2 == 0x00) { // 判断是否达到占空比周期的中间状态
PWM2 = 1; // PWM2输出高电平
}
if (TH2 == 0xFF && TL2 == 0xFF) { // 判断是否达到占空比周期的起始状态
PWM2 = 0; // PWM2输出低电平
ET2 = 1; // 开启定时器2中断
}
}
```
最后,在```main()```函数中调用```init_timer0()```和```init_timer2()```函数以初始化定时器,并进入一个无限循环。
```c
void main() {
init_timer0();
init_timer2();
while(1);
}
```
经过以上定义和初始化后,就可以输出两路相位差为180度的PWM波形,从而控制半桥逆变电路了。
阅读全文