He abordado el siguiente proyecto proteus proffessional:
Laideaesqueelinterruptorgiratoriocontrolelavelocidaddelos2ventiladoresdeCC,laopciónaltadacomoresultadounciclodetrabajodel100%,Med75%yBajaesdel50%.EltutorialqueseguíparaconfigurarelmóduloPWMdelPIC16F877AproporcionaestaimagentomadadelmanualdelICsobrecómofuncionabásicamenteelmodoPWMdelaMCU:
GeneracióndeseñalPWM:unavezqueseconfiguraelPWMysehabilitaelTimer2,TMR2comienzaaincrementarsesegúnelvalorprescalar.UnavezqueelvalordeTMR2seaigualadutyCycle(CCPR1L+CCP1CON<5:4>),elpinPWMsetiraráhaciaBAJO.EltemporizadorcontinúaaumentandohastaquecoincideconelperíodoPR2.DespuésdelocualelpinPWMsejalaráALTOyTMR2serestableceráparaelpróximociclo.
Fuente
Y así escribí un código en mikroC donde configuro ambos módulos CCP ya que necesito una señal PWM para controlar la velocidad de dos ventiladores. Aquí está el fragmento de código que se supone debe configurar el modo PWM de estos registros CCP:
TRISC.RC1 = 0;
TRISC.RC2 = 0;
CCP1CON = 0x0F; // Select the PWM mode.
CCP2CON = 0x0F;
TMR2ON = 1;
PR2 = 100; // Set the Cycle time to 100 for varying the duty cycle from 0-100
CCPR1L = 0; // By default set the dutyCycle to 0
CCPR2L = 0;
Cuando ejecuto la simulación funciona en proteus. Cuando intento cargarlo en la MCU con mi kit de selección 3, no obtengo una señal PWM en PORTC1-2. He comprobado que el interruptor está funcionando con un multímetro y he probado el cristal y descubrí que está oscilando. El mecanismo de conmutación no parece tener un efecto notable en las señales en el PORTC1-2, aparte de una posible falla cuando cambia la posición del interruptor.
Aquí hay una captura de pantalla de cómo se ve la señal donde se supone que debo obtener una onda PWM (PORTC1).
PORTC2 tiene el mismo aspecto. Como dije, he monitoreado el mecanismo de conmutación, he sondeado el cristal y los puertos PWM. No puedo pensar por qué esto no funcionará cuando lo hace en simulación. Tal vez alguien podría ayudarme a depurar esto. El resto del código C se muestra aquí:
int solenoid_state = 0;
void main()
{
//TRISB = 0x0F; // Configure PORTB
TRISB.RB0 = 1;
TRISB.RB1 = 1;
TRISB.RB2 = 1;
TRISB.RB3 = 1;
TRISD.RD0 = 0;
TRISD.RD1 = 0;
TRISC.RC1 = 0;
TRISC.RC2 = 0;
CCP1CON = 0x0F; // Select the PWM mode.
CCP2CON = 0x0F;
TMR2ON = 1;
PR2 = 100; // Set the Cycle time to 100 for varying the duty
cycle from 0-100
CCPR1L = 0; // By default set the dutyCycle to 0
CCPR2L = 0;
//solenoid_state = 0;
while(1){
if(RB0_bit == 0) // Off state
{
delay_ms(300);
if(RB0_bit == 0)
{
CCPR1L = 0;
CCPR2L = 0;
RD0_bit = 0;
RD1_bit = 0;
}
while(RB0_bit == 0) //Do nothing until switch status changes
{
}
}
else
{
solenoid_state = 1;
//RD0_bit = 1;
//RD1_bit = 1;
}
while(solenoid_state == 1)
{
if(RB1_bit == 0) // Low state
{
delay_ms(300);
if(RB1_bit == 0)
{
CCPR1L = 50;
CCPR2L = 50;
}
while(RB1_bit == 0) //Do nothing until switch status changes
{
}
}
else if(RB2_bit == 0) // Med state
{
delay_ms(300);
if(RB2_bit == 0)
{
CCPR1L = 75;
CCPR2L = 75;
}
while(RB2_bit == 0) //Do nothing until switch status changes
{
}
}
else if(RB3_bit == 0) // High state
{
delay_ms(300);
if(RB3_bit == 0)
{
CCPR1L = 100;
CCPR2L = 100;
}
while(RB2_bit == 0) //Do nothing until switch status changes
{
}
}
else
{
//RD0_bit = 0;
//RD1_bit = 0;
solenoid_state = 0;
}
}
}
}
Cualquier consejo / sugerencia apreciada,
Simon.