SPWM信号经低通滤波后可变换为正弦波,窄带范围内的方波经低通滤波后可变换为相应频率的正弦波
如果不是你想要的频率,那就 自己改一下数据 记得同时要替换数组里面的值
单片机SPWM波 产生正弦波的源程序及工具
http://www.51hei.com/bbs/dpj-55510-1.html
- #include<reg52.h>
- #define uInt unsigned int
- #define uchar unsigned char
- uchar t_max = 10; //一个周期
- static uchar t = 0,i = 0; //PWM计数
- /*
- uchar code SinParam[40]={
- 0,3,6,9,13,16,19,22,25,28,31,34,37,40,43,45,
- 48,51,54,56,59,61,64,66,68,71,73,75,77,79,81,83,
- 84,86,88,89,90,92,93,94,95,96,97,98,98,99,99,100,
- 100,100,100,100,100,100,99,99,98,98,97,96,95,94,93,92,
- 90,89,88,86,84,83,81,79,77,75,73,71,68,66,64,61,
- 59,56,54,51,48,45,43,40,37,34,31,28,25,22,19,16,
- 13,9,6,3
- };
- */
- uchar code SinParam[20]={
- 5,5,6,7,7,8,9,9,9,9,10,9,9,9,9,8,
- 7,7,6,5
- };
- // 200点正弦波样本值
- void main(void)
- {
- TMOD = 0x02; //定时器0,工作模式2,8位定时模式
- TH0 = 146; //写入预置初值(取值1-255,数越大PWM频率越高)
- TL0 = 146; //写入预置值(取值1-255,数越大PWM频率越高)
- TR0 = 1; //启动定时器
- ET0 = 1; //允许定时器0中断
- EA = 1; //允许总中断
- P2 = 0xff; //初始化P1
- while(1)
- {
- ;
- }
- }
- timer0()interrupt 1 using 2
- {
- t++; //每次定时器溢出加1
- if(t < t_max && t >= SinParam[i]) //PWM周期 5
- {
- P2 = 0x00; //使LED灯亮
- }
- else if( t >= t_max)
- {
- t = 0; //使t=0,开始新的PWM周期
- i++;
- P2 = 0xff;
- }
- if(i >= 20) i = 0;
- }
复制代码 |