Estoy intentando generar un PWM utilizando CCP y cambiar su frecuencia sobre la marcha, pasando de 1.15 KHz a 3.28 kHz en 180 ms.
Estoy usando:
PIC : 16F887
Frecuencia : 4MHz (interno)
Compilador : CCS PCM C Compiler, Versión 5.008
Mi problema es : mi código genera el PWM y va de 1.15 KHz a 3.28 kHz (50% de servicio) en 180 ms como deseo activar, pero también genera "agujeros", Brechas, donde nada pasa por un tiempo.
Estas brechas van de 3,7 ms a 4,07 ms, como lo muestra esta imagen que podría obtener de mi osciloscopio:
Estoyhaciendoestousandoelsiguientecódigo:
main.h
#include<16F887.h>#deviceadc=8#FUSESNOWDT//NoWatchDogTimer#FUSESHS//HighspeedOsc(>4mhzforPCM/PCH)(>10mhzforPCD)#FUSESNOPUT//NoPowerUpTimer#FUSESNOMCLR//MasterClearpinusedforI/O#FUSESNOPROTECT//Codenotprotectedfromreading#FUSESNOCPD//NoEEprotection#FUSESNOBROWNOUT//Nobrownoutreset#FUSESIESO//InternalExternalSwitchOvermodeenabled#FUSESFCMEN//Fail-safeclockmonitorenabled#FUSESNOLVP//Nolowvoltageprgming,B3(PIC16)orB5(PIC18)usedforI/O#FUSESNODEBUG//NoDebugmodeforICD#FUSESNOWRT//Programmemorynotwriteprotected#FUSESBORV40//Brownoutresetat4.0V#FUSESRESERVED//UsedtosetthereservedFUSEbits#usedelay(clock=4000000)
main.c
/*Effectvars*/shortSTATE=1;intPR_VALUE=33;shortCHANGED=0;int16counter=0;#int_RDAvoidRDA_isr(void){//TO-DO}/*Runsevery256us*/#int_RTCCvoidRTCC_isr(void){counter++;}/*Performsastepevery20x256us=5.12msGoesfrom53(1.15KHz)to18(3.28Khz)*/voidEFFECT(){if(counter>=20){CHANGED=1;if(STATE){PR_VALUE++;if(PR_VALUE>=53)STATE=0;}else{PR_VALUE--;if(PR_VALUE<=18)STATE=1;}counter=0;}if(CHANGED){CHANGED=0;setup_timer_2(T2_DIV_BY_16,PR_VALUE,1);set_pwm1_duty(PR_VALUE/2);set_pwm2_duty(PR_VALUE/2);}}voidmain(){setup_comparator(NC_NC_NC_NC);setup_adc_ports(NO_ANALOGS|VSS_VDD);setup_adc(ADC_CLOCK_DIV_2);setup_spi(SPI_SS_DISABLED);setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_timer_1(T1_DISABLED);setup_oscillator(OSC_4MHZ);enable_interrupts(INT_RTCC);enable_interrupts(INT_RDA);enable_interrupts(GLOBAL);setup_ccp1(CCP_PWM_L_H);setup_ccp2(CCP_PWM_H_L);while(1){EFFECT();}}
Cosasquehehechoalintentarsolucionaresteproblema:
- Seeliminóelcontador,seagregóunbotóndepresiónyporcadapresiónqueincrementéelvalordePR,paséde181.15KHza3.28KHzsinqueaparecieranestos"agujeros"
- Conectó un generador de frecuencia de onda cuadrada a la entrada donde estaba el botón pulsador y notó que al cambiar el PR, más "agujeros" aparecían,
¿Alguna idea de cómo puedo eliminar estos errores extraños?