Autor Tema: Generar onda senoidal mediante pwm  (Leído 9484 veces)

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

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
Generar onda senoidal mediante pwm
« en: 30 de Enero de 2006, 04:22:00 »
Hola a todos!!

Estoy intentando generar 3 ondas senoidales de distintas frecuencias utilizandos para ello la salida pwm de mi pic16F73 y un filtro a su salida, la verdad es que voy un poco perdido...

Alguien sabe dónde puedo encontrar algún ejemplo de ésto??

Un saludo y gracias!

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: Generar onda senoidal mediante pwm
« Respuesta #1 en: 31 de Enero de 2006, 20:46:00 »
Hola, la idea es buena, aunque lastimosamente no conozco ejemplos acerca del tema. Lo que si debes tener en cuenta es que el pic solo cuenta con 2 canales de PWM, en todo caso tendrias que usar un pic mas....

Por otro lado me parece buena la idea de ponerle un filtro pasabajos a la salida, lo que debes calcular es a que frecuencia de corte necesitas que trabaje.

Animos...RebotadoRebotado
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado kain589

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 324
RE: Generar onda senoidal mediante pwm
« Respuesta #2 en: 01 de Febrero de 2006, 03:26:00 »
Busca en la pagina de microchip que hay una application notes, nota de aplicacion sobre eso. Yo la tengo y la he leido pero solo la usan para generar frecuencias iguales a la de la red
Saludos desde Córdoba, españa

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Generar onda senoidal mediante pwm
« Respuesta #3 en: 01 de Febrero de 2006, 08:41:00 »
Hola, las tres frecuencias que necesito generar no deben de ser simultáneas, así que con uno de los módulos pwm del pic tengo bastante. Y sobre lo del aplication notes de la página de microchip, ya lo ví y no me servía el código ya que no está hecho de la manera que necesito.

Mi mayor problema es cómo saber el valor de duty necesario (para mi frecuencia de muestreo pwm) en cada momento de la onda senoidal que quiero generar para una frecuencia dada. Éstos valores los pondré en una tabla y mi rutina irá llamando a cada valor nuevo de duty hasta finalizar un período de onda senoidal.

En fin, espero haberme explicado....jejejej

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Generar onda senoidal mediante pwm
« Respuesta #4 en: 01 de Febrero de 2006, 09:48:00 »
Hola TOFLE, esto no tiene mucho que ver con lo de la tabla, pero no as comentado de que frecuencias son cada una de las señales. Estas son importantes para saber cual es el tamaño optimo de las tablas ya que a mayores frecuencias la resolución de las tablas será menor por cuestiones de demora en el procesado del PIC.

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Generar onda senoidal mediante pwm
« Respuesta #5 en: 01 de Febrero de 2006, 10:13:00 »
Hola Chaly29,

Las tres frecuencias son aproximadamente las siguientes:

880Hz, 1326.29Hz y 1768.38Hz

Que corresponden con tres notas musicales. Estas tres frecuencias deben de ser amplificadas y llevadas a un altavoz, es por eso que necesito que sean lo más senoidales posible, porque una onda cuadrada sería muy fácil de hacer con el pic pero no es lo más recomendable ni para el altavoz ni para el oído.

He calculado más o menos una frecuencia de muestreo grande junto con una resolución de duty buena quedando: Frec pwm=17.28KHz y resolución duty=8 bits.
De esta manera, por ejemplo, la onda de 880Hz la debería de descomponer en 88 partes aprox. y la de 1768.38Hz en unos 44. No es una gran resolución, pero éste sonido sólo estará presente unos 4 ms, a modo de golpes secos.

Perdón por tanto rollo....Giño


Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Generar onda senoidal mediante pwm
« Respuesta #6 en: 01 de Febrero de 2006, 11:08:00 »
Hola TOFLE, disculpadme la corrección pero si usamos el PWM a 17.28 KHz para la frecuencia de muestreo no será posible conseguir 88 y 44 partes para la senoidal, en el mejor de los casos:

17280 / 880 = 19.6
17280 / 1768 = 9.7

Por lo que te recomendaría que selecciones una frecuencia para el PWM mayor a la que pensáis usar.  

Por otro lado yo e realizado por medio de un convertidor D/A del tipo R/2R, un generador de onda senoidal que entregaba 4 KHz con muy buenos resultados, pero claro esta es la única función que realizaba el PIC, la ventaja del R/2R es que el filtro pasa bajos debe ser menos sofisticado, con la consecuente facilidad de construcción. Y el mejor resultado a la hora final ya que una seniodal que no se aproxima demaciado a tál, genera demaciados armónicos, y si tú quieres el equipo para realizar algúna calibración esto te traerá consecuencias.

Espero tu respuesta.

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Generar onda senoidal mediante pwm
« Respuesta #7 en: 01 de Febrero de 2006, 11:45:00 »
Perdona Chaly29, pero me equivoqué en la frecuencia de muestreo...lo hice de memoria pero está visto que más vale un lapiz corto que una memoria larga!!!
La frecuencia correcta es 78.12KHz, así si que sale, 78.12/880= 88.77

La finalidad de todo ésto es la de ponerle sonido a un metrónomo digital que estoy diseñando, así que la cantidad de armónicos no es en principio una restricción, así que pienso que un filtro pasa bajos a una frecuencia de corte alrededor de la frecuencia máxima generada será suficiente.

Estuve mirando la posibilidad de utilizar un conversor D/A paralelo ó serie, pero no vi muy factible la opción debido a su precio en función de la finalidad que le voy a dar.

En fin, sigo pidiendo perdón por el rollo....

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Generar onda senoidal mediante pwm
« Respuesta #8 en: 01 de Febrero de 2006, 13:25:00 »
Hola TOFLE, ahora si que me cierran los números, el convertidor D/A que yo te comento no es de gran costo, ya que se realiza con 25 resistencias del mismo valor, los únicos inconvenientes que tiene es que tienen que agregar al PCB 25 resistencias y que debes de usar 8 pines para su funcionamiento, aparte del audio y un par de pulsadores para cambiarle la frecuencia de salida, ¿tu metrónomo dispone de mas funciones?

Para el calculo del valor de cada paso se hace lo siguiente, el ej. es para 880 Hz:

(grados de un circulo) / (cantidad de pasos)
360 / 88 = 4.09 grados

127 * sen 4.09 = 9
127 * sen 8.18 = 18
127 * sen 12.27 = 27
............
............

Y continuas así asta completar los 360 grados.

Los resultados anteriores tenés que sumárselos al valor 127 ej.

127 + 9 = 136
127 + 18 =145
127 + 27 = 154

Pasado los 180 grados los resultados te darán de un valor negativo, -9, -18, -27, entonces tendrás que hacer lo siguiente:

127 - 9
127 + (-9)

Cualquiera de los 2 métodos que uses son valederos, fíjate que en el primer tramo o sea de 0 a 180 grados los números se irán acercando a 255 que es el valor máximo, en el segundo caso de 180 a 360 grados es lo contrario, se acercaran a 0, y 127 es el valor medio que tenemos de dividir 255/2

Los números los tendrás que ir redondeando hacia el mas próximo ya que la mayoría de los casos te darán con decimales

Suerte

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Generar onda senoidal mediante pwm
« Respuesta #9 en: 02 de Febrero de 2006, 07:42:00 »
Hola Chaly29,

Estuve anoche trabajando en los cálculos que me pasaste y por fin tengo lo que necesitaba, 3 ondas bastante senoidales de frecuencias diferentes!!

Te explico, lo cálculos los modifiqué en función del período que había usado para el PWM, en mi caso lo puse en 63 para conseguir una frecuencia PWM de 78.12KHz. Por tanto, ésto me condicionaba a usar valores de duty entre 0 y 63 (0% y 100%).

Al final los cáculos quedaron así:

63/2=31.5 ~31

31*sen(4.09)=2.211
.......
.........
 
Y ahora, a éstos valores le sumo 31 para eliminar las partes negativas:

31+2.211=33.211
......
.....

Y por último aplico un redondeo a éstos valores para aplicarlos al duty en cada período de muestreo.

33.211 ~ 33
......
.....

Y ésto fué todo, con una patilla de mi PIC,un filtro pasa bajo calculado para la frecuencia máxima deseada y un filtro de desacoplo para eliminar el offset.....TODO OK!!

Por favor, corrígeme las siguientes afirmaciones si me equivoco Chaly29:

 1. Cuando multiplicamos por 31 en la parte del cálculo de seno, se hace para acotar los resultados al rango de valores que podemos usar.
 2. Cuando sumamos 31 a cada resultado anterior, se hace para acotar la onda entre valores positivos que vayan entre 0 y 62 (en mi caso) para poder ser implementados en el PIC.

Un saludo y un millón de gracias!!!

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Generar onda senoidal mediante pwm
« Respuesta #10 en: 02 de Febrero de 2006, 10:42:00 »
Hola TOFLE, me parese que tu tienes una confucion con el tema del seteo del PWM, supongamos que tu estas trabajando el micro a 20 MHz.

El prescaler lo setearas a 1
El valor de PR2 debera ser H"3F" = 63 en decimal

Con esto la resolución que obtendrás será de 8 bits o sea de 0 - 255
Y la frecuencia quedara de 78.12 KHz


El valor que deseas de Duty Cicle tendrás que ponerlo en el registro CCPR1L

De esta forma los valores para la tabla tuya estarán comprendidos entre 0 y 255 y no 0 y 63 como tu dices, por que fíjate que la resolución con esas condiciones es de 8 bits.

Lo que tu estas queriendo reformar es el registro PR2 y ese es el encargado de setear el periodo, o sea que una ves que colocas el 63 en el registro PR2 no debes tocarlos mas a menos que desees cambiarle la frecuencia al PWM.

Por lo tanto, mientras el programa esta funcionando lo que tiene que hacer es tomar el valor correspondiente de la tabla y colocarlo en el registro CCPR1L y nada mas.

Corrígeme si estoy confundido yo.

Por otro lado yo elegí 127 porque es el punto medio dentro de la escala de variación que nos permite el PWM a esta frecuencia, y como la señal senoidal posee un semiciclo positivo y otro negativo, pues si nosotros partimos de cero para realizar el positivo, no podremos luego fabricar el negativo, por lo tanto el punto medio hay que elevarlo para conseguir lo deseado, y como los 2 semiciclo son idénticos decidí que el valor medio mas conveniente seria justo el valor medio que nos permite el PWM que en este caso es 127, o sea 8 bits = 255 entonces 255 / 2 = 127.5 como debemos redondear nos queda 127.

Con respecto a los cálculos que as realizado están correcto (suponiendo que no le estés errando en el seteo del modulo PWM), y las dos preguntas que me haces también son correctas.

Seria interesante que me confirmes que al PIC lo estas haciendo trabajar a 20 MHz, si no es así dime la frecuencia que usas.

Con respecto al filtro pasa-bajos seria conveniente que lo calcules con una frecuencia de corte algo superior a la máxima de trabajo (2500 Hz o incluso 3000 Hz) ya que si realizas el corte justo a la frecuencia máxima esta ultima saldrá con un nivel de audio inferior a las demás, con lo que tendrás un volumen bastante menor, acuérdate de desacoplar la continua para no tener problemas posteriores.

Si no llegaras a entender algo solo házmelo saber.

Suerte

Atte. CARLOS


 
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Generar onda senoidal mediante pwm
« Respuesta #11 en: 02 de Febrero de 2006, 13:42:00 »
Hola Chaly29,

Como bien dices, mi reloj lo tengo a 20MHz, el pre-escaler del TRMR2 a 1, mi período PWM a 0x3F para conseguir 78.12KHz, el registro CCPR1L lo voy variando en función de la tabla que he generado. Todo ésto está según el datasheet del PIC16F73, y también la resolución que tendrá, 8 bits.
Pero el problema que tuve ayer fué que al generar el código con la tabla con valores entre 0 y 255, el circuito no hacía lo que yo quería, por tanto lo simulé con MPLAB y vi que el TMR2 se desbordaba a .63 siempre, y por eso no reconocía valores superiores a .63 de mi tabla. Por tanto me puse a buscar algún ejemplo en internet y ví que para conseguir un duty del 50% el CCPR1L se pone a la mitad del período de PWM, algo lógico por otra parte.
Entonces fué cuando decidí normalizar los valores a .63, y de ésta manera....todo funcionó perfecto en la simulación en MPLAB y en el circuito comprobándolo con el osciloscopio.

No sé el por qué de ésto, ya que en el datasheet indica que la resolución es de 8 bits, pero la cuestión es que de la manera que propongo funciona.
Si quieres te envío el código de prueba que generé y le pegas un vistazo.

Un saludo!

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Generar onda senoidal mediante pwm
« Respuesta #12 en: 02 de Febrero de 2006, 18:42:00 »
Hola TOFLE

Tuviste en cuenta que el registro CCPR1L son los 8 bits mas significantes del PWM y que lo de menos valor se encuentran en el registro CCP1CON bit 5 y 4, que corresponden al 1 y 0 respectivamente.

Bueno, si en tu programa se te complica para el uso de esos 2 bits, los cálculos los puedes hace basados en el 63 (como tú lo has hecho), ¿por que?

así seria los 8 bits de definición:

00111111-11

donde los 8 primeros corresponden al registro CCPR1L
entonces no usando los dos últimos correspondientes al registro CCP1CON

nos quedarían los bits 2, 3, 4, 5, 6, 7, 8, 9, 10

00111111-sin los últimos dos

como nosotros disponíamos de una resolución de 8 bits, los 2 bits de mayor valor del registro CCPR1L no los usaremos, nos quedaría:

00111111

y suponiendo que esos son los bits, 0, 1, 2, 3, 4, 5, nos quedarían solo 6 bits para las variables, o sea que 2 elevado a la sexta = 64 (menos 1 que corresponde al 0) nos da el número que usaste tú en tus cálculos (63), bueno, hay tienes la explicación del por que no te anduvo con 8 bits, sencillo estabas queriendo hacer que funcione con 10 bits de resolución.

Pero el PWM si tiene 8 bits de resolución con los parámetros descriptos, el problema es que hay que usar el registro CCP1CON y en algunas circunstancias en complicado y lento, por lo tanto el datasheet de microchip, como no puede ser de otra forma esta correcto.

Bueno, me alegro de que llegaras a solucionar el problema, espero que la ayuda te halla servido, si tienes mas dudas hazlas saber que en la medida de las posibilidades las resolveremos.

Suerte con el proyecto.

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado TOFLE

  • PIC10
  • *
  • Mensajes: 29
RE: Generar onda senoidal mediante pwm
« Respuesta #13 en: 03 de Febrero de 2006, 07:15:00 »
Hola,

Ahora ya si que está todo claro, he retocado mi código para poder usar el registro CCPR1L y los dos bits del CCP1CON y....ya funciona con una resolución de 8 bits. Eso sí, como bien decías, es un poco complicado hacer el envío de los bits 0 y 1 de cada valor de la tabla al registro CCP1CON. Pero bueno, ya está.
La verdad es que no existe mucha diferencia en la onda senoidal de trabajar con la resolución de 6 bits que tenía a trabajar a 8 bits. A ver si puedo analizarlo con un osciloscopio digital para ver dónde está la diferencia.

Muchísimas gracias por tu ayuda!!


Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: Generar onda senoidal mediante pwm
« Respuesta #14 en: 03 de Febrero de 2006, 09:52:00 »
Hola TOFLE, en teoría el uso de 6 u 8 bits de resolución si tienes un buen filtro para bajos no tendría por que haber diferencia, ahora si te pones a analizarlo con un osciloscopio aunque sea uno común te darás cuenta que la de 6 bits posee mas irregularidades que la de 8 bits, pero siendo el uso que tu le darás a esa señal te aseguro que al oído no encontraras diferencia.

Un saludo y suerte.

Atte. CARLOS

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.


 

anything