Quiero hacer un PWM con un dsPIC30F4012 de 100KHz, y poder variar el ciclo de 0 a 100% con un minimo de 1024 pasos.
Estoy usando este codigo muy similar al ejemplo de Nocturno:
#define __dsPIC30F4012__
#include <p30f4012.h>
#include <pwm.h>
_FOSC( CSW_FSCM_OFF & FRC_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & PWRT_OFF & MCLR_DIS);
#define MIPS 29200
/********************************************************/
void DelayUs(unsigned int v) { // pierde 8+2
/********************************************************/
while(v != 0){
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
v--;
}
}
/******************************************************/
void DelayMs(unsigned int v) {
/******************************************************/
while (v != 0 ){ DelayUs(1000); v--;}
}
int main(void){
TRISE=0;TRISB=0;
unsigned int sptime, config1, config2, config3, PeriodoPWM, duty;
while(1){
PeriodoPWM = (long) MIPS * 1000 / 100000;
sptime = 0;
config1 = (PWM_EN & PWM_OP_SCALE1 & PWM_IPCLK_SCALE1 & PWM_MOD_FREE);
config2 = (PWM_MOD1_IND & PWM_PDIS3H & PWM_PDIS2H & PWM_PDIS1H &
PWM_PDIS3L & PWM_PDIS2L & PWM_PEN1L);
config3 = (PWM_SEVOPS1 & PWM_OSYNC_PWM & PWM_UEN);
OpenMCPWM(PeriodoPWM,sptime,config1,config2,config3);
duty=222;
SetDCMCPWM(1,duty,0);
DelayMs(2);
}
return 0;
Los 100KHz de la señal los tengo, pero el ciclo de trabajo cuando pongo en la variable duty un valor aproximado de 550, el porcentaje del ciclo esta proximo al 100%.
Segun entiendo en el dataseet del dsPIC, el ciclo de trabajo se ajusta con el valor del registro PDC1 (para el modulo1) que tiene un tamaño de 16bit. Segun entiendo yo el 100% del ciclo seria con el valor 65535.
Un saludo.