sábado, 8 de junio de 2013

PWM Síncrono con PCA9685 | Synchronous PWM with PCA9685

Gracias al auge de la iluminación LED han salido al mercado circuitos integrados capaces de generar varias salidas PWM. La mayoría de ellos son escalables permitiendo generar múltiples señales con un único bus de datos.

Por ejemplo el TLC5940, que cuenta con 16 salidas de 12 bits de resolución (4096 pasos). El problema que encontramos con este integrado es que cada una de las salidas tiene un delay de 20ns con respecto a la anterior (Pag. 14), así entre la salida 0 y la 15 hay 300ns de delay.

Otro integrado interesante es el PCA9685 que, al igual que el anterior, dispone de 16 salidas de 12 bits de resolución, y a diferencia del anterior, son sincrónicas. A demás este integrado se controla mediante el bus de datos I2C. El único problema que tiene es que la frecuencia máxima de señal utilizando el oscilador interno (25MHz) es de 1KHz. Usando un oscilador externo de 50MHz (máximo permitido), obtendríamos una frecuencia de 12KHz aproximadamente (Pag. 13).

     50Mhz / 4096 = 12207Hz
    

Hay otro de la misma familia que el anterior, se trata del PCA9635. Este cuenta con 16 salidas de 8 bits de resolución (256 pasos), son sincrónicas y con una frecuencia de 97KHz.

Para la prueba de hoy he comprado el segundo (PCA9685), y usando el oscilador interno, a una frecuencia de 1KHz he obtenido buenos resultados, lástima del zumbido audible que produce esta frecuencia en el motor.
With the rise of LED lighting, have arrived to market integrated circuits capable of generating several PWM outputs. Most of them are scalable allowing multiple signals on a single data bus.

For example TLC5940, which has 16 outputs 12-bit resolution (4096 steps). The problem we found with this chip is that each output has a delay of 20ns respect to previous output (p. 14), and there is 300ns delay between outputs 0 and 15.

Another interesting IC is PCA9685 which, as the previous one, has 16 outputs 12-bits resolution, but the outputs are synchronous. This integrated is controlled by I2C data bus. The only problem I have is that the maximum signal frequency using the internal oscillator (25MHz) is 1KHz. Using a 50MHz external oscillator (maximum allowed), we can obtain a frequency of about 12KHz (p. 13).

    50Mhz / 4096 = 12207Hz
    

Another of the same family as above, it's PCA9635. It has 16 outputs 8-bit resolution (256 steps), are synchronous with a frequency of 97KHz.

For testing today I bought the second one (PCA9685), and using the internal oscillator at a frequency of 1kHz I had good results, shame about the audible hum frequency produced by motor.



La verdad, pensaba que costaría más soldar los pins del encapsulado TSSOP28, pero no ha sido complicado, internet está lleno de manuales de cómo hacerlo. Aquí hay algunos interesantes de Sparkfun:

Surface Mount Soldering Tutorials:
https://www.sparkfun.com/tutorials/category/2

El siguiente esquema muestra la conexión entre PCA9685 y Arduino Nano. He usado también 2 transistores Darlington BD679 y la fuente de alimentación de Märklin Mini-Club. El potenciómetro de la fuente hay que ponerlo al máximo hacia la derecha, el conector rojo es el positivo y el marrón el negativo.
Actually, I thought it would be hard to solder TSSOP28 package pins, but it was not complicated, internet is full of how-to manuals. Here's an interesting one from Sparkfun:

Surface Mount Soldering Tutorials
https://www.sparkfun.com/tutorials/96

The following scheme shows the connections between PCA9685 and Arduino Nano. I used also 2 Darlington transistors BD679 and a Märklin Mini-Club power supply. The supply potentiometer must be put to maximum clockwise, the red connector is the positive and brown is the negative.



#include <Wire.h>

#define MODE1     0x00
#define MODE2     0x01
#define LED0      0x06
#define LED_SIZE  0x04
#define PRE_SCALE 0xFE

byte _address = B01000000;

void setup()
{
  
  Wire.begin();

  SetReg(MODE1, B00001001); // Sleep
  SetReg(PRE_SCALE, 0);     // Prescale. Minimum is 3 (Pag. 24)
  SetReg(MODE1, B00000001); // Reset
  
  SetReg(MODE1, B10100001); // Auto-Increment
  SetReg(MODE2, B00000100); // Totem Pole

  for(int i=0; i<16; i++)
    SetPwm(i, 700);

}

void loop()
{}

void SetReg(byte reg, byte data)
{
  Wire.beginTransmission(_address);  // Address
  Wire.write(reg);                   // Register
  Wire.write(data);                  // Data
  Wire.endTransmission();
}

void SetPwm(int led, unsigned int pwm)
{
  Wire.beginTransmission(_address);    // Address
  Wire.write(LED0 + (led * LED_SIZE)); // Output
  Wire.write(0);                       // LEDn_ON_L
  Wire.write(0);                       // LEDn_ON_H
  Wire.write(pwm);                     // LEDn_OFF_L
  Wire.write(pwm>>8);                  // LEDn_OFF_H
  Wire.endTransmission();
}



Las flechas señalan los puntos de aislamiento
Arrows indicates the isolation points






Descargas:
Downloads:

ArduinoPCA9685.zip




Enlaces:
Links:

TLC5940 (EN): http://www.ti.com/lit/ds/symlink/tlc5940.pdf
PCA9685 (EN): http://www.nxp.com/documents/data_sheet/PCA9685.pdf
PCA9635 (EN): http://www.nxp.com/documents/data_sheet/PCA9635.pdf
I2C (ES): http://es.wikipedia.org/wiki/I2C
I2C (EN): http://en.wikipedia.org/wiki/I%C2%B2C
Surface Mount Soldering Tutorials (EN): https://www.sparkfun.com/tutorials/category/2




3 comentarios:

  1. Hola.

    Te veo un poco obsesionado con el tema de las frecuencias.

    En los circuitos de control que yo hago, la frecuencia es muy baja, del orden de 40 Hz, es decir por debajo del nivel audible.

    Puedes ver en este vídeo lo bien que funciona:

    http://youtu.be/ZcEfvNORsc8

    Un Saludo

    ResponderEliminar
  2. Hola Ignacio,

    Es verdad que me obsesiono un poco con las frecuencias, con este integrado puedo trabajar con valores de entre 40Hz y 1KHz, lo interesante sería poder bajar de 20Hz o subir por encima de los 20KHz. Voy a probar de trabajar con este integrado a 40Hz.

    Pronto probaré el otro generador de PWM (PCA9635) que funciona a 97KHz, tendré problemas con las etapas de potencia porque las que estoy usando no aguantan grandes frecuencias. El L293 soporta un máximo de 5Khz (ya he quemado uno) y el L298 puede soportar hasta 40KHz.

    Así que voy a probar con bajas frecuencias.

    ResponderEliminar
  3. hola, una duda respecto al PCA9685. Es posible generar frecuencias independientes y ciclo de trabajo independientes en todos los canales?

    ResponderEliminar