SPWM信號經低通濾波后可變換為正弦波,窄帶范圍內的方波經低通濾波后可變換為相應頻率的正弦波
如果不是你想要的頻率,那就 自己改一下數據 記得同時要替換數組里面的值
單片機SPWM波 產生正弦波的源程序及工具
http://www.zg4o1577.cn/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;
- }
復制代碼 |