用STC12C5A60S2单片机输出单向单极性spwm波的代码,使单相全桥逆变电路输入36V直流电压,输出交流电压有效值为12
时间: 2023-06-20 14:07:56 浏览: 179
由于STC12C5A60S2单片机没有PWM模块,需要使用定时器来模拟输出SPWM波形。以下是基于STC12C5A60S2单片机的单相全桥逆变电路输出12V有效值的代码:
```c
#include <reg52.h>
#define FOSC 11059200L // 单片机晶振频率
#define T 20 // 定时器中断周期,单位为us
#define PWM_FREQ 50 // SPWM波形频率,单位为Hz
sbit PWM_OUT1 = P1^0; // 输出PWM波形的引脚
sbit PWM_OUT2 = P1^1;
sbit PWM_OUT3 = P1^2;
sbit PWM_OUT4 = P1^3;
unsigned int pwm_table[100] = { // SPWM波形表,100个点
50,54,58,62,66,70,73,77,80,83,86,88,90,92,94,95,96,97,97,97,
97,96,95,94,92,90,88,86,83,80,77,73,70,66,62,58,54,50,46,42,
38,34,30,27,23,20,17,14,12,10,8,6,5,4,3,2,2,2,2,3,4,5,6,8,10,
12,14,17,20,23,27,30,34,38,42,46
};
void timer0_init() {
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = (65536 - T * FOSC / 1000000) / 256; // 定时器初值
TL0 = (65536 - T * FOSC / 1000000) % 256;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 全局中断允许
}
void main() {
unsigned int index = 0; // SPWM波形表的索引
unsigned int period = FOSC / 12 / PWM_FREQ / 100; // SPWM波形周期的计数值,12为全桥逆变电路中三个元器件的并联电容的电容值
PWM_OUT1 = 0; // 初始化输出引脚
PWM_OUT2 = 0;
PWM_OUT3 = 0;
PWM_OUT4 = 0;
timer0_init(); // 初始化定时器
while (1) {
if (index >= 100) { // SPWM波形表索引达到100时,重新从0开始
index = 0;
}
TH0 = (65536 - T * FOSC / 1000000) / 256; // 重新设置定时器初值
TL0 = (65536 - T * FOSC / 1000000) % 256;
if (index < pwm_table[period]) { // 根据SPWM波形表判断是否输出高电平
PWM_OUT1 = 1;
PWM_OUT2 = 0;
PWM_OUT3 = 1;
PWM_OUT4 = 0;
} else {
PWM_OUT1 = 0;
PWM_OUT2 = 1;
PWM_OUT3 = 0;
PWM_OUT4 = 1;
}
index++;
}
}
void timer0_isr() interrupt 1 { // 定时器0中断服务函数
// 什么都不做,只是清除中断标志位
}
```
需要注意的是,本代码中输出的SPWM波形频率为50Hz,根据直流电压36V和输出交流电压12V有效值的关系,可以计算出输出的SPWM波形的峰值电压为36*2/3=24V,因此需要根据实际情况调整SPWM波形表的数据,以使输出的交流电压有效值为12V。
阅读全文