Por lo tanto, estoy tratando de lograr una frecuencia PWM de 1HZ con un ciclo de trabajo de aproximadamente el 70%. El problema que encontré fue con la frecuencia PWM mínima que puede alcanzar el PIC18F14K50, que es de aproximadamente 1.892 HZ, usando PR2 = 255 (máx.), FOSC es igual a 31 kHz (cambiado de 16 MHz) y prescaler de TIMER2 = 16:
PWM FREQUENCY = (PR2 + 1) * 4 * TOSC * prescaler
Por lo tanto, mi pregunta reside en una forma de lograr ese 1HZ para la frecuencia PWM con un ciclo de trabajo del 70%.
Notas: No se pueden usar retrasos (función) y no se puede cambiar el hardware (PIC), por lo que la única opción es a través del Software.
Bellow es el código utilizado para alcanzar una frecuencia de 1.892HZ:
//Variables
int DC; // Duty cycle
//
OSCCON=0; // 31kHZ
// Configure PWM Module 1.892 HZ
OpenTimer2(T2_PS_1_16); // Prescaler 16
OpenPWM1(0xFF); //Configure PWM module and initialize 1 HZ ; PR2 =255
SetDCPWM1(0); // set duty cyle
SetOutputPWM1(SINGLE_OUT, PWM_MODE_1);
void LED(void) {
DC=70; // 70%
SetDCPWM1((int) DC * 10.23); //set the duty cycle 70% in 10bits//
}
EDITAR: Tratando de seguir los comentarios de todos ustedes, probé esto con TIMER0 y ahora con FOSC = 16MHZ:
void highISR(void) {
// Check if there was an overflow in TIMER0
if (INTCONbits.TMR0IF == 1) {
LATCbits.LATC5=1; // LED ON
INTCONbits.TMR0IF = 0;
WriteTimer0(Ktimer);
}
}
#pragma code HighInterruptVector=0x0008
void HighInterruptVector(void) {
_asm
goto highISR
_endasm
}
#pragma code
// CONFIG TIMER0
OpenTimer0(TIMER_INT_ON & // Use interruptions
T0_16BIT & // 16 bit timer
T0_SOURCE_INT & // Use internal clock as source
T0_EDGE_FALL & // Update on falling edge
T0_PS_1_128); // 128 prescaler (lowest period possible)
// FOSC = 16 MHz ==> FTY = 16/4 = 4MHz ==> -------TCY = 250 ns
// Timer 0 prescaler = 128 ==> Count on every--------- 250 ns * 128 = 32 us
// 1 seg counting = --------1s / 32u = 31250
//31250*0,7 =21875 70% DC
Ktimer = 65536 - (21875);
//WriteTimer0(Ktimer);
// So the flag occurs
While(1){
WriteTimer0(Ktimer)
LATCbits.LATC5=0; // LED OFF
}
Pero el led no se enciende. 100% seguro de que la falla está en cómo se construye el código.