1

lpc1769のタイマーを使ってパルス(pwm)を生成するアプリケーションを開発しました。パルスの周期は10ミリ秒で、必要に応じてパルス幅を変えることができます。パルス幅は、10ミリ秒の方形波(オン期間7.2ms、オフ期間2.8ms)である基準信号に応じて生成されます。この信号の立ち上がりエッジがあるときはいつでも、PWM パルスが開始する必要があります。これで問題なく動作しています。立ち上がりエッジを検出するために、外部割り込みでGPIO割り込みを使用しました3 ISRは次のとおりです。

1) GPIO ピンの立ち上がりエッジの場合 (P2.11)

2) 端子の立ち上がりエッジ状態をクリアします。

3)次に、タイマーを数ミリ秒に設定します

およびタイマー ISR で 1) 保留中のタイマー IRQ をクリアする 2) PWM パルスを生成する GPIO ピンを高くする (P2.6) 3) タイマーを数ミリ秒設定してから、ピンをクリアする (P2.6) (同じタイマー)は両方の ISR で使用されます) 4) タイマーを無効にし、GPIO ピン (P2.11) の立ち上がりエッジ割り込みを再度有効にすると、参照信号の立ち上がりエッジで外部割り込み 3 の ISR が再び機能し、上記のように継続します。

今、私はアプリケーションを開発する際のコードで問題を抱えています。

1) 立ち上がりエッジが割り込みを無効にし、タイマーを 8 ミリ秒の遅延に設定する場合。

2) タイマー ISR で、この後 10 pwm サイクルを生成し、外部割り込みを再度有効にします。(両方の ISR で同じタイマーが使用されます)。

3)したがって、私の出力は、基準信号の立ち上がりエッジに対して8ミリ秒の遅延、次に10 pwmサイクル(すべて10ミリ秒の期間があります)、基準信号の立ち上がりエッジおよび10 pwmサイクルに対して再び8ミリ秒の遅延になるはずです。

ただし、参照信号の立ち上がりエッジに関係なく、10 サイクル後に外部割り込みを有効にすると、8ms の遅延が追加されます。最後の 10 番目のサイクルが完了するたびに、割り込みを再度有効にするので、この時点から 8ms の遅延を追加するだけです。私の質問は、基準信号の立ち上がりエッジに対して割り込みが有効になっている場合、立ち上がりエッジに対してのみ ISR を提供する必要があるということです。しかし、これはこの場合には起こりません。私はこの行動を理解していません。/////////////////////////////////////////////// /////////////////////////////////////////////// / これは私のコードです。これは外部割り込みの ISR です 3

void GPIO_IRQ_HANDLER(void)
{
    uit32_t i;
    if(((Chip_GPIOINT_GetStatusRising(LPC_GPIOINT, GPIO_INTERRUPT1_PORT) >> GPIO_INTERRUPT1_PIN) & 0x01) != 0) /*Group 1*/

    {

        count1 = 0;

        start_timer1((HALF_WAVE_PERIOD - DELAY) * timerTick);

        NVIC_ClearPendingIRQ(GPIO_INTERRUPT_NVIC_NAME);

        NVIC_DisableIRQ(GPIO_INTERRUPT_NVIC_NAME);

     }
}

Timer1 ISR は

    void TIMER1_IRQHandler(void)
    {
        if (Chip_TIMER_MatchPending(LPC_TIMER1, 1) == 0)
        {
            return;
        }
        Chip_TIMER_ClearMatch(LPC_TIMER1, 1);
        if(count1 > 10)
        {
            LPC_GPIO1->PIN = (LPC_GPIO1->PIN & ~(1 << 19));
            stop_timer1();
        } 
        else
        {
            switch(state1)
            {
                case 1:
                        state1 = 2;
                        LPC_GPIO1->PIN = (LPC_GPIO1->PIN | (1 << 19));
                        set_timer1(2000 * timerTick);
                break;

                case 2:
                        state1 = 1;
                        LPC_GPIO1->PIN = (LPC_GPIO1->PIN & ~(1 << 19));
                        count1++;
                        set_timer1((HALF_WAVE_PERIOD - DELAY) * timerTick);
                break;

                default:
                break;
            }
        }
}

where,
HALF_WAVE_PERIOD = 10000 microseconds
DELAY = 2800 microseconds
GPIO_INTERRUPT1_PORT= PORT2
GPIO_INTERRUPT1_PIN = P2.12
GPIO_INTERRUPT_NVIC_NAME = EINT3_IRQn
GPIO_IRQ_HANDLER =  EINT3_IRQHandler

関数 start_timer1 を使用して、timer1 を初期化し、timer1 を指定されたティック数に設定し、一致時に割り込みます。set_timer1 : 指定されたティックと割り込みに対して timer1 を設定します。stop_timer1 : timer1 を無効にし、外部割り込み 3 を有効にします。

4

0 に答える 0