SPWM信號(hào)經(jīng)低通濾波后可變換為正弦波,窄帶范圍內(nèi)的方波經(jīng)低通濾波后可變換為相應(yīng)頻率的正弦波
如果不是你想要的頻率,那就 自己改一下數(shù)據(jù) 記得同時(shí)要替換數(shù)組里面的值
單片機(jī)SPWM波 產(chǎn)生正弦波的源程序及工具
http://www.zg4o1577.cn/bbs/dpj-55510-1.html
- #include<reg52.h>
- #define uInt unsigned int
- #define uchar unsigned char
- uchar t_max = 10; //一個(gè)周期
- static uchar t = 0,i = 0; //PWM計(jì)數(shù)
- /*
- 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點(diǎn)正弦波樣本值
- void main(void)
- {
- TMOD = 0x02; //定時(shí)器0,工作模式2,8位定時(shí)模式
- TH0 = 146; //寫入預(yù)置初值(取值1-255,數(shù)越大PWM頻率越高)
- TL0 = 146; //寫入預(yù)置值(取值1-255,數(shù)越大PWM頻率越高)
- TR0 = 1; //啟動(dòng)定時(shí)器
- ET0 = 1; //允許定時(shí)器0中斷
- EA = 1; //允許總中斷
- P2 = 0xff; //初始化P1
- while(1)
- {
- ;
- }
- }
- timer0()interrupt 1 using 2
- {
- t++; //每次定時(shí)器溢出加1
- if(t < t_max && t >= SinParam[i]) //PWM周期 5
- {
- P2 = 0x00; //使LED燈亮
- }
- else if( t >= t_max)
- {
- t = 0; //使t=0,開(kāi)始新的PWM周期
- i++;
- P2 = 0xff;
- }
- if(i >= 20) i = 0;
- }
復(fù)制代碼 |