0

出力比較モードで高速 pwm を使用して、PB4 と PB5 から同じアナログ pwm 出力電圧を取得するためのコードがあります。しかし、それらからの電圧は異なります。この理由は何でしょうか?また、どちらのピンからの電圧も 1.23 V に近くありません。これは、出力電圧であるべきです。

これがコードです。

#include <`avr/io.h`>

#include <`avr/interrupt.h`>

ISR(TIMER0_COMP_vect)
{
    cli();
    PORTB &= ~(1<<PB5);
    sei();
}


ISR(TIMER0_OVF_vect)
{
    cli();
    PORTB |= (1<<PB5);
    sei();
}

void init(void)
{
    TCCR0 |= (0<<FOC0)|(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<COM00)|(1<<CS02)|(1<<CS01)|(1<<CS00);
    OCR0 = 63;
    TIMSK |= (1<<OCIE0)|(1<<TOIE0);
}


int main(void)
{
    DDRB = 0xFF;
    PORTB = 0xFF;
    init();
    sei();
    while(1);
}
4

1 に答える 1

1

まず、ATMega328p のようなものを使用している場合、3 つの CS ビットをすべて設定すると、内部クロックを使用するのではなく、外部クロック ソースが有効になるため、タイマーは動作しません (実際に外部タイマー クロックを使用しない限り)。ソース)。使用しているマイクロコントローラに応じて、それらのビットが特定のプリスケーラ値を有効にしていることを確認してください。

次に、測定方法と PWM の実際の動作方法が原因で問題が発生する可能性もあります。Arduino を扱うときはアナログ出力としてリストされることがよくありますが、パルス幅変調は実際にはまさにそのとおりです。さまざまなデューティ サイクルで、デジタル出力をグラウンドと VCC (おそらく 5V) の間で急速に切り替えます。これらの出力ピンの 1 つをオシロスコープで見ると、何らかの方形波が表示される可能性があります。 ここに画像の説明を入力

マルチメーターで測定すると、表示される値は、出力が高または低のときに取得されたサンプルの組み合わせであり、おそらくこれらのランダムなタイミングのサンプルの平均であるため、予期しない読み取り値になります.

希望する結果を得るには、デジタル出力をスムーズにする必要があります。つまり、これは多くの場合、出力ピンに接続された抵抗とコンデンサで構成されるローパス フィルターで行われます。 ここに画像の説明を入力

これは、方形波を使用して、コンデンサが高いときに抵抗を介してコンデンサを充電し、低いときに放電することによって機能します。低い時間より高い時間 (より長いデューティ サイクル) を持つことにより、コンデンサはより高い電圧で安定します (逆も同様です)。抵抗器は、AVR 出力ピンから引き出される電流を制限します (コンデンサが 0V で出力がハイに駆動されるように、出力を一時的にグランドに効果的に短絡させます)。

あなたの場合、約4.7Kの抵抗器と約2ufのコンデンサーがおそらく適しています。容量または抵抗を増やしてリップルを減らします。

于 2014-02-04T02:29:48.407 に答える