TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: J1M en 27 de Diciembre de 2008, 15:47:19

Título: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 27 de Diciembre de 2008, 15:47:19
Buenas a todos! Estoy recopilando info para intentar hacer un cacharrito, creo que lo tengo todo excepto una pequeña gran parte. Necesito generar 3 salidas en cuadratura, es decir, serían 6 pines del micro. He pensado, no se si muy acertadamente, que podría generar estas 3 señales mediante los generadores PWM de un DsPIC, en concreto el 30F4012. Su controlador para motores tiene estas características:

Motor Control PWM Module Features:
• 6 PWM output channels:
- Complementary or Independent Output
modes
- Edge and Center-Aligned modes
• 3 duty cycle generators
• Dedicated time base
• Programmable output polarity
• Dead-time control for Complementary mode
• Manual output control
• Trigger for A/D conversions

Tiene 3 generadores de PWM, con los que puede hacer dos cosas:
- Generar 6 salidas de las cuales 3 estarían desfasadas 180º.
- Generar 6 salidas independientes.

Lo que ando queriendo hacer sería:
- Generar 6 salidas de las cuales 3 estarían desfasadas 90º

Sabéis si podría hacer esto con este DsPIC amparandome en el supuesto de que las 6 salidas generadas independientes sean desfasables un cierto ángulo?

un saludo y gracias!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 27 de Diciembre de 2008, 16:15:14
Me gusta tu consulta .. ya que ultimamente me he estado dedicando a hacer aplicaciones raras explotando el hardware del micro...

El problema del modulo PWM es que todas las salidas utilizan un solo timer ... es decir, si varias la frecuencia de una salida variará la frecuencia del resto  ... el desfase de 180º se realiza con un inversor ...

Mi pregunta es .. si la frecuencia de cada salida debe ser distinta?

Buscaré como se podria hacer eso!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 27 de Diciembre de 2008, 16:41:09
Creo que lo mejor es usar un timer y dos salidas OC ...

Ahora para hacer 3 salidas independientes .. ocuparias ... 3 timers y 6 salidas OC si no me equivoco...

Pones el timer en modo TIMER .. para tener una base de tiempo .. esto seria como una funcion rampa.

Luego los OC los pones en modo "continuos pulse" .. claro cada par debe utilizar el mismo timer.


Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 28 de Diciembre de 2008, 17:45:50
Gracias por la respuesta blackcat!

En principio la frecuencia es la misma ( tengo aún que ratificarlo con el osciloscopio ) por lo que un mismo timer me serviría. Después pienso será cuestión de jugar un poco con las funciones nuevas, setup_compare y set_compare_time y volverse un poco más loco... como siempre! jejeje

La verdad la filosofía del DsPIC y CCS cambia un poquito y me anda dando un poco el follón, en este momento estoy 'discutiendo' con el módulo PWM... que no hay forma de ponerlo a oscilar a 500Hz y un cristal de 4MHz!!! con lo fácil que estaba antes jooo!

Un gran saludo y gracias!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 28 de Diciembre de 2008, 18:43:52
El PWM lo configuro asi en C30:

Código: C
  1. // PWM
  2. P2TCON = 0x0000;
  3. P2TPERbits.PTPER = 4000;      // Periodo
  4. PWM2CON1bits.PEN1H = 0;       // PWM2H desactivado
  5. PWM2CON1bits.PEN1L = 1;       // PWM2L activado
  6. P2DC1 = 4000;      // Ciclo de trabajo 50%
  7.  
  8. P2TCONbits.PTEN = 1;      // Empezar...


La frecuenicia es facil ... por el momento el prescaler es 1:1 y el micro está a 40MIPS ... eso quiere decir que el PWM cuenta un paso cada 250ns que es el inverso de 40e6 ...

Si fuera el prescaler  diferente de 1:1 el periodo seria 250ns x el valor del prescaler x PTPER .... entonces mi periodo es 250ns x 1 x 4000 = 1ms o 1kHz ...

El ciclo de trabajo lo ajusto con P2D1 ... como es 16 bits el 50% lo consigo con 4000 .. el 100% con 8000, el 25% con 2000 ... etc etc ...

Para lograr 500Hz a 40MIPS seria PTPER = 8000


Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 28 de Diciembre de 2008, 20:46:19
Gracias blackcat, mañana pruebo esta config con las funciones de CCS y a nivel de bit a ver que lexe está pasando que no funciona la cosa como debe.

Un gran saludo!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 03 de Enero de 2009, 23:57:01
Que frustración!!! no entiendo que sucede....... creo que la culpa la tiene el PCWHD... pero es que ya no se que pensar...

Este es mi código:

#include <30f4012.h>
#fuses PR,XT,NOWDT
#use delay(crystal=4mhz)

void main(void)
{
   setup_motor_pwm(1,MPWM_FREE_RUN | MPWM_SYNC_OVERRIDES, 10000);
   //set_motor_pwm_unit(1,MPWM_ENABLE);
   //setup_motor_pmw_duty(1,0,0x55);
   //set_motor_pmw_event(pwm,time);
   //set_power_pwm0_duty(8000); //16383
   
   while(true);
}


Simplemente trato de hacer funcionar los PWM que tiene ese DsPIC, la forma de hacerlo parece ser que es mediante el uso de las funciones de motores, pero ninguna de las que están comentadas las reconoce el compilador.......................!!!! y sin embargo debería hacerlo! Alguna idea?? pq yo ya me he quedado sin ellas :(

un saludo y gracias
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 04 de Enero de 2009, 02:26:01
Hola!

Por que no usas MPLAB C30? ... Nunca he usado CCS y no tengo referencia para decir cual es mas sencillo CCS o C30 ... sospecho (por comentarios de otros) .. CCS es mas facil por las funciones de hardware; sin embargo, configurar el hardware en C30 es muy sencillo ... yo con mucho gusto te puedo ayudar.

Dime alguna aplicacion y yo te pongo algun ejemplo funcional.

Saludos!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: Nocturno en 04 de Enero de 2009, 04:46:35
Yo también hice alguna incursión en CCS para dsPIC y tuve que dejarlo porque aún tenía muchos errores, Jaime. En mi caso no conseguí que las interrupciones de los timers saltaran cuando debían hacerlo, y en C30 lo hice sin problemas.
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: josnelihurt en 04 de Enero de 2009, 05:56:58
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"
Código: CSS
  1. #define INT_OSCFAIL               1
  2. #define INT_ADDRERR               2
  3. #define INT_STACKERR              3
  4. #define INT_MATHERR               4
  5. #define INT_DMAERR                5
  6. #define INT_EXT0                  6
  7. #define INT_IC1                   7
  8. #define INT_OC1                   8
  9. #define INT_TIMER1                9
  10. #define INT_IC2                   10
  11. #define INT_OC2                   11
  12. #define INT_TIMER2                12
  13. #define INT_TIMER3                13
  14. #define INT_SPI1                  14
  15. #define INT_RDA                   15
  16. #define INT_TBE                   16
  17. #define INT_ADC1                  17
  18. #define INT_EEPROM                18
  19. #define INT_SI2C                  19
  20. #define INT_MI2C                  20
  21. #define INT_CN1                   21
  22. #define INT_IC7                   22
  23. #define INT_IC8                   23
  24. #define INT_OC3                   24
  25. #define INT_OC4                   25
  26. #define INT_EXT2                  28
  27. #define INT_RDA2                  29
  28. #define INT_TBE2                  30
  29. #define INT_DCI                   46
  30. #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í:
Código: CSS
  1. DISABLE_INTERRUPTS(INTR_GLOBAL);
  2.    ENABLE_INTERRUPTS(INT_TIMER3);
  3.    INTERRUPT_ACTIVE(INT_TIMER3);
  4.    ENABLE_INTERRUPTS(INTR_GLOBAL);
  5.    
  6.    SETUP_TIMER3(TMR_INTERNAL|TMR_DIV_BY_64);
  7.    SET_COMPARE_TIME(1,OCR_1, OCRS_1);
  8.    SETUP_COMPARE(1,COMPARE_SINGLE_PULSE | COMPARE_TIMER2);
  9.    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:
Código: CSS
  1. 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
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 04 de Enero de 2009, 10:26:52
Gracias a los tres por las respuestas.

blackcat la verdad lo de C30 lo ando pensando pero sigo encabezonado en tratar de hacerlo andar con CCS, sino encuentro solución posiblemente tenga que probar con otro compilador....

Manolo si me da a mi que va a ser eso... otro problema más de CCS! pq como digo en el .h aparece y después no deja compilarla...a no ser que haga falta poner alguna directiva de compilación... pero como el manual de PCD es taaaaan malo y tampoco hay ejemplo alguno puess a darle al dolor de cabeza!

josnelihurt muchas gracias por el código, pero creo ese es para generar el PWM con el pin Compare, la cosa esq ando tratando de hacerlo con los pines de PWM para el control de motores.


un saludo y gracias!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: josnelihurt en 04 de Enero de 2009, 17:13:03
Hola, me a interesado bastante el tema resulta que yo tenia la versión 4.057 en esta, en los .h no me aparecian ninguna de las funciones

setup_motor_pwm();
set_motor_pwm_unit();
setup_motor_pmw_duty();
set_motor_pmw_event();
set_power_pwm0_duty()

Por eso decidí descargar una nueva versión la 4.084, y observe que aparecen las siguientes funciones:

setup_motor_pwm(), set_motor_pwm_unit(),
set_motor_pwm_duty(), set_motor_pwm_event(),
get_motor_pwm_count()

Aunque aun no entiendo algunas cosas del manual como por que llaman a una funcion con un nombre y la implementan cono por ejemplo
setup_motor_unit>>> según PCD C Compiler Reference Manual April 2008, pag 258
set_motor_unit    >>> la que se deja compilar
bueno después de algún rato mirando y cacharreando logre esto:
(http://img99.imageshack.us/img99/9949/pwmokxv2.jpg)

codigo:
Código: CSS
  1. #include <30f4012.h>
  2. #fuses PR,XT,NOWDT
  3. #use delay(clock=4mhz,xtal)
  4.  
  5. void main(void)
  6. {
  7.    setup_motor_pwm(1,MPWM_FREE_RUN | MPWM_SYNC_OVERRIDES, 10000);
  8.    set_motor_unit( 1,MPWM_ENABLE , MPWM_FORCE_L_1,MPWM_FAULT_NO_CHANGE,0);
  9.    set_motor_pwm_duty(1,0,0x55);
  10.    set_motor_pwm_event(1,1000);
  11.    while(true);
  12. }
con esta versión:
(http://img171.imageshack.us/img171/8382/ccsversionad5.jpg)

no se si algo así era lo que necesitaba, espero ser de ayuda hablamos
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 04 de Enero de 2009, 18:14:20
Gracias mil compañero. Parece que la cosa compila, aunque aún parece sigue sin funcionar, con esos tiempos creo que debería ver parpadear un LED en RE0 pero va a ser que no :S ... andaba ahora dandome golpes con el C30, pero ahora que esto vuelve a compilar voy a intentar afinar esto entonces...

un saludo!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 07 de Enero de 2009, 11:47:32
Qué sudor, qué frustración, cuantisimo desánimo se cierne sobre mí! Estos chicos de CCS me sacan de vez en cuando unos días de vida...

Hasta ahora lo único que funciona es un código similar al que puso el amigo Jon ( no estoy contemplando cuadratura, sino tan solo un 'sencillo' PWM )

Código: [Seleccionar]
#include <30f4012.h>
#fuses XT_PLL16,NOWDT,NOPUT,NOBROWNOUT
#use delay(clock=64mhz)

void main(void)
{
   setup_compare(1, COMPARE_PWM | COMPARE_TIMER2);
   setup_timer2(TMR_INTERNAL | TMR_DIV_BY_64,499);
   set_pwm_duty(1, 250); // Duty 50%
   
   while(true);
}

Ahora, la cosa cambia cuando intentamos pelearnos con el módulo de los motores y no el comparador...

Código: [Seleccionar]
#include <30f4012.h>
#fuses XT_PLL16,NOWDT,NOPUT,NOBROWNOUT
#use delay(clock=64mhz)

void main(void)
{
setup_motor_pwm(1,MPWM_FREE_RUN | MPWM_SYNC_OVERRIDES, 31999);
set_motor_pwm_duty(1,0,10);
set_motor_unit(1,MPWM_ENABLE,MPWM_FORCE_L_1,MPWM_FAULT_NO_CHANGE,0);

while(true);
}


Es el mismo que el aportado por Jon aunque supuestamente modificado para un PWM de 500Hz y digo supuestamente ya que no logo entendre completamente el datasheet del dspic y el manual del PCD tampoco da pistas, más bien lo contrario... Me he puesto en contacto con CCS para informarle del bug Setup-->Set, esperemos sepan algo más que yo del pq!

un saludo y en nada a C30...
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: josnelihurt en 07 de Enero de 2009, 12:43:57
Hola como dije antes, me parece muy interesante el tema estoy atento a nueva información aunque no tengo un dspic con el modulo de motores para probar y como el proteus se adelanto con los 33f y los 30 pufff se los salto, le doy animo y en lo que necesite, además cuando encuentre solución o le respondan los de CCS me gustaría saber muchas gracias por compartir el conocimiento.
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 07 de Enero de 2009, 13:04:40
Si quieres te puedo hacer el programa en C30 y te explico en detalle el programa ... En cuanto aprender C30 no es dificil, si CCS es mas facil que C30, no me imagino que tan facil será CCS pues C30 es muy facil .. el problema es la configuración de hardware ... el detalle está en los manuales de referencia, ahi se explica todo el funcionamiento del hardware y con alguno ejemplos, eso si, tenes que entender como funciona el hardware y tener en cuenta cada bit de los registros. Aveces no hace falta conocer a fondo, con las pruebas se aprende.

Te dejo el link de los manuales de referencia de cada periférico:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&
nodeId=2574 (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2574)

Como te mostré antes, esta pequeña sección de programa configura el PWM en C30:

Código: C
  1. // PWM
  2. P2TCON = 0x0000;
  3. P2TPERbits.PTPER = 4000;      // Periodo
  4. PWM2CON1bits.PEN1H = 0;       // PWM2H desactivado
  5. PWM2CON1bits.PEN1L = 1;       // PWM2L activado
  6. P2DC1 = 4000;      // Ciclo de trabajo 50%
  7. P2TCONbits.PTEN = 1;      // Empezar...

Para mí, el Motor Control PWM es el periférico mas dificil de configurar pues trae muchas opciones mas que cualquier otro periferico (el I2C tambien es dificil). Es por esa razón que seguro los de CCS se están complicando en el compilador.
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 07 de Enero de 2009, 13:09:26
Gracias por el apoyo Jos, ahora mismo ando mirando el compilador MicroC que parece incluye unas funciones perfectas para hacer uso del MotorPWM... iré poniendo alguna cosilla conforme vaya dandole forma.

Gracias blackcat, estuve mirando algun código para C30 y el tema de los motores y parece que algo hay. Sino es mucha molestia me conformaría tan solo con lo que sería el equivalente a esas 3 funciones en CCS, es decir, configurar el módulo para poner a funcionar un PWM a 500Hz con 50% de duty que es lo que más me está costando, creo que estoy demasiado mal acostumbrado a la filosofía del CCS y que haya funciones para todo...

un saludo y gracias nuevamente a los dos
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 07 de Enero de 2009, 13:13:08
Acabo de ver que has editado el post! :p voy a ver si me peleo con esa configuración... y con la formulita del periodo y del ciclo de trabajo.

un saludo! :)
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 07 de Enero de 2009, 13:45:10
De cuanto es el cristal??

Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 07 de Enero de 2009, 14:02:23
4MHz le había puesto PLL 16x

un saludo!
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: blackcat en 07 de Enero de 2009, 16:55:47
Hola!

Ahi está el ejemplo; solo está configurado el PWM1 y en modo complementario. Este sale por los pines RE0 y RE1.

Te adjunto la carpeta del proyecto, este incluye: El proyecto, el archivo en c y el HEX para ver si funciona.

Saludos y suerte!

Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: J1M en 07 de Enero de 2009, 19:55:30
joe blackcat un millon de gracias!! Me pillas con fiebre y no tengo la entrenadora delante, en cuanto lo pruebe te digo algo. Miles de gracias de corazón! :)
Título: Re: 3 Salidas en Cuadratura ( 6 pines )
Publicado por: ieeeaz en 02 de Diciembre de 2011, 20:15:07
Hola, compre un dspic30f4011,para implementar el control de un motor ac trifasico,este dspic cuenta con 3 modulos pwm con sus respectivas salidadas complementarias,llevo dos dias intentando hacer funcionar este modulo con el compilador ccs version 4.120, con instrucciones como setup_motor_pwm() y set_motor_pwm_duty(), pero definitivamente no se que pasa con el,no hace absolutamente nada, nose si alguien ha logrado hacer funcionar este modulo con este compilador para que me pueda ayudar y sacarme de este problema
muchas gracias