-1

私はあなたの時間を無駄にするつもりはなく、説明とともにコードを投稿するだけです

#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void){
    sei(); //Enable interrupts 
    DDRB = (1 << PORTB3);//Set pin P3 as an output and other pins as inputs
    //PORTB = 0xff;
    DDRA = (1 << PORTA7);//Set pin A7 as an output and other pins as inputs
    //PORTA = (1 << PORTA7);
    TCCR0 = (1 << WGM00) | (1 << WGM01) | (1 << COM01);//Enable PWM, and configure Timer
    TIMSK = (1 <<  TOIE0);//Enabling an interrupt
    OCR0 = 255;//Setting comparison value for the Output compare unit
    TCCR0 |= (0b110 << CS00);//Selecting the clock as the falling edge on a certain pin

    while(1){
    /*
     * The portion of the code creates a square wave with a period of 39 us, which means that the falling edge occurs at a period of 78us, and since the output period of 
     * the PWM is 50Hz for a servo, that fits perfectly (1/(79*10^-6 * 256) ~ 50), but for some reason, the servo doesn't move...*/
       PORTA ^= (1<< PORT7);
       _delay_us(39);
    }
}

だから問題は何ですか??私は周波数を測定するためのオシロスコープを実際に持っていないので、そうするように頼まないでください. 、しかし、電源自体は5Vを供給していましたが、これは信号ピンをPWMピンに接続したときにのみ発生し、5Vレールがサーボに接続されているかどうかに関係なく発生しました...問題についてのアイデアは??

4

1 に答える 1

0

PWM 出力のデューティ サイクルは 50% であるため、電圧計で測定すると、実効ポート出力電圧は 5v から 2.5v に減少します。グランドに対する電圧を測定していると仮定すると、5v 電源ラインがサーボに接続されていても違いはありませんが、PWM 信号が接続されていない場合は違いがあります。

サーボが双方向の場合、50% のデューティ サイクルで静止状態を維持できる可能性があります。別のデューティ サイクルを試してみてください。PWM 周期をハードコーディングしたように見え、半サイクルごとに出力が反転します。次のようなものを試してください

PORTA ^= (1<< PORT7);
_delay_us(28);
PORTA ^= (1<< PORT7);
_delay_us(50);
于 2016-06-19T13:17:00.837 に答える