2017-06-06 5 views
0

私は運がないAtmega2560のtimer0でPB7ピンからPWM出力を取得しようとしています。この接続repro.My PWMの設定のためのトーンを生成する必要があります:Atmega2560 PWM on PB7

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);。 3つすべてが設定されている場合は、以下を意味します。** T0ピンの外部クロックソース。立ち上がりエッジでクロック**。 ** T0 **に外部クロックソースがない場合は、プリスケーラなしのソースとしてCPU周波数を得るために 'CS00 'を設定するだけです。 –

+0

これは動作しますが、現在はPB7で出力していますが、周波数が高すぎます。私がSoundOutput(400)を呼び出すと、トーン生成には高すぎる12.5usのOスコープ期間に入ることができます。 –

+0

2560のCPU周波数が16MHzであるため、はいです。したがって、トーン信号の周期は、 't =(1/f_CPU)* uintTone/2'となります。パラメータuintToneを結果の周波数にしますか?私は答えとして時間があるので、後でそれを掲示します。 –

答えて

1

あなたのコメントに基づいて、あなたのタイマーへの入力として〜12MHzのクロックを使用しています。コードから、OTC0Aを先頭にCTCモードで8ビットタイマ0を使用しています。 OC0Aがコンペアマッチでトグルするように設定されています。

2560のデータシートによると、あなたのタイマーの周波数は次式で与えられます。

F_CLK /(2 *(1 + OCR0A))| F_CLK〜= 12MHzの

それはあなたのPWMを生成することができ、あなたの最小周波数は次式で与えられていることを意味してこれは、8ビットのタイマです:

12e6 /(2 *(1 + 255))〜= 20kHzまで

タイマーに使用している時計の速度を遅くしたり、タイマーを高く設定したりしない限り、その設定で可聴音を生成することはできません。

1)16ビットカウンタ(timer1)を使用してください。

/* 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)の代わりに、タイマ・クロックとして内部クロックソースを使用します。それはあなたにあなたのトーンを生成するための範囲の多くを与える必要があります〜90Hzのの分周波数と〜6MHzのの最大周波数を、与えます外部ソース。ヒューズのビットを変更したり、コードのどこかでヒューズのビットを変更したりしない限り、クロックは1MHzになります。クロックを8でプリスケールすると、〜250KHz〜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

はい!私は2番目のソリューションを使用して、それは素晴らしい動作します。ありがとうございます:) –

+0

問題はありません:PWMの使用方法に関する参考情報へのリンクがあります: http://allaboutavr.com/index.php/2017/05/13/chapter-5-timers- and-pwm-pulse-width-modulation/ – rlphillipsiii

+0

まあ、私の喜びは少し予備でした。私は今、音を生成することができますが、周波数は奇妙です。私はスピーカーから正確な周波数を出力する必要がありますが、230KHz(OCR0A = 2)と2.69KHz(OCR0A = 255)と0Hzの範囲の周波数を出力することができますOCR0A = 0またはOCR0A = 1 –

関連する問題