1. 51單片機怎麼輸出6路PWM正弦波
先用軟體使其輸出6路PWM方波,每路上再用LC濾波網路濾除高頻部分,保留基波,就是正弦波輸出了!
手打不易,如有幫助請採納,謝謝!!
2. 如何用51單片機的定時器產生2路pwm
用定時器啊,用定時器定一段時間,便是pwm的周期,然後你可以設計任意數量的變數,如N1,N2等等,每一個變數都可以產生一個方波~給你簡單寫個程序吧
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;
void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;
if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}
3. 51單片機如何產生8路PWM波
用兩個定時器的方法是用定時器t0來控制頻率,定時器t1來控制占空比。大致的的編程思路是這樣的:t0定時器中斷讓一個i0口輸出高電平,在這個定時器t0的中斷當中起動定時器t1,而這個t1是讓io口輸出低電平,這樣改變定時器t0的初值就可以改變頻率,改變定時器t1的初值就可以改變占空比。
用一個定時器時(如定時器t0),首先你要確定pwm的周期t和占空比d,確定了這些以後,你可以用定時器產生一個時間基準t,比如定時器溢出n次的時間是pwm的高電平的時間,則d*t=n*t,類似的可以求出pwm低電平時間需要多少個時間基準n'。
因為這里我們是產生周期為1ms(1000hz)的pwm,所以可設置中斷的時間基準為0.01ms,,然後中斷100次即為1ms。在中斷子程序內,可設置一個變數如time,在中斷子程序內,有三條重要的語句:1、當time>=100時,time清零(此語句保證頻率為1000hz),2、當time>n時(n應該在0-100之間變化開),讓單片相應的i/o口輸出高電平,當time
評論
0
0
0
載入更多
4. 求51單片機PWM程序(一個定時器產生三路PWM 可獨立運作) 簡單來說就是用三路獨立的pwm控制三個LED
怎麼可能搞不了三路獨立的呢?樓下那位是被STC12C5A60S2的硬體蒙蔽了視線,他認為,STC12C只有兩路PWM,無法實現3路,你卻忘記了最原始的辦法,不要說STC12有PWM功能,即使是傳統的AT89S52這類沒有PWM功能的單片機也一樣能夠實現樓主的要求.
下面我簡單的分析一下我的思路,樓主嘗試編程,如果不懂,再追問:
你是用三路獨立的PWM調光用的,PWM調光,為了保證不讓人眼產生閃爍,理論上PWM的頻率要大於20Hz,而在實際的測試用,一般PWM要大於25Hz才能保證不閃爍.為了保險起見,我們將PWM的頻率設定在30Hz左右,那麼,周期就是33.333333ms,假設,我們實現10級調光,那個 每級的時間是3.33333ms
然後設置三個變數和一個計數器,我描述不太清楚,你看一下程序:
sbit P1_0 = P1^0; //---P1.0,P1.1,P1.2是三路PWM輸出
unsigned char Set_PWM0 = 0; //--Set_PWM0 Set_PWM1 Set_PWM2
//--分別是低電平占整個脈沖的百分比
//--他們最小取0,最大取9
unsigned char counter = 0;//--用於計數的
void ISR_Timer0(void) interrupt 1 //---我們就用定時器0來做,不用PWM硬體
{ //----3.3333ms中斷一次
counter++;
if(counter >= 10) counter = 0;
if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;
if(counter >= Set_PWM1) P1_1 = 0; else P1_1 = 1;
if(counter >= Set_PWM2) P1_2 = 0; else P1_2 = 1;
}
這樣,定時器0用於決定PWM的反占空比,你只要設置 Set_PWM0等三個參數就可以了.
怎麼會實現不了呢?
5. 51單片機一個io口輸出不同的4個不同的pwm
1、首先要明白PWM的含義,PWM就是輸出不同占空比的脈沖,
2、普通51單片機IO口輸出PWM的話,可以用定時器去計時,比如要輸出100HZ的占空比50%的PWM。可以配置1ms的定時器中斷,在中斷中計數,一個中斷就是1ms,100HZ的脈沖,周期是10ms,50%的占空比,可以計數到5的時候把Io口取反;程序如下
void main()
{
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x18; // 晶振選擇12MHz,配置定時器中斷1ms
ET0 = 1;
TR0 =1;
EA= 1;
while(1); //程序停止在這里,,接下來就是去響應中斷
}
void Timer0() interrupt 1
{
static unsigned char t = 0;
TH0 = 0xFC;
TL0 = 0x18; //重新裝入初值;
t++;
if(t <5)
{
IO = 0;
}
else if(t < 10)
{
IO = 1;
}
else
{
t = 0;
}
}
上面的程序就是周期是10ms,占空比為50%的輸出了,,,需要調節占空比的話,只要改變IO口電平電話的時間就可以了;
3、多個IO口 輸出不同占空比的PWM;
原理是和1個的是一樣的, 多用幾個時間變數去計時,判斷就可以了。
4、上面說的是普通的51單片機,現在有很多增強型單片機,內部有PWM模塊,可以直接使用,賦值一個周期值,比如30000到特定的寄存器裡面; 然後改變第一次電平變化的時間和第二次電平變化的時間 就可以實現不同的占空比調節了。具體的可以參考下單片機的數據手冊都會有常式說明的,。如果是使用內部PWM模塊的話,需要選擇含有多路PWM功能的單片機來滿足設計要求了。
6. 51單片機可以輸出幾路PWM
現在好多51單片機有自帶的PWM,沒有的話可用定時器做啊
比如STC的好多都有,最多的有四路PWM
7. 用51單片機同時實現四路PWM波,(C語言)
定個時間20ms周期的定時器,然後在定時器到達那些點的時候,讓自己設的那些變數依次變化。 再根據自己的變數,付給輸出埠就可以了。 看著像舵機的
看了你追問的,原來是四路每一路都產生變化的波形。那個也好辦。可以通過計算,把這幾個波形統一起來成一個周期,比如開始0.5ms到了,讓定的值取反,再加19.5再取反,再加1.3Ms再取反,再加18.7ms再取反...然後一直這樣把幾個都寫完。
還有種方法,來改變第一個pwm的設定值。比如放數組里一共5個設定值,分別代表你設定的高電平時間,依次替換第一個定時器裡面的中端時間即可。
當然,前兩種都差不多,還有一種方法供你擴展:就是用兩個定時器,然後按照時間去匹配修改。當然,51單片機那精度就不說了,不太確信可以達標,一個定時器進中斷了,另一個就要停一下。。
BTW,個人感覺51的單片機沒有很好的pwm模塊,這樣寫了Pwm程序,別的就幹不了了。建議用用帶epwm模塊的mcu,直接調用epwm和epwm中斷,節省cpu資源,可以多寫很多程序。
8. 如何用51單片機產生4路PWM信號
可以用定時器做啊,我用吳 鑒 鷹單片機開發板做過的,用定時器加標志位做,可以產生很多路PWM波。