Autor Tema: 3 Salidas en Cuadratura ( 6 pines )  (Leído 12801 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
3 Salidas en Cuadratura ( 6 pines )
« 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!

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #1 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!
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #2 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.


« Última modificación: 27 de Diciembre de 2008, 16:58:14 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #3 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!

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #4 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


« Última modificación: 28 de Diciembre de 2008, 18:45:54 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #5 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!

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #6 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

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #7 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!
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #8 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.

Desconectado josnelihurt

  • PIC12
  • **
  • Mensajes: 64
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #9 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
JoN

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #10 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!

Desconectado josnelihurt

  • PIC12
  • **
  • Mensajes: 64
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #11 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:


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:


no se si algo así era lo que necesitaba, espero ser de ayuda hablamos
JoN

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #12 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!

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #13 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...

Desconectado josnelihurt

  • PIC12
  • **
  • Mensajes: 64
Re: 3 Salidas en Cuadratura ( 6 pines )
« Respuesta #14 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.
JoN