51单片机输出两路相位差为180度的PWM控制半桥逆变电路程序
时间: 2023-05-29 17:01:27 浏览: 174
void main()
{
TRISC = 0b00000000; //将C口全部设为输出
while(1)
{
//第一路PWM输出
for(int i=0;i<255;i++) //PWM占空比逐渐增加
{
CCPR1L = i >> 1; //CCPR1L的高7位
CCP1CON = ((i & 0x01) << 4) | 0x0C; //CCP1CON的4、5位赋值为占空比的低位,其余位为特定值
__delay_us(10); //延时10us,保证PWM周期
}
__delay_ms(50); //延时,确保两路PWM相位差为180度
//第二路PWM输出
for(int i=255;i>=0;i--) //PWM占空比逐渐减小
{
CCPR2L = i >> 1; //CCPR2L的高7位
CCP2CON = ((i & 0x01) << 4) | 0x0C; //CCP2CON的4、5位赋值为占空比的低位,其余位为特定值
__delay_us(10); //延时10us,保证PWM周期
}
__delay_ms(50); //延时,确保两路PWM相位差为180度
}
}
相关问题
晶振为12MHz的51单片机输出两路相位差为180度的PWM控制半桥逆变电路程序
以下是晶振为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波形,从而控制半桥逆变电路了。
51单片机输出两路频率为30KHZ的相位差为180度的PWM控制半桥逆变电路程序
这是一段51单片机的C语言代码,用于输出两路频率为30KHz的相位差为180度的PWM控制半桥逆变电路:
```
#include<reg52.h> //51单片机头文件
sbit IN1=P1^0; //定义IN1引脚
sbit IN2=P1^1; //定义IN2引脚
sbit EN1=P1^2; //定义EN1引脚
sbit EN2=P1^3; //定义EN2引脚
sbit CTR=P3^2; //定义CTR引脚
//函数声明
void delay_us(unsigned int i);
void delay_ms(unsigned int i);
void PWM1(unsigned char i);
void PWM2(unsigned char i);
void main()
{
unsigned char i;
TMOD=0x02; //定时器0工作在8位自动重装模式
TH0=0x00; //定时器0自动重装值为0
TL0=0x00; //定时器0自动重装值为0
TR0=1; //启动定时器0
ET0=1; //开启定时器0中断
EA=1; //全局中断允许
IN1=0; //IN1引脚设置为低电平
IN2=0; //IN2引脚设置为低电平
EN1=1; //使能EN1引脚
EN2=1; //使能EN2引脚
CTR=1; //CTR引脚设置为高电平
while(1)
{
for(i=0;i<=255;i++)
{
PWM1(i); //输出PWM1波
PWM2(255-i); //输出PWM2波
delay_us(50); //延时50us
}
for(i=255;i>=0;i--)
{
PWM1(i); //输出PWM1波
PWM2(255-i); //输出PWM2波
delay_us(50); //延时50us
}
}
}
//中断函数,用于产生30KHz的PWM波
void timer0() interrupt 1
{
TH0=0xFF; //定时器0自动重装值为255
TL0=0x8E; //定时器0自动重装值为142
CTR=~CTR; //CTR引脚取反
}
//输出PWM1波
void PWM1(unsigned char i)
{
static unsigned char PWM1_value=0; //PWM1波占空比
if(i!=PWM1_value) //如果i与PWM1_value不相等
{
if(i<PWM1_value) //如果i小于PWM1_value
{
IN1=1; //IN1引脚设置为高电平
delay_us(2*(PWM1_value-i)); //延时,使得输出波形的占空比为i/255
IN1=0; //IN1引脚设置为低电平
delay_us(2*i); //延时,使得输出波形的周期为1/30000
}
else //如果i大于PWM1_value
{
IN1=1; //IN1引脚设置为高电平
delay_us(2*i); //延时,使得输出波形的占空比为i/255
IN1=0; //IN1引脚设置为低电平
delay_us(2*(PWM1_value-i)); //延时,使得输出波形的周期为1/30000
}
PWM1_value=i; //更新PWM1波的占空比
}
}
//输出PWM2波
void PWM2(unsigned char i)
{
static unsigned char PWM2_value=0; //PWM2波占空比
if(i!=PWM2_value) //如果i与PWM2_value不相等
{
if(i<PWM2_value) //如果i小于PWM2_value
{
IN2=1; //IN2引脚设置为高电平
delay_us(2*(PWM2_value-i)); //延时,使得输出波形的占空比为i/255
IN2=0; //IN2引脚设置为低电平
delay_us(2*i); //延时,使得输出波形的周期为1/30000
}
else //如果i大于PWM2_value
{
IN2=1; //IN2引脚设置为高电平
delay_us(2*i); //延时,使得输出波形的占空比为i/255
IN2=0; //IN2引脚设置为低电平
delay_us(2*(PWM2_value-i)); //延时,使得输出波形的周期为1/30000
}
PWM2_value=i; //更新PWM2波的占空比
}
}
//延时函数,每延时1us所占用的机器周期数为6
void delay_us(unsigned int i)
{
while(i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//延时函数,每延时1ms所占用的机器周期数为248
void delay_ms(unsigned int i)
{
while(i--)
{
delay_us(1000);
}
}
```