51单片机输出两路频率为30KHZ的SPWM控制半桥逆变电路程序
时间: 2023-05-29 10:01:16 浏览: 261
基于51单片机的spwm波形产生程序
3星 · 编辑精心推荐
由于51单片机的时钟频率等限制,输出30kHz的SPWM信号需要用到定时器和中断,以下是一个简单的程序示例:
```
#include <reg52.h>
#define FREQ 30000 //需要输出的频率
#define MAX 255 //调制信号最大值
#define PI 3.1415926
unsigned char code SinTab[60] = {0,13,25,38,50,62,75,87,98,109,120,130,140,149,158,166,173,180,186,191,196,201,204,207,209,211,212,213,213,213,
212,211,209,207,204,201,196,191,186,180,173,166,158,149,140,130,120,109,98,87,75,62,50,38,25,13,0};
//正弦波表
unsigned char i = 0; //定时器计数器
unsigned char indx = 0; //正弦波表下标
unsigned char cnt = 0; //半桥逆变开关计数器
sbit A1 = P1^0; //半桥逆变管A1
sbit B1 = P1^1; //半桥逆变管B1
void timer_isr() interrupt 1 //计时器中断服务子程序
{
i++;
if(i == 30) //30个计数为一个周期,即1/30000秒
{
i = 0;
indx++;
if(indx >= 60)
indx = 0;
}
if(cnt <= MAX && cnt >= 0)
{
if(cnt >= SinTab[indx])
A1 = 1;
else
A1 = 0;
if(cnt >= MAX - SinTab[indx])
B1 = 1;
else
B1 = 0;
cnt++;
}
if(cnt > MAX)
cnt = -MAX;
}
void main()
{
TMOD |= 0x01; //设置定时器0工作模式
TH0 = (65536 - FREQ) / 256; //设定定时器初值
TL0 = (65536 - FREQ) % 256;
ET0 = 1; //开启定时器0中断
EA = 1; //开启总中断
TR0 = 1; //启动定时器0
while(1);
}
```
该程序实现了在P1.0和P1.1引脚输出30kHz的SPWM信号,控制半桥逆变电路进行电能变换。其中用到了定时器0和中断,计时器计算正弦波表下标,半桥逆变开关计数器实现SPWM调制,中断服务子程序实时更新半桥逆变管控制信号。
阅读全文