[PWM] electrónico.

277 views
Skip to first unread message

Democrito

unread,
Oct 4, 2016, 6:31:43 PM10/4/16
to FPGA-WARS: explorando el lado libre

Hola!

Me he diseñado dos PWM y quiero compartirlo con vosotros. Se trata de encender progresivamente los leds que lleva la icestick. Adjunto dos ficheros, el primero y más sencillo de entender lo he llamadado "pwm_rampa.ice" y el segundo "pwm_senoidal.ice".

La idea básica es la que muestra este gráfico.


El corazón de todo esto es un comparador de 8 bits junto a un contador, el cual suele tener una frecuencia bastante alta. El contador estará contando de 0 a 255 y vuelta a comenzar, así todo el rato. El comparador tomará la combinación de la entrada A (señal de muestra) y la comparará con lo que le entra del contador. Entonces si es mayor, menor o igual, se pondrá a '1' una de sus tres salidas. Las salidas "mayor que" y "menor que" son inversas y también son las señales PWM, excepto cuando A es igual a B.


Los PWM hay que ajustarlos un poco (señal "Clock" del contador) y en los ejemplos que he adjuntado va muy, pero que muy rápidos, porque los leds enseguida da la sensación que se encienden a tope y responde mejor a esas frecuencias para ver mejor contraste. Pero si en vez de leds fuese por ejemplo para controlar la velocidad de un motor, entonces habría que bajar mucho esa frecuencia de entrada al contador. Esto es un ir probado, porque depende de lo que quieras controlar va más fino o más bruto a según qué frecuencias (que por lo general suelen ser altas).


Verás en el esquema de por ejemplo "pwm_rampa.ice" que hay un segundo contador puesto en la entrada A, pero era para poner un ejemplo fácil de pequeñas cosas que se pueden hacer. Ese segundo contador va mucho más despacio, a unos 100Hz, para que haga variar el brillo de los leds cada 2,5 segundos aprox. Lo hace en forma de rampa, eso quiere decir que se va encendiendo y cuando llega al máximo se apaga bruscamente; este proceso se repite todo el rato. Le puse puertas NOT a la salida "menor que" para poder dar consumo a cada uno de los cinco leds de forma independiente y no hacer sufrir la salida de ese comparador, que además, como sabemos, las FPGA no va muy sobrada de corriente en sus salidas.


Luego hay un segundo ejemplo llamado "pwm_senoidal.ice", pero para comprender su funcionamiento habría que entender antes el anterior proyecto que hice que llama "KITT", es una manera de aplicar cosas aprendidas anteriormente. En este segundo programa conseguimos que los leds se enciendan y apaguen de forma progresiva.


Idealmente habría que poner un filtro pasa-bajos a la salida del PWM, para convertirla en lo más analógica posible, pero por sencillez queda así el esquema.


Todavía no estamos en Navidades, pero ya queda poco... (si cargas los ejemplos en tu FPGA entenderás a qué me refiero!)


Saludos!


Carlos 47

unread,
Oct 4, 2016, 6:48:58 PM10/4/16
to fpga-wars-explora...@googlegroups.com
Muy buen proyecto Democrito!!!
Hace algún tiempo intenté hacer un PWM pero al final el led parecia estar siempre prendido :/, en cuanto llegue a casa checo pwm_rampa en la icestick :D.

Saludos

--
Has recibido este mensaje porque estás suscrito al grupo "FPGA-WARS: explorando el lado libre" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/896f1233-49e2-4cbf-ad1b-811cef29299f%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Democrito

unread,
Oct 4, 2016, 6:52:01 PM10/4/16
to FPGA-WARS: explorando el lado libre
Por si las moscas... comento una cosa que se me ha olvidado cambiar.

Tengo puesto dos etiquetas a dos leds: "mayor" y "menor", se me olvidó cambiarles el nombre, no indica eso! Son etiquetas que pertenece cuando estaba haciendo las pruebas al funcionamiento del comparador.

Democrito

unread,
Oct 4, 2016, 6:59:07 PM10/4/16
to FPGA-WARS: explorando el lado libre
Se me olvidó adjuntar los "ICE"!!!
Adjuntos quedan!
pwm_rampa.ice
pwm_senoidal.ice

Carlos 47

unread,
Oct 4, 2016, 11:08:58 PM10/4/16
to fpga-wars-explora...@googlegroups.com
Acabo de hacer las pruebas y se ve muy bueno :D
Voy a estudiar el proyecto y ver en que me equivoque en mi implementación xD.

Saludos y gracias por los ice
-C

El 4 de octubre de 2016, 17:59, Democrito<spo...@gmail.com> escribió:
Se me olvidó adjuntar los "ICE"!!!
Adjuntos quedan!

--
Has recibido este mensaje porque estás suscrito al grupo "FPGA-WARS: explorando el lado libre" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.

Obijuan

unread,
Oct 5, 2016, 5:36:49 AM10/5/16
to FPGA-WARS: explorando el lado libre
Impresionante Demócrito!!!!!!!!

Cómo mola!!!!!!!!

Súbelo al repo de ejemplos por favor. Esto lo tiene que poder probar todo el mundo

Lo he probado con los leds de la icezum, y funciona fenomenal. Tanto la versión rampa como la triangular

Muy buen trabajo! Gracias por compartir!

Saludos, Obijuan

Juanillo Pillo

unread,
Oct 5, 2016, 6:10:07 AM10/5/16
to FPGA-WARS: explorando el lado libre
Jo... yo estoy muy perdido con el lenguaje en FPGAs. A ver si llegan las IceZum y me pongo con ello, me dais mucha envidia... :)

Democrito

unread,
Oct 5, 2016, 6:34:15 AM10/5/16
to FPGA-WARS: explorando el lado libre
Hola Obijuan,

Lo haré, pero necesito un poco de tiempo, a ver si consigo pillarle el truco a github... Esta noche me miraré ese tema.

Saludos!

Juan Gonzalez Gomez

unread,
Oct 5, 2016, 6:53:46 AM10/5/16
to FPGA-WARS: explorando el lado libre
Gracias Demócrito!

No hay prisa. Aprender lleva su tiempo. Pregúntanos todo lo que quieras

Saludos, Obijuan

--
Has recibido este mensaje porque estás suscrito al grupo "FPGA-WARS: explorando el lado libre" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.

Democrito

unread,
Dec 12, 2016, 4:10:27 PM12/12/16
to FPGAwars: explorando el lado libre
Hola!

Este mensaje va dirigido a las personas que estamos aprendiendo o acercándonos al lenguaje descriptivo Verilog y que además nos mola Icestudio como plataforma. A mí personalmente me recuerda a jugar con el Tente (es como un Lego), donde cada pieza tiene una función, pero aquí tenemos la posibilidad de crear piezas a la medida que queramos y con la forma que deseemos.

Se trata de crear un bloque de código donde el comparador y el contador van juntos dentro del mismo. De esta manera nos ahorramos crear de forma independiente un contador (para crear la rampa) y el comparador, por separado. Dentro del mismo bloque de código ya está todo junto usando verilog.

Tomé un ejemplo que hizo Obijuan en verilog para crear el PWM (de los códigos que se ejecutan como demo para la Icezum Alhambra). Lo único que he hecho es adaptarlo a Icestudio, porque es muy interesante para crearlo como bloque.

Sólo es de 4 bits, en vez de 7 u 8, pero eso no importa ahora, la diferencia es que entre un paso y el siguiente es más brusco cuanto menos bits tenga, como en este caso; aunque a la velocidad que le he puesto (un poquito rápido), no se nota en los leds (no se aprecia brusquedad en cada salto).

Recuerda que el contador que ves en el esquema que he puesto ("COUNTER_4BITS"), es sólo para crear el efecto de luminosidad creciente, podría ser cualquier otra cosa. Los bits i0 a i3 (la entrada real de PWM) puede ser cualquier combinación (en este caso de 4 bits) para pasar de digital a analógico (idealmente con un filtro pasa-bajos a la salida del PWM).

El contenido de la cajita o bloque tiene el siguiente código (entiéndase como "código" de descripción, no de programación) :

reg  pwm_out; 
reg  [3:0] rampa=0;
wire [3:0] pwm_in={i3,i2,i1,i0};

always @(posedge clk) 
  begin
    rampa <= rampa + 1'b1;      // Aumenta el contador con cada flanco de clk un escalón que va formando la rampa.
    pwm_out <= (pwm_in>rampa);  // Compara el valor de entrada "pwm_in" con el contador "rampa" y el resultado lo mete a la salida "pwm_out".
  end

Podemos observar que metemos las entradas i0..i3 a través de "wire" a una variable llamada "pwm_in" y a partir de ahí podremos trabajar sin necesidad de estar poniendo "{i3, i2, i1, i0} repetidamente. Esta forma de trabajar es mucho más cómoda y nos vamos introduciendo al lenguaje Verilog casi sin darnos cuenta.

Adjunto el ICE correspondiente. El diseño es enfocado en una "Alhambra", recuerda cambiar los pines si usas otra placa.

Saludos!





pwm4bits.ice
Reply all
Reply to author
Forward
0 new messages