Hola soy algo nuevo por acá pero he hecho algunas cositas con el dspic30f4013 en la U hace un año largo en 2007 realicé un variador de velocidad de un motor monofásico con PWM-Simple para la materia de microcontroladores lo programé en assembler fue mi primer incursión en el mundo de los uC.
El año pasado a principios de año empecé a estudiar los microcontroladores desde C, y opte por el CCS C, con los PIC es una maravilla, pero cuando decidí hacer mi proyecto para la materia de Electrónica de potencia
(un variador de velocidad de un motor monofásico con SPWM(Sinusoidal PWM)), descubrí las debilidades del compilador.
Como yo ya estaba muy relacionado con el micro decidí crearme una librería con las direcciones de RAM de todo el micro con #word y #bit, pues nunca me a gustado el cuento del compilador para el acceso a los registros como set_tris,output... esos prefiero hacerlo como si fuese un programa mas a lo ANSI-C, y acceder a los registros que ya conocía directamente, encontré cuando eso no se si en este u otro foro una librería que estaba incompleta pero adelantada, de hay partí (aun la conservo si la necesitan), pero cuando los empecé a tratar de la misma manera los registros de configuración de los módulos en especial el de PWM, con las mismas configuraciones que hice en assembler, el compilador no respondía adecuadamente, el micro realizaba cosas que para mi me parecían extrañas, en fin termine realizando mi proyecto con las funciones del compilador CCS-C y como no tenia una buena versión del C30 me toco resignarme a esto.
Yo le recomiendo que le eche un vistazo al .h del micro pues todas las funciones del compilador no son aplicables para los dspic, y no se aplican de la misma manera, por ejemplo no están completamente implantados algunos módulos del micro como los TIMERS ejemplo: la interrupción por TIMER4 y 5 no aparecen en la tabla de definición de interrupciones entre muchas otras cosas que no recuerdo justo ahora.
Tomado de "30f4013.h"
#define INT_OSCFAIL 1
#define INT_ADDRERR 2
#define INT_STACKERR 3
#define INT_MATHERR 4
#define INT_DMAERR 5
#define INT_EXT0 6
#define INT_IC1 7
#define INT_OC1 8
#define INT_TIMER1 9
#define INT_IC2 10
#define INT_OC2 11
#define INT_TIMER2 12
#define INT_TIMER3 13
#define INT_SPI1 14
#define INT_RDA 15
#define INT_TBE 16
#define INT_ADC1 17
#define INT_EEPROM 18
#define INT_SI2C 19
#define INT_MI2C 20
#define INT_CN1 21
#define INT_IC7 22
#define INT_IC8 23
#define INT_OC3 24
#define INT_OC4 25
#define INT_EXT2 28
#define INT_RDA2 29
#define INT_TBE2 30
#define INT_DCI 46
#define INT_LOWVOLT 47
En cuanto al hecho de como utilizar el PWM en el programa que tengo la sección de configuración la hice así:
DISABLE_INTERRUPTS(INTR_GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER3);
INTERRUPT_ACTIVE(INT_TIMER3);
ENABLE_INTERRUPTS(INTR_GLOBAL);
SETUP_TIMER3(TMR_INTERNAL|TMR_DIV_BY_64);
SET_COMPARE_TIME(1,OCR_1, OCRS_1);
SETUP_COMPARE(1,COMPARE_SINGLE_PULSE | COMPARE_TIMER2);
SETUP_TIMER2(TMR_INTERNAL|TMR_DIV_BY_1,PR_2);
Con los valores de OCR_1 y OCRS_1 se le da el inicio y fin del pulso al PWM el ancho y la posición si se necesita, el PR del timer configura la frecuencia, no recuerdo si la interrupción era necesaria pero si recuerdo que para cambiar el duty es necesario parar el modulo creo que en el datasheet habla algo de eso
se hace con:
SETUP_COMPARE(1,COMPARE_OFF );
ahh a todas el pin de salida es el correspondiente al Output Compare,
Bueno esos es lo que me acuerdo ahora, espero que les sea útil mi experiencia en esto y como hace poco participo activamente en el foro espero hacerlo con mas frecuencia, que bueno que exista una comunidad como esta, Gracias