1

パルス幅を測定したいのですが、4 つの信号を測定する必要があるため、そのオプションを提供するピン ICP1 が 1 つしかないため、タイマー キャプチャ割り込みを使用できません (または使用できますか?)。だから私はタイマーを使用するという違いでarduino pulseInのようなものを実装しようとします(arduinoには他の実装がありますが、非常に似ています)。

実際の問題は、 pulseIn が何も返さず、無限ループで動作し続けることです。

ATmega16を使用。現在、PB2 でのみテスト中です。

unsigned long pulseIn()
{
    unsigned long duration = 0;
    DDRB = 0x00;

    /* Initiate timer and wait for the end of previous pulse*/
    initTime1();
    while(getPortBPin(2) == 1);

    /* Wait for current pulse begin */
    while(getPortBPin(2) != 1);

    /* Time before previous pulse ended */
    TCNT1 = 0;
    overflowCounter = 0;

    /* Wait for current pulse end */
    while(getPortBPin(2) == 1);

    /* Closk freq is 2 MHz = 1/2 us per tick */
    duration = (TCNT1+overflowCounter*65536)/2;
    overflowCounter = 0;
    stopTimer1();

    return duration;
}

void initTime1()
{
    /* Noise filtering */
    TCCR1B = (1 << ICNC1);

    /* Set prescaling factor to 8 */
    TCCR1B |= (1 << CS11);

    /* Enable overflow interruption */
    TIMSK = (1 << TOIE1);

    /* Clear counter */
    TCNT1  = 0;
}

void stopTimer1()
{
    TCCR1B = 0;
    TIMSK = 0;
    TCNT1 = 0;
}


uint8_t getPortBPin(uint8_t pin)
{
    if(pin < 0 || pin > 8)
    {
        return 0;
    }    

    return (uint8_t)((PINB >> pin) & 0x01);
}

アップデート

それが私のプロテウススキームです。信号は発電機から来ます。周波数は 1kHz、幅は 50% です。振幅は 5 ボルトです。 プロテウススキーム

アップデート

すみません、それはばかげた間違いでした。それは正常に動作します。期待どおりに動作しなかったものをデバッグします。

4

1 に答える 1