2017-06-06 124 views
0

我想在Atmega2560上用timer0從PB7引腳獲得PWM輸出,但沒有運氣。它應當能夠連接repro.My PWM設置基調是:PB7上的Atmega2560 PWM

DDRB = 0b11100000; 
PORTB = 0b00000000; 

OCR0A = 0x04; 
TCCR0A = (0 << COM0A1) | (1 << COM0A0) | (1 << WGM01) | (0 << WGM00); 
TCCR0B = (0 << WGM02) | (0 << CS02) | (0 << CS01) | (0 << CS00); 

,然後我有這個功能,這應該產生的聲音:

void SoundOutput(unsigned int uintTone) 
{ 
    if (uintTone != 0) 
    { 
     LED_2(1); 
     OCR0A = uintTone; 

     TCCR0B |= (1 << CS02) | (1 << CS01) | (1 << CS00); 
    } 
    else 
    { 
     TCCR0B &= ~((1 << CS02) | (1 << CS01) | (1 << CS00)); 
    } 
} 

但沒有任何反應,當我與音叫它參數。你能幫我麼?

+1

我認爲這是設置來源的這一行:'TCCR0B | =(1 << CS02)| (1 << CS01)| (1 << CS00);'。如果所有三個都被設置,則意味着:** T0引腳上的外部時鐘源。時鐘在上升沿**。如果在** T0 **上沒有外部時鐘源,只需將'CS00'設置爲例如CPU頻率作爲無預分頻器的信號源。 –

+0

這個工作,我現在在PB7輸出,但現在頻率太高。當我調用SoundOutput(400)時,我可以選擇12.5us的O範圍時間段,這對於音調生成來說太高。 –

+0

是的,因爲2560的CPU頻率是16MHz。所以你的音頻信號的週期將是:'t =(1/f_CPU)* uintTone/2'。你想要參數'uintTone'是最終的頻率?我會稍後發佈,因爲我有時間作爲答案。 –

回答

1

根據您的意見,您正在使用〜12MHz時鐘作爲定時器的輸入,並且從您的代碼中,使用CTC模式下的8位定時器0和OCR0A作爲頂層。您已將OC0A設置爲在比較匹配上進行切換。 |

F_CLK /(2 *(1 + OCR0A)):

根據該數據表2560,您的計時器的頻率由下式給出F_CLK〜= 12MHz的

這是一個8位定時器,這樣就意味着你,你的PWM可以產生最小頻率由下式給出:

12e6 /(2 *(1 + 255))〜= 20KHz的

除非您放慢定時器使用的時鐘或使用可以計數更高的定時器,否則您只能使用該配置生成可聽音。

1)使用16位計數器(即timer1)。這將會給你〜90Hz的的最小頻率和〜6MHz的的最大頻率,這應該給你足夠的範圍,以產生音調:

/* WGM BITS = 0100: CTC Mode */ 
/* COMA BITS = 01: Toggle OC1A on compare match */ 
/* CS BITS = 111: External clock source on rising edge */ 

TCCR1A = (0 << COM1A1) | (1 << COM1A0) | (0 << WGM01) | (0 << WGM00); 
TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS02) | (1 << CS01) | (1 << CS00); 

2)使用內部時鐘源作爲定時器時鐘,而不是一個外部源。除非你改變了熔絲位,或者你在代碼中改變它,時鐘將是1MHz。將時鐘預分頻爲8會給出一個〜250Hz - 〜60KHz的頻率範圍。

/* WGM BITS = 010: CTC Mode */ 
/* COMA BITS = 01: Toggle OC1A on compare match */ 
/* CS BITS = 010: Prescale the internal clock by 8 */ 

TCCR0A = (0 << COM0A1) | (1 << COM0A0) | (1 << WGM01) | (0 << WGM00); 
TCCR0B = (0 << WGM02) | (0 << CS02) | (1 << CS01) | (0 << CS00); 
+0

是的!我使用了第二種解決方案,效果很好。非常感謝:) –

+0

沒問題:下面是一些關於如何使用PWM的參考信息的鏈接: http://allaboutavr.com/index.php/2017/05/13/chapter-5-timers-和-pwm-pulse-width-modulation/ – rlphillipsiii

+0

那麼,我的歡樂有點初步。我現在可以發出聲音,但頻率很奇怪。我需要從揚聲器輸出精確的頻率,但是我可以在230KHz('OCR0A = 2')和2.69KHz('OCR0A = 255')的範圍內輸出(使用安捷倫頻率計數器測量) OCR0A = 0'或'OCR0A = 1' –