2016-08-17 6 views
0

背景:1つの32ビットタイマを使用して1つのピンにPWM入力を読み取り、2つのPWM出力を制御するために使用しているLPC11C24マイクロコントローラがあります。他のピン。その入力と出力が同じタイマーにあるので、私はタイマーレジスタ(TC)のリセットを一切しません。特に出力については、信号をHIGHにするか、信号がLOWになるように、マッチ・レジスタが連続的に増加するように設定しています。タイマリセットなしでLPC11CXXシリーズのマイクロコントローラでPWM出力をセットアップする方法

例:割り込みが発生するたびに、10000ティック、デューティサイクルが50%の場合、次の割り込みに備えて5000をMR0に追加します。

初期化:

IOCON_R_PIO1_1_bit.FUNC = 0; 
IOCON_R_PIO1_1_bit.MODE = 0; 
GPIO1DIR_bit.P1_1 = 1; 

LPC_TMR32B1->MCR |= (1<<0); /* Interrupt when MR0 matches TC */ 
LPC_TMR32B1->MR0 = 0; /* zero the match value */ 

は、ISR:私はこのピンを調べるとき

/* If interrupt was from MR0 */ 
if(LPC_TMR32B1->IR & (1<<0)) 
{ 
    /* Clear the interrrupt */ 
    LPC_TMR32B1->IR = (1<<0); 

    if(GPIO1DATA_bit.P1_1 == 1) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC; 
     LPC_TMR32B1->MR0 += OutputChan0MatchPeriodFalling; 
     GPIO1DATA_bit.P1_1 = 0; 
    } 
    else if(GPIO1DATA_bit.P1_1 == 0) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC; 
     LPC_TMR32B1->MR0 += OutputChan0MatchPeriodRising; 
     GPIO1DATA_bit.P1_1 = 1; 
    } 
} 

私は一切出力を得るので、私は私が間違ってやっているかわからないんだけど。私が持っている別の問題は、私はいくつかの外部コード(基本的にはMR0 = TCを設定する)から新しいデューティサイクルを提供する場合を除いて、割り込みを取得していないということです。 TCはMR0よりも先に進んでいると思いますが、それを防ぐ方法がわかりません。どうもありがとうございます!追加情報があれば教えてください。

+0

「PWM **入力**」はどのように制御されますか? – Olaf

+0

@Olafありがとうございます。質問が編集されました。 – LaneL

答えて

0

私はそれを理解しました。ここでは2つのことがうまくいかない。

I/O設定が正しくありませんでした。ドキュメントを読んだ後、GPIOの機能を1に設定する必要があることが分かりました。 0は予約済みの関数です。

ここで間違っているのは、ISRを処理するためにタイマーを一時停止する必要があるということです。

/* If interrupt was from MR0 */ 
if(LPC_TMR32B1->IR & (1<<0)) 
{ 
    /* Pause timer */ 
    LPC_TMR32B1->TCR = 0; 

    /* Clear interrupt */ 
    LPC_TMR32B1->IR = (1<<0); 

    if(GPIO1DATA_bit.P1_1 == 1) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC + OutputChan0MatchPeriodFalling; 
     GPIO1DATA_bit.P1_1 = 0; 
    } 
    else if(GPIO1DATA_bit.P1_1 == 0) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC + OutputChan0MatchPeriodRising; 
     GPIO1DATA_bit.P1_1 = 1; 
    } 

    /* Restart timer */ 
    LPC_TMR32B1->TCR = 1; 
} 
+0

タイマーの一時停止が間違っています。すべての作業が完了するまで割り込みソースをクリアして待つべきではありませんか? – Lundin

+0

@ Lundin私もその懸念を抱いていましたが、高周波数の場合、タイマーはマッチレジスタより先に進み、次の立上り/立下りエッジで割り込みを起こすことはありません。私はISRの終わりに割り込みをクリアしようとしましたが、何の違いも見られませんでした。 – LaneL

関連する問題