2013-02-14 2 views
0

Я работаю над проектом, в котором мне нужно отображать разные цвета на светодиодах RGB. Я использую pwm для управления различными цветами на светодиоде. Мой Pic - это PIC24FJ64GA004, с которым я сейчас работаю. Основной концепцией этого проекта является использование переключателя для управления цветами.переменная настройка PWM в PIC24FJ64GA002

Цвета на светодиодах RGB будут соответствовать дням и месяцам в году. Для этого я использую 7-сегментный светодиод с переключателем для подсчета дней и месяца.

Проблема на данный момент следующий код. Я пытаюсь изменить значения 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 
//**********************************// 
+3

Что такое «что-то странное»? – Throwback1986

+0

Можете ли вы определить более четко а), что вы получаете на булавках и б) что вы ожидали увидеть на булавках? –

+0

Привет, я хочу переменную PWM на Pins. Поскольку я использую светодиод RGB с тремя каналами, идущими на разные контакты светодиодов. Я хочу, чтобы светодиод показывал мне разные цвета. – user12318

ответ

2

Вы обновляете свои ШИМ каждый раз вокруг цикла.

Очень маловероятно, что счетчик успел истечь, поэтому вы продолжаете его перезагружать, прежде чем у него будет шанс «сделать» цикл PWM.

В конце цикла вам нужно дождаться (по крайней мере, одного из) ваших PWM, чтобы они истекли.

Альтернативным способом может быть установка следующего значения, которое вы хотите в цикле, и иметь копию процедуры обслуживания прерывания, которая будет установлена ​​в регистр PWM по истечении таймера. И как только это произошло, вы можете настроить следующее следующее значение :). Вам нужно позаботиться о том, как вы передаете значения между основным циклом и ISR, поскольку они являются фактически различными «потоковыми» контекстами.

+0

Привет, Можно привести пример. Я новичок в встроенном C и мне нужно какое-то направление. Я понимаю вашу концепцию, но я не знаю, как ее реализовать. Даже небольшая демонстрация будет очень полезна. заранее спасибо – user12318

+0

Извините, я не достаточно знаком с вашим конкретным чипом, чтобы просто выбросить какой-то код, который, как я думаю, будет работать ... и у меня нет времени на то, чтобы создать что-то строгое. –

Смежные вопросы