2017-01-21 8 views
0

私は256(0-255)の異なる明るさでLEDを制御しようとしています。私のコントローラは80mhzに設定され、rtosで動作します。私はクロックモジュールを5マイクロ秒ごとに中断するように設定しています。 150にLEDが調光されるが、それは本当に右に行われている場合、私はよく分からないマイクロコントローラrtos/biosの制御LEDの明るさ

int counter = 1; 
int brightness = 0; 


void SetUp(void) 
{ 

SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); 
GPIOPinTypeGPIOOutput(PORT_4, PIN_1); 

Clock_Params clockParams; 
Clock_Handle myClock; 
Error_Block eb; 
Error_init(&eb); 
Clock_Params_init(&clockParams); 
clockParams.period = 400; // every 5 microseconds 
clockParams.startFlag = TRUE; 
myClock = Clock_create(myHandler1, 400, &clockParams, &eb); 
if (myClock == NULL) { 
    System_abort("Clock create failed"); 
} 

} 


void myHandler1(){ 

brightness = 150; 


while(1){ 
    counter = (++counter) % 256; 
    if (counter < brightness){ 
     GPIOPinWrite(PORT_4, PIN_1, PIN_1); 
    }else{ 
     GPIOPinWrite(PORT_4, PIN_1, 0); 
    } 
} 
} 
+0

あなたはそれが正しいとは確信していませんか?あなたはそれを試しましたか?無限ループを持つ割り込みハンドラはまったく動作しないでしょう! counterが 'uint8_t'だった場合、'%256'も必要ありません。 – Clifford

答えて

3

5マイクロ秒の割り込みは背の高い80 MHzのプロセッサを求める、と少しを残している256個の異なるレベルを持っています他の作業をしていない場合は、割り込みをまったく使用する必要はありません。単にクロックカウンタをポーリングするだけで済みます。 RTOSはあまりにも些細な作業でも投げられるプロセッサが多いでしょう。

タスクを実行するより良い方法は、タイマーのPWM(パルス幅変調)機能を使用することです。ソフトウェアオーバーヘッドをゼロにして正確に輝度を制御することができます。あなたのプロセッサはもっと面白いことをするようになります。

LEDコントロールがあれば、はるかに低いパフォーマンスのプロセッサで管理できるPWMを使用します。

割り込み/ GPIOを使用する必要がある場合(たとえば、タイマーがPWM生成をサポートしていないか、またはLEDがPWM対応ピンに接続されていないなど)、タイマを増分的に設定する方が効率的です。たとえば、150:105のmark:spaceの場合、割り込みで150 * 5us(9.6ms)に設定し、GPIOをトグルして、タイマーを105 * 5us(6.72ms)に設定します。

解決策の大きな問題は、割り込みハンドラが復帰しないことです。割り込みは完了まで実行し、実行時間はできるだけ短くすることが望ましく、好ましくは決定的です。

ハードウェアPWMを使用しなければ、あなたのコードの断片をもとに、次のことは、おそらくあなたが必要なものに近いです:

私はソフトウェアの調光の負荷を軽減するための代替戦略を起草していますクリフォードの付勢に
#define PWM_QUANTA = 400 ; // 5us 
static volatile uint8_t brightness = 150 ; 
static Clock_Handle myClock ; 


void setBrightness(uint8_t br) 
{ 
    brightness = br ; 
} 

void SetUp(void) 
{ 
    SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ); 
    GPIOPinTypeGPIOOutput(PORT_4, PIN_1); 

    Clock_Params clockParams; 
    Error_Block eb; 
    Error_init(&eb); 
    Clock_Params_init(&clockParams); 

    clockParams.period = brightness * PWM_QUANTA ; 

    clockParams.startFlag = TRUE; 
    myClock = Clock_create(myHandler1, 400, &clockParams, &eb); 
    if (myClock == NULL) 
    { 
    System_abort("Clock create failed"); 
    } 
} 

void myHandler1(void) 
{ 
    static int pin_state = 1 ; 

    // Toggle pin state and timer period 
    if(pin_state == 0) 
    { 
    pin_sate = 1 ; 
    Clock_setPeriod(myClock, brightness * PWM_QUANTA) ; 
    } 
    else 
    { 
    pin_sate = 0 ; 
    Clock_setPeriod(myClock, (255 - brightness) * PWM_QUANTA) ; 
    } 

    // Set pin state 
    GPIOPinWrite(PORT_4, PIN_1, pin_state) ; 
} 
+0

単純な代替方法として、ハードウェアに適切なPWMチャネルが不足している場合は、代わりにデルタシグマ変調を使用し、解像度を維持しながら周波数を下げます。これは、モジュラアキュムレータに輝度を加え、オーバーフローが発生した割込みサイクルでLEDを点灯させることになります。欠点は、低周波スイッチングを回避するために、ほぼ0 /完全な輝度値をクランプする必要があることです。 – doynax

+1

@doynax:これは、質問に対するコメントの回答として投稿する必要があります。私はそれがこの答えに対するコメントとして適切であるとは確信していません。 – Clifford

+0

Shrug ..ハードウェアの設計が互換性がないと判明した場合の答えに記載されている問題の代替戦略です。周波数を下げてCPUを邪魔しても、元のソリューションではまだ調光を実行する必要があるため、追加の問題が発生する可能性があります。さらに、完全な回答を投稿することはより多くの仕事です;) – doynax

0

400クロックサイクルごとにサービス割り込みが困難になることがあるためです。好ましい解決法は、当然のことながら、ハードウェアのパルス幅変調を利用できるようにすることである。

1つのオプションは、PWMの側面だけで割り込みを設定することです。残念なことに、この戦略では、調整が行われている間に時間が経過するとレースとドリフトが発生し、複数のチャンネルには不十分なスケールになります。

パルス幅からデルタシグマ変調に切り替えることができます。コンセプトの背景にはかなりの理論がありますが、この状況では、調光レベルに比例した平均オン時間を維持しながら、できるだけ早くピンのオンとオフを切り替えることになります。その結果、全体的なスイッチング周波数を可視レベルまで低下させることなく、割込み周波数を低減することができる。

// Brightness to display. More than 8-bits are required to handle full 257-step range. 
// The resolution also course be increased if desired. 
volatile unsigned int brightness = 150; 

void Interrupt(void) { 
// Increment the accumulator with the desired brightness 
static uint8_t accum; 
unsigned int addend = brightness; 
accum += addend; 
// Light the LED pin on overflow, relying on native integer wraparound. 
// Consequently higher brightness values translate to keeping the LED lit more often 
GPIOPinWrite(PORT_4, PIN_1, accum < addend); 
} 

制限は、スイッチング周波数が50%の明るさからの距離とともに減少することである:

は、以下の実施例の実装です。したがって、目に見えるフリッカーを防ぐために、最後のNステップを0または256にクランプする必要があります。

ああ、スイッチング損失がアプリケーションで懸念される場合は注意してください。

関連する問題