TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: franco en 30 de Octubre de 2006, 18:56:16
-
quiero experimentar con los puertos PWM del dspic si alguien tiene un programa sencillo de entrenamiento que me sirva como base para comprender un poco el funcionamiento del PWM . 8)
-
Puedes pasarte por la paguina de nocturno, Motores musicales (http://www.micropic.es/index.php?option=com_content&task=view&id=3&Itemid=57)
en la seccion de descargas encuentras "Motores musicales", donde viene un programita que te puede ayudar.
saludos :)
Editado por Nocturno: link actualizado
-
ok gracias vamos aver
-
no tenes por hay un codigo simple para el pwm es que este link no funciona correo jalejob53@hotmail.com
-
Hola:
Estoy empezando autilizar el PWM en un DSPIC, lo quiero hechar a andar en modo de subida/bajada, de tal manera que pueda controlar el ciclo de trabajo por medio de un potenciometro a travéz del ADC, sin embargo aun no me queda muy claro como funciona el PWM, alguien sabe de un buen documento que explique claramente el funcionamiento del mismo?
gracias
-
El mejor documento es la propia datasheet. Si quieres algún ejemplo de uso, puedes mirar Motores musicales (http://www.micropic.es/index.php?option=com_content&task=view&id=3&Itemid=39)
-
Diay solo la hoja de datos ... aunque es mejor el manual de referencia que es mas detallado ... la hoja de datos es un resumen del manual de referencia ... de igual manera se puede bajar de microchip!! ...
-
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.
-
No, micro_pepe, para que el duty esté al 100%, debe ser igual al periodo del PWM (en el ejemplo es 292).
-
Entonces como maximo solo puedo tener 292 pasos ?
Un saludo.
-
Os comento lo que he echo, en el codigo que adjunto (pongo solo el main el resto no lo he tocado), en un principio puse el limite de la variable a 292, con eso llegaba al 50% del ciclo; entonces puse el doble 584 y llega hasta el 100%.
Me parece un poco raro por lo que he leido, pero no creo que mi osciloscopio me engañe.
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=0;
DelayMs(500);
for(duty==0;duty!=584;duty++){
SetDCMCPWM(1,duty,0);
DelayMs(200);
}
}
return 0;
}
Un saludo.
-
hola, Asi es, debes poner el dobre del valor del periodo para obtener 100%, y asi se escalan todos los porcentajes. A medida que aumenta tu frecuencia de PWM baja la resolución que puedas lograr.
saludos