Autor Tema: PWM a bajas frecuencias y USB  (Leído 4457 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado fedekb24

  • PIC10
  • *
  • Mensajes: 3
PWM a bajas frecuencias y USB
« en: 09 de Agosto de 2010, 20:30:09 »

Hola a todos,
                   estoy utilizando un PIC18F4550  e implementé una comunicación USB cdc, la cual logré hacer funcionar gracias a la guía que RedPic provee en su página. Para ello utilicé un cristal de 20 Mhz, con el cual mediante los #fuses HSPLL y PLL5 obtuve los 48 Mhz necesarios para el USB.

                     Por otro lado pretendo generar, por medio de un módulo CCP en modo PWM, una señal de entre 20 y 70 Hz. Haciendo los cálculos para configurar el Timer2 y el CCP me encontré que la frecuencia a la que está trabajando el CPU es muy elevada y no puedo lograr el periodo de 50 mseg (1/20) máximo que necesito. Investigando la hoja de datos y el foro he visto que el USB puede trabajar en modo asíncrono usando el oscilador primario, mientras el núcleo del micro y otros periféricos utilizan un clock secundario de menor velocidad.

                    Debido a las bajas frecuencias que necesito generar, supuse que necesitaría configurar el oscilador interno. Mi inconveniente surge en que no sé bien qué fuses utilizar (estoy usando CCS). Supongo que es algo así lo que debería hacer

Código: [Seleccionar]
#fuses HSPLL,INTHS,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=125000)

setup oscillator(OSC_125KHZ);
void main () {}

 Momentáneamente no tengo la posibilidad de probarlo para saber si estoy en lo cierto. Así que cualquier corrección o sugerencia sería una gran ayuda :). Desde ya gracias por su tiempo y aportes, ya que me la paso leyendo el foro je. Un abrazo   

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PWM a bajas frecuencias y USB
« Respuesta #1 en: 09 de Agosto de 2010, 22:40:39 »
Hola. Vagamente recuerdo que para dejar el USB a 48MHz y correr el CPU a menos se debe usar el fuse CPUDIVx. Ten cuidado porque los fuses están mal descritos en CCS. Creo que un CPUDIV3 no era entre 3, sino entre 6, algo así.

Verifícalo en la hoja de características porque CCS tiene fallas en esa sección con ese pic.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: PWM a bajas frecuencias y USB
« Respuesta #2 en: 10 de Agosto de 2010, 00:09:00 »
mirá lo que me vengo a enterar,  :shock: eso me pasa por no leer el datasheet completo  :oops:
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: PWM a bajas frecuencias y USB
« Respuesta #3 en: 10 de Agosto de 2010, 00:37:42 »
por lo que pude ver, a lo que te refieres Santiago es que usando el CPUDIV1:CPUDIV0 en 4 suponiendo un crsital de 20Mhz se tendria un reloj de 5Mhz para funcionamiento del micro y se mantendrían los 48Mhz para el USB si se ha configurado el PLLDIV en 5.

Por hoy ya es demasiado, mañana segire con este tema a ver si veo mas luz.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PWM a bajas frecuencias y USB
« Respuesta #4 en: 10 de Agosto de 2010, 01:31:15 »
por lo que pude ver, a lo que te refieres Santiago es que usando el CPUDIV1:CPUDIV0 en 4 suponiendo un crsital de 20Mhz se tendria un reloj de 5Mhz para funcionamiento del micro y se mantendrían los 48Mhz para el USB si se ha configurado el PLLDIV en 5.

Por hoy ya es demasiado, mañana segire con este tema a ver si veo mas luz.

Nop! Divides los 96 MHz resultantes del PLL por 2,3,4 o 6.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado fedekb24

  • PIC10
  • *
  • Mensajes: 3
Re: PWM a bajas frecuencias y USB
« Respuesta #5 en: 10 de Agosto de 2010, 02:14:33 »
Hola migsantiago,
                        muchas gracias por tu respuesta, tendré muy en cuenta lo de las fallas de los fuses. Por lo que leí en la hoja de datos, y que también lo explica el maestro RedPic aquí CPUDIV es un postscaler, que como bien dices me permitiría dividir la frecuencia de oscilador primario que le llega al PIC para la ejecución del programa. Pero analizando el diagrama de la estructura de las diferentes opciones de osciladores que tiene este PIC se ve que hay dos maneras de llegar al CPUDIV. Según entendí, (del artículo citado anteriormente de RedPic) una podría ser la proveniente del PLL de 96 MHz o desde el Oscillator Postscaler, que es otro divisor que de forma directa sin pasar por el  módulo PLL nos divide la frecuencia original del cristal por 1, 2, 3 ó 4 y que también va a parar al CPUDIV pero desde otro origen. Por lo leído mediante FOSC3:FOSC0 del registro CONFIG1H (byte address 300001h) sería con los que elegiría cuál CPUDIV utilizaría.

De todas formas, para mi aplicación en particular entiendo que ninguna de estas opciones me servirían ya que utilizando un cristal de 20 MHz y usando CPUDIV1:CPUDIV0 en 4 como decía willynovi un reloj de 5MHz aún es muy veloz para lo que yo necesito.


Por eso es que me surge la pregunta de cómo usar el oscilador interno para la ejecución de programa y el oscilador primario externo para el USB. ¿Alguien tiene idea de cómo serían los fuses en CCS? ¿Debo programar manualmente los bits SCS1:SCS0 del registro OSCON? ¿Cómo sería en este último caso?   :?  

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: PWM a bajas frecuencias y USB
« Respuesta #6 en: 10 de Agosto de 2010, 10:41:34 »
Nop! Divides los 96 MHz resultantes del PLL por 2,3,4 o 6.


Saludos!

Cierto.

Ya busqué mi código y encontré el error de CCS.

Considerando una velocidad de entrada de 96MHz, yo quería obtener 16MHz para el CPU por lo que el divisor sería de 6. Pero en el erróneo CCS tuve que usar el fuse CPUDIV4 que a final de cuentas debería ser declarado como CPUDIV6.

CPUDIV4 se interpreta en CCS como divisor entre 6.  :x

Creo que meten mucho la pata los de CCS.  :?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: PWM a bajas frecuencias y USB
« Respuesta #7 en: 10 de Agosto de 2010, 11:01:12 »
Hola migsantiago,
                        muchas gracias por tu respuesta, tendré muy en cuenta lo de las fallas de los fuses. Por lo que leí en la hoja de datos, y que también lo explica el maestro RedPic aquí CPUDIV es un postscaler, que como bien dices me permitiría dividir la frecuencia de oscilador primario que le llega al PIC para la ejecución del programa. Pero analizando el diagrama de la estructura de las diferentes opciones de osciladores que tiene este PIC se ve que hay dos maneras de llegar al CPUDIV. Según entendí, (del artículo citado anteriormente de RedPic) una podría ser la proveniente del PLL de 96 MHz o desde el Oscillator Postscaler, que es otro divisor que de forma directa sin pasar por el  módulo PLL nos divide la frecuencia original del cristal por 1, 2, 3 ó 4 y que también va a parar al CPUDIV pero desde otro origen. Por lo leído mediante FOSC3:FOSC0 del registro CONFIG1H (byte address 300001h) sería con los que elegiría cuál CPUDIV utilizaría.

De todas formas, para mi aplicación en particular entiendo que ninguna de estas opciones me servirían ya que utilizando un cristal de 20 MHz y usando CPUDIV1:CPUDIV0 en 4 como decía willynovi un reloj de 5MHz aún es muy veloz para lo que yo necesito.


Por eso es que me surge la pregunta de cómo usar el oscilador interno para la ejecución de programa y el oscilador primario externo para el USB. ¿Alguien tiene idea de cómo serían los fuses en CCS? ¿Debo programar manualmente los bits SCS1:SCS0 del registro OSCON? ¿Cómo sería en este último caso?   :?  


Tienes razón al decir que hay dos maneras de llegar a CPUDIV, una con PLL activado y la otra no. Entonces si vas a usar usb, necesitas activar el PLL y solamente podrás conseguir 48MHz, 32MHz, 24 MHz y 16MHz. No hay manera de tener 5MHz con el PLL activado para utilizar USB Lo que indica willinovi es sin activar el PLL el cual lo seleccionas mediante FOSC3:FOSC0.
Nop! Divides los 96 MHz resultantes del PLL por 2,3,4 o 6.


Saludos!
Creo que meten mucho la pata los de CCS.  :?

Bastante!  :? Otro programador se hubiera cortado las venas al no saber que pasa!  :D :D

Saludos!



No contesto mensajes privados, las consultas en el foro

Desconectado fedekb24

  • PIC10
  • *
  • Mensajes: 3
Re: PWM a bajas frecuencias y USB
« Respuesta #8 en: 10 de Agosto de 2010, 14:39:38 »

Citar
Tienes razón al decir que hay dos maneras de llegar a CPUDIV, una con PLL activado y la otra no. Entonces si vas a usar usb, necesitas activar el PLL y solamente podrás conseguir 48MHz, 32MHz, 24 MHz y 16MHz. No hay manera de tener 5MHz con el PLL activado para utilizar USB Lo que indica willinovi es sin activar el PLL el cual lo seleccionas mediante FOSC3:FOSC0.

Hola Suky, gracias por tu respuesta. Me ha quedado muy claro lo que me dicen tú y willinovi en cuanto al uso del PLL. Ahora me pregunto si puedo hacer que el reloj del PIC provenga del oscilador interno, además de usar el oscilador primario (un cristal de 20 MHz) que entra al PLL para el USB.

Les voy a contar un poco la aplicación que tal vez aclare un poco las cosas que necesito (o tal vez lo empeore  :D). En el proyecto que estoy trabajando necesito crear una interfaz entre la PC y unos dispositivos de estimulación eléctrica funcional (FES). Estos últimos son equipos biomédicos utilizados para estimular los músculos. Pueden ser utilizados para rehabilitación o para devolver la función perdida en pacientes con alguna patología determinada.
Estos equipos generan pulsos eléctricos de una forma de onda determinada, con posibilidad de cambiar ciertos parámetros (ancho de pulso, frec., etc.).
La idea es poder enviar los comandos de control desde la PC, generados por una interfaz cerebro-computadora (BCI, o brain computer interface, pero eso es otro rollo para otro tópico je), hacia el PIC y que éste realice la modificación de los parámetros de la señal de estimulación. En resumen, quiero deshacerme de los potenciómetros y del 555 de los controles analógicos  :).
Por ello es que pensé en generar las señal de control con el CPP en modo PWM, y dada las características fisiológicas de nuestro sistema locomotor, necesito generar una señal de frecuencia de 20 Hz y pulsos de 300 useg aprox.

¿Puede ser que el modo INTHS sea el que necesitaría? Porque de la hoja de datos del 18F4550 (pág. 25) pude rescatar esto:

"    Users can program the FOSC3:FOSC0 Configuration
bits to select one of these modes:

1. XT Crystal/Resonator
2. HS High-Speed Crystal/Resonator
3. HSPLL High-Speed Crystal/Resonator with PLL Enabled
4. EC External Clock with FOSC/4 Output
5. ECIO External Clock with I/O on RA6
6. ECPLL External Clock with PLL Enabled and FOSC/4 Output on RA6
7. ECPIO External Clock with PLL Enabled, I/O on RA6
8. INTHS Internal Oscillator used as Microcontroller Clock Source, HS Oscillator used as USB Clock Source
9. INTIO Internal Oscillator used as Microcontroller Clock Source, EC Oscillator used as USB Clock Source, Digital I/O on RA6
10. INTCKO Internal Oscillator used as Microcontroller Clock Source, EC Oscillator used as USB Clock Source, FOSC/4 Output on RA6"
"

No me queda claro si en este modo el PLL está habilitado (como el modo HSPLL). Esto sería indispensable para lograr los 48 MHz con un cristal de 20, ¿no es cierto? Por eso no sé si es el modo correcto. ¿Alguna sugerencia?  :?




 

anything