单片机输出PWM信号,经低通滤波电路和输出驱动电路输出模拟正弦信号。
单片机输出PWM信号,经低通滤波电路和输出驱动电路输出模拟正弦信号。系统中不得使用专用DAC集成电路或DAC功能模块。我知道原理:每个周期的脉宽按照正弦波的规律变化,经过...
单片机输出PWM信号,经低通滤波电路和输出驱动电路输出模拟正弦信号。系统中不得使用专用DAC集成电路或DAC功能模块。
我知道原理:每个周期的脉宽按照正弦波的规律变化,经过低通滤波器后即可得到正弦波形。但是本人不会写这个代码,求代码,谢谢各位了 展开
我知道原理:每个周期的脉宽按照正弦波的规律变化,经过低通滤波器后即可得到正弦波形。但是本人不会写这个代码,求代码,谢谢各位了 展开
2个回答
展开全部
假设正弦波周期是 T=20mS,将一个周期360度分成72份(分得越细,输出的正弦波越平滑),每份是5度
求出每个角度的正弦值sin(5*n),由于这个数值在+1到-1之间,而单片机只能输出正电压,因此要将该结果加1,即sin(5*n)+1 ,该值介于0和+2之间
用定时器产生pwm脉冲,该pwm脉冲的周期是T/72=278US
,占空比随时间而变化 ,可知D=(sin(5*n)+1)/2
高电平持续时间为th=T*D=278*(sin(5*n)+1)/2
这个th可以边输出边计算,也可以提前计算好存于数组中
然后用两个定时器(定时器0和定时器1), 定时器0定时278US, 定时器1定时时间可变,即为th
定时0负责置高电平并将定时器1打开并装入初值,定时器1负责置低电平
假设晶振12M ,51单片机程序如下:
主程序中:
sbit PWM=P1^0;
uchar time_high[72]={139,151,163,........};
uchar i=0;
void main( )
{
TMOD=0X11;
TH0=(65536-278)/256;
TL0=(65536-278)%256;
ET0=1;
ET1=1;
EA=1;
TR0=1;
while(1);
}
定时器0中断:
void timer0()interrupt 1
{
TH0=(65536-278)/256;
TL0=(65536-278)%256;
TH1=(65536- time_high[i])/256;
TL1=(65536- time_high[i])%256;
i++;
If(i==72)i=0;
PWM=1;
TR1=1;
}
定时器1中断:
void timer1()interrupt 3
{
PWM=0;
TR1=0;
}
这样P1^0输出的是占空比可变的方波,经高频滤波后,得到的是脉动直流电,再经电平偏移或电容藕合,即可得到类似正弦波
求出每个角度的正弦值sin(5*n),由于这个数值在+1到-1之间,而单片机只能输出正电压,因此要将该结果加1,即sin(5*n)+1 ,该值介于0和+2之间
用定时器产生pwm脉冲,该pwm脉冲的周期是T/72=278US
,占空比随时间而变化 ,可知D=(sin(5*n)+1)/2
高电平持续时间为th=T*D=278*(sin(5*n)+1)/2
这个th可以边输出边计算,也可以提前计算好存于数组中
然后用两个定时器(定时器0和定时器1), 定时器0定时278US, 定时器1定时时间可变,即为th
定时0负责置高电平并将定时器1打开并装入初值,定时器1负责置低电平
假设晶振12M ,51单片机程序如下:
主程序中:
sbit PWM=P1^0;
uchar time_high[72]={139,151,163,........};
uchar i=0;
void main( )
{
TMOD=0X11;
TH0=(65536-278)/256;
TL0=(65536-278)%256;
ET0=1;
ET1=1;
EA=1;
TR0=1;
while(1);
}
定时器0中断:
void timer0()interrupt 1
{
TH0=(65536-278)/256;
TL0=(65536-278)%256;
TH1=(65536- time_high[i])/256;
TL1=(65536- time_high[i])%256;
i++;
If(i==72)i=0;
PWM=1;
TR1=1;
}
定时器1中断:
void timer1()interrupt 3
{
PWM=0;
TR1=0;
}
这样P1^0输出的是占空比可变的方波,经高频滤波后,得到的是脉动直流电,再经电平偏移或电容藕合,即可得到类似正弦波
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询