0

RGB led で異なる色を表示する必要があるプロジェクトに取り組んでいます。pwm を使用して、LED でさまざまな色を駆動しています。私の写真は私が今取り組んでいるPIC24FJ64GA004です。このプロジェクトの基本的なコンセプトは、スイッチを使用して色を制御することです。

RGB LED の色は、年月日によって異なります。そのために、日と月をカウントするスイッチ付きの 7 セグメント LED を使用しています。

現時点での問題は次のコードです。次の設定でPWM値を変更しようとしています。しかし、それを変更する代わりに、それは私に何か奇妙なことを与えています. 皆さんの助けが必要です。この件で私を助けてくれませんか。

 for( counter=0x0000;counter<=0x4571;counter++){ 
//*****Timer2 starting from here*****//
PR2                 = 0x4571;   // Initialize PR2 with 0x4571 = 17777 as PWM cycle
IFS0bits.T2IF       = 0;        // Clear Output Compare interrupt flag
IEC0bits.T2IE       = 1;        // Enable Output Compare interrupts
T2CONbits.TON       = 1;        // Start Timer2 with assumed settings
//**********************************//
//*****For RED LED OC1 choosed with timer 2*****//
OC1CONbits.OCM      = 0;        // Output compare channel is disabled
OC1R                = 0x0000 ; // Initialize Compare Register1 with 50% duty cycle
OC1RS               = counter;  // Initialize Secondary Compare Register1 with 50% duty cycle
OC1CONbits.OCSIDL   = 0;        // Output capture will continue to operate in CPU Idle mode
OC1CONbits.OCFLT    = 0;        // No PWM Fault condition has occurred (this bit is only used when OCM<2:0> = 111)
OC1CONbits.OCTSEL   = 0;        // Timer2 is the clock source for output Compare
OC1CONbits.OCM      = 0x6;      // PWM mode on OC, Fault pin disabled

//*****For Green Led OC2 and OC3 Choosed with timer2 as well*****//

OC2CONbits.OCM      = 0;        // Output compare channel is disabled
OC2R                =0x0000;        // Initialize Compare Register1 with 50% duty cycle
OC2RS               =counter;   // Initialize Secondary Compare Register1 with 50% duty cycle
OC2CONbits.OCSIDL   = 0;        // Output capture will continue to operate in CPU Idle mode
OC2CONbits.OCFLT    = 0;        // No PWM Fault condition has occurred (this bit is only used when OCM<2:0> = 111)
OC2CONbits.OCTSEL   = 0;        // Timer2 is the clock source for output Compare
OC2CONbits.OCM      = 0x6;      // PWM mode on OC, Fault pin disabled


//*****For  Blue Led OC2 and OC3 Choosed with timer2 as well*****//
OC3CONbits.OCM      = 0;        // Output compare channel is disabled
OC3R                = 0x0000;           // Initialize Compare Register1 with 50% duty cycle
OC3RS               = counter;  // Initialize Secondary Compare Register1 with 50% duty cycle
OC3CONbits.OCSIDL   = 0;        // Output capture will continue to operate in CPU Idle mode
OC3CONbits.OCFLT    = 0;        // No PWM Fault condition has occurred (this bit is only used when OCM<2:0> = 111)
OC3CONbits.OCTSEL   = 0;        // Timer2 is the clock source for output Compare
OC3CONbits.OCM      = 0x6;      // PWM mode on OC, Fault pin disabled

  }

しかし、このコードは問題なく動作しています。価値観もバラバラです。それは正常に動作します。

   //*****For RED LED OC1 choosed with timer 2*****//
OC1CONbits.OCM      = 0;        // Output compare channel is disabled
OC1R                = 0x22B8;   // Initialize Compare Register1 with 50% duty cycle
OC1RS               = 0x22B8;   // Initialize Secondary Compare Register1 with 50% duty cycle
OC1CONbits.OCSIDL   = 0;        // Output capture will continue to operate in CPU Idle mode
OC1CONbits.OCFLT    = 0;        // No PWM Fault condition has occurred (this bit is only used when OCM<2:0> = 111)
OC1CONbits.OCTSEL   = 0;        // Timer2 is the clock source for output Compare
OC1CONbits.OCM      = 0x6;      // PWM mode on OC, Fault pin disabled

//*****For Green Led OC2 and OC3 Choosed with timer2 as well*****//

OC2CONbits.OCM      = 0;        // Output compare channel is disabled
OC2R                =0x22B8;    // Initialize Compare Register1 with 50% duty cycle
OC2RS               =0x22B8;//0x22B8;   // Initialize Secondary Compare Register1 with 50% duty cycle
OC2CONbits.OCSIDL   = 0;        // Output capture will continue to operate in CPU Idle mode
OC2CONbits.OCFLT    = 0;        // No PWM Fault condition has occurred (this bit is only used when OCM<2:0> = 111)
OC2CONbits.OCTSEL   = 0;        // Timer2 is the clock source for output Compare
OC2CONbits.OCM      = 0x6;      // PWM mode on OC, Fault pin disabled


//*****For  Blue Led OC2 and OC3 Choosed with timer2 as well*****//
OC3CONbits.OCM      = 0;        // Output compare channel is disabled
OC3R                = 0x22B8;   // Initialize Compare Register1 with 50% duty cycle
OC3RS               = 0x22B8;   // Initialize Secondary Compare Register1 with 50% duty cycle
OC3CONbits.OCSIDL   = 0;        // Output capture will continue to operate in CPU Idle mode
OC3CONbits.OCFLT    = 0;        // No PWM Fault condition has occurred (this bit is only used when OCM<2:0> = 111)
OC3CONbits.OCTSEL   = 0;        // Timer2 is the clock source for output Compare
OC3CONbits.OCM      = 0x6;      // PWM mode on OC, Fault pin disabled

//*****Timer1 starting from here*****//
PR1                 = 65535;    // Initialize PR2 cycle
T1CONbits.TCKPS     = 2;        // Setting pre-scaler to 1/64
IFS0bits.T1IF       = 0;        // Clear Output Compare interrupt flag
IEC0bits.T1IE       = 1;        // Enable Output Compare interrupts
T1CONbits.TON       = 1;        // Start Timer1 with assumed settings
//*****Timer2 starting from here*****//
PR2                 = 0x4571;   // Initialize PR2 with 0x4571 = 17777 as PWM cycle
IFS0bits.T2IF       = 0;        // Clear Output Compare interrupt flag
IEC0bits.T2IE       = 1;        // Enable Output Compare interrupts
T2CONbits.TON       = 1;        // Start Timer2 with assumed settings
//**********************************//
4

1 に答える 1

2

ループのたびに PWM を更新しています。

カウンターの有効期限が切れる可能性は非常に低いため、PWM サイクルを「実行」する前にカウンターをリセットし続けます。

ループの最後で、(少なくとも 1 つの) PWM が期限切れになるのを待つ必要があります。

別の方法として、ループ内で必要な次の値を設定し、タイマーが切れたときに割り込みサービス ルーチンでその値を PWM レジスタにコピーすることもできます。そして、それが発生したら、次の次の値を設定できます:)メインループとISRは事実上異なる「スレッド」コンテキストであるため、これらの間で値を転送する方法に注意する必要があります。

于 2013-02-15T12:06:52.557 に答える