Interfaz para cargadores USB tipo C con PD/PPS
Este proyecto se origina en una colaboración con Embres GMBH.
Hicieron un gran trabajo en
Hay algunos tableros interesantes para activar fuentes de entrega de potencia USB tipo C. Como el zy12pdn.
Puede encontrar muchos detalles en Manuel BL. Estos módulos le permiten atravesar los perfiles fijos disponibles que incluyen 5 V, 9 V, 12 V, 15 V y 20 V. Hay muchos otros por ahí, algunos tienen un voltaje seleccionable a través de resistencias o puentes.
Logré tener en mis manos uno, utiliza un chip Husb238 de Hyntek. Este es programable a través de resistencias o un microcontrolador usando I2C.
Desafortunadamente, esto está muy por debajo de las capacidades de una fuente de alimentación compatible con PD 3.0. Todos estos módulos usan solo los llamados perfiles fijos. Pero está el modo PPS (fuente de alimentación Porgrammable). Esto usa el perfil aumentado. Los perfiles aumentados se espacian de 3.3 V a 21 V y hasta 5 A. El voltaje se puede seleccionar en pasos de 20 mV y la corriente máxima se puede seleccionar en pasos de 50 mA.
Y aquí está mi idea: ¿alguna vez has usado uno de esos suministros de laboratorio gruesos que comen la mayor parte del espacio de tu escritorio? Estas fuentes de alimentación a menudo varían de 0 a 30 V y 0 - 5 A. En lo que a mí respecta, uso principalmente de 5 a 15 V en unos pocos amperios.
¿Qué pasa si podemos usar este perfil aumentado para imitar una fuente de alimentación de laboratorio? Necesitaríamos un chip que sea capaz de solicitar este perfil de una fuente de alimentación USB Tipo C adecuada para PPS capaz.
Bueno, hay una manera fácil y difícil:
La manera fácil sería decirle a algún chip que solicite el voltaje deseado de la fuente de alimentación.
Tal chip es el AP33772 disponible en Diodos Incorporated. Puede obtener un formulario de evaluación dedicado diodos u otros fabricantes, por ejemplo. Microe. Este es el USB-C Sink 2 Haga clic en Microe: 
Este chip ha sido marcado como NRND y fue reemplazado por el AP33772S. La versión "S" es aún más fácil de usar, pero tiene un gran inconveniente: permite solo 100 pasos de MV y 250 mA.
La manera difícil es usar uno de esos PD PD USB-C. Proporcionan una interfaz OSI 0 + 1 a la fuente de alimentación. Los niveles más altos deben implementarse en SW. El chip más comúnmente utilizado parece ser la forma FUSB302 en semiconductor. Este chip se usó en el ZY12PDN original.
Y aquí está: 
Este es el PD-Micro dignado por Ryan Ma. Es Aruduino Pro Micro con el FUSB302, algunos LED, un interruptor de alimentación y un regulador de voltaje. Ryan ha facilitado la selección de perfiles apropiados. Kai Clemens Liebich ha realizado algunas mejoras en el Fusb302 lib302 de Ryan.
El único problema es la estabilidad de voltaje. Incluso cuando se usa 5 cables USB C, la caída de voltaje es bastante significativa. Por lo tanto, es posible que necesitemos medir el voltaje de salida para ajustar bien el voltaje de la fuente de alimentación. La idea de Frist era usar el ADC interno con una eferencia externa de voltaje de 2.048 V. El problema es que esto es solo un ADC de 10 bits, pero necesitamos medir voltajes de hasta 21 V. Suponiendo que redujeremos a 20.48 V, tendremos una resolución de 20 MV. Esto parece ser suficiente, pero podemos hacerlo mejor. Cuando se usa un ADC dedicado, por ejemplo, el INA219
Podemos mejorar la precisión a 4 MV. Esto está muy por debajo del tamaño de 20 MV. Y obtenemos un sensor actual en la parte superior.
Advertencia sobre el sensor actual ACS712
El ACS 712 es un sensor de corriente aislado fácil de usar. Pero:
Ahora podemos establecer un voltaje, habilitar la salida y medir el voltaje de salida y la corriente. Por lo tanto, podemos escribir algunas líneas de código para implementar una fuente de voltaje / corriente constante. Bueno, el tiempo de respuesta del reactoramiento estará limitado por la velocidad de la fuente de alimentación, pero está dentro de los límites razonables que dependen de su fuente de alimentación USB. Mi PS es un Ugreen Nexode 2 obsoleto con 100W que cambia en ~ 40 .. 50 ms.
Pero, ¿cómo es la slectet de voltaje y corriente? Bueno, podríamos usar una interfaz serie y una computadora para "control remoto" del circuito. Pero, ¿qué pasa con un LCD un interruptor giratorio como ui?
Y esto me lleva a mi primer prototipo.

Y aquí están los componentes en el sentido de las agujas del reloj con la parte superior izquierda.

Este es el sensor de voltaje y corriente. La resistencia de derivación se ha reducido a R015 para obtener una lectura de 5 a escala completa.
Hay un EEPROM en serie 24C256 en el tablero. Esto se utiliza para el almacenamiento de parámetros. Podría haber usado los atmel en chip Eeprom, pero esto tiene una resistencia al desgaste mucho menos. No sabía cuántos ciclos de escritura se necesitarían, así que elegí un EEPROM

Este es el corazón del circuito.
El puerto USB - C del PD -Micro está ocupado por la fuente de alimentación. La interfaz USB no se puede usar para la comunicación. Por lo tanto, la interfaz serial HW está conectada a un USB FT232 a Chip en serie.

Esta es una pantalla compatible con 20x4 HD44780 con PCF8574, inversor de voltaje y fuente de corriente para contraste como se describe en mi biblioteca LCD.
Izquierda a la pantalla hay un interruptor de codificador rotativo KY-040. Justo encima del interruptor solo hay una barra de bus I2C y VCC.
¿Qué características necesita una fuente de alimentación de laboratorio?












Al inicio, el sistema mostrará una versión y se desarrollará un mensaje antes de comenzar en el menú principal.
PD/PPS-Controller
====================
Ver. : 3.3 nbl
Build: mmm dd yyyy
Después de completar la inicialización, se mostrará el menú principal
Mode (x:...) [UI^] !
UU.UU V I.II A
OUT UU.UU V I.II A
[i i i i i] (i)
Última línea I: íconos del menú
Para seleccionar un elemento de menú, presione el botón, aparecerá un cursor. Gire el interruptor giratorio hasta que el cursor esté en la posición del elemento deseado. Presione el botón nuevamente para seleccionar el menú. En este menú, las "V" y "A" en la segunda línea también hay elementos del menú. Seleccione para ajustar el voltaje o la corriente deseados.
Este menú se utiliza para seleccionar el perfil PD deseado.
# 1 / n (...)
U= UU.UU V - UU.UU V
I= I.II A max
[i i i] (i)
Última línea I: íconos del menú
Para seleccionar un perfil, presione el botón Navegue al símbolo "#" en la primera línea y presione nuevamente para ingresar la selección de perfil. Girar atraviesará los perfiles de Avalabla. Para seleccionar un perfil, presione nuevamente y navegue a la marca de verificación en la línea Buttom o seleccione "X" para abortar.
Este menú se utiliza para cambiar el modo de operación o el valor de calibración.
(i)=auto (*)=. *
(i)=auto
(i)=auto
[i i i x] (i)
[i] o (i) iconos entre paréntesis
I= I.III A: I.III A
[i i i x] (i)
[i] o (i) iconos entre paréntesis
Para ajustar la calibración de medición de medición de corriente, habilite la salida con una carga y use un medidor de amperios calibrado para medir la corriente.
Ingrese el menú Configuración y vaya al menú de calibración. Ingrese la corriente medida y seleccione la marca de verificación Se recomienda elegir una corriente lo más alta posible para obtener la máxima precisión.
El AVR SW está escrito con Arduino IDE. Mientras desarrollaba el SW, descubrí algunas cosas sobre el sistema:
Después de los sucesos iniciales, se encontró rápidamente en problemas con Flash y Ram. Es posible que pueda ejecutar el código AVR, pero le recomiendo reducir la funcionalidad de la memoria gratuita.
Y esto me lleva al segundo prototipo usando ATSAMD21G18.
El software en la carpeta AVR es como está. No habrá más desarrollo en esta rama. Es un poco trabajo pero use bajo su propio riesgo. Solo se compila sin cargador de arranque, deberá agregar el archivo de tableros.local.txt desde la carpeta de configuración a
C:Users_user_AppDataLocalArduino15packagesarduinohardwareavr1.8.6
(al menos en máquinas de Windows) y seleccione Arduino Leonardo sin cargador de arranque en las tablas disponibles.
Necesitarás avrdude y un usbasp
Sugerencia: tenga cuidado al comprar uno de los clones baratos. A menudo vienen con SW obsoleto y no funcionarán. No es un problema actualizarlos, pero necesitará un adaptador USBASP que funcione.
programador para mostrar el SW. Para usuarios no CLI: Avrduess es una gran GUI para Avrdude.
También podría usar un Arduino Uno como USB al puente ISP.
Después de mis contratiempos probé un Arduino Zero. Esta placa utiliza el ATSAMD21G18, que es un controlador ARM Cortex M0+ que se ejecuta a 48 MHz. Tiene flash de 256 kb y 32 kb de RAM y muchas interfaces. Un puerto rápido mostró que el SW podría ser fácil de transportar de AVR a brazo casi sin problemas.
Este fue el punto en el que decidimos comenzar nuestra primera PCB personalizada evitando todos los problemas encontrados con el primer portotipo.
Algunos dolor de cabeza causan el suministro de VCC. La mayoría de los circuitos convertidores de dólar necesitan un poco de espacio para la cabeza de voltaje para operar y "presentar" un circuito de bloqueo de subtensión. Pero este es un no ir para este circuito. Debe operar hasta 3.3 V VBU. Necesitamos un curcuit de derivación de subvoltaje para garantizar la operación a 3.3 V VBU. De lo contrario, el circuito se bloquearía cuando VBUS caiga debajo del umbral, que típicamente es de 4 V - 4.7 V a una salida de 3.3 V.
Este problema se resolvió ligeramente sobrevalorado. Utilizamos dos reguladores de 3.3 V que se orientan a diodos ideales.
El TPS62932 está configurado para salir 3.45 V. El UVLO se establece en 4.55 V y la Activa se establece en 5.06 V. Esto garantiza que el convertidor Buck funcione por encima de 5 V y sale ligeramente por encima de 3.3 V, por lo que el LDO de 3.3 V está desactivado salvamente. El LDO es un NCV2951ACDMR2G establecido en 3.3 V. El voltaje de abandono es máximo de 450 mV a 100 mA. El consumo actual del circuito es inferior a 50 mA, por lo que tendremos una deserción máxima estimada de 300 MV.
Cuando el voltaje de entrada está por encima de 5.06 v, el LDO está inactivo y el VCC es de 3.45 V. Cuando el voltag de entrada cae por debajo de 4.55 V, el convertidor de dólares está desactivado y el LDO toma OVE, lo que resulta en un VCC de 3.3 V. Cuando el voltaje de entrada continúa hasta la caída, VCC caerá a ~ 3 V en 3.3 V vbus.
La CPU funcionará salvamente hasta 2.7 V dependiendo de la configuración de Brownout.
La PCBA: 
Un prototipo de trabajo:
Current Calibration
internal I.III A
reference I.III A
[i i i x] (i)
La lectura actual y el valor de referencia se han reorganizado.
El SW ha sido refactorizado y ahora es USB-PD2. En el primer SW, se implementó el control de la fuente de alimentación en la clase de menú. Esto se ha movido a su propia clase de controlador.
Se ha agregado un encabezado para recordatorios TODO, se ha agregado una clase de prueba de fuente de alimentación para los cambios de perfil de prueba.
Para flashear el SW por primera vez, necesitará una interfaz de depuración JTAG como
Puede usar Atmel Studio o el IDE Arduino para flashear el cargador de arranque Arduio Zero.
También puedes usar la demostración de parpadeo. Seleccione Boceto -> Exportar binario. El IDE creará un archivo xxx.ino.with_bootloader.arduino_zero.bin. Simplemente flashear el archivo. Es posible que deba copiar los bits de fusibles de un Arduino Zero.
Hay algunas muestras en la carpeta de fusibles. Algunos de los fusibles están ajustados de fábrica y no pueden sobrescribirse.
Una vez que funciona el cargador de arranque, puede flashear SW usando el Sam-Ba Bootloader. El SW proporcionado por Microchip tiene una CLI que es adecuada para todos los dispositivos SAM que admiten SAM-BA y, por lo tanto, es un poco difícil de usar. Una herramienta mucho más simple es Bossa de Shumatech.
Mi cargador admite 5 V / 9 V / 12 V / 15 V @ 3A y 20 V @ 5A Perfiles fijos y 3.3 V - 21 V @ 5 Un perfil aumentado. Tenga cuidado, muchos cargadores marcados con 100W (incluso Ugreen) solo admitirán 65 W PP (3.25 A) con un rango de voltaje limitado. Es posible que no sean voltajes por debajo de 3.3 V. Algunos incluso tendrán dos perfiles PPS con clasificaciones de voltaje / corriente de diferencias.
Ugreen Nexode 2 Port 100W PD-Carger (Modelo CD254 #50827) Perfiles compatibles:
Charger de escritorio de Ugreen Nexode 100W (modelo CD328 #90928) Perfiles compatibles:
Anker Powerport I 30W PD
Perfiles compatibles:
Ilepo USB C Fast Charger 65 W
Perfiles compatibles
Iniu Power Bank 20000mAh, 22.5W
Perfiles compatibles
Parece que alguna potencia parece restablecer la potencia cuando no se dibuja ninguna corriente.
Mi cargador de escritorio "Nexode 100W" P/N 90928 se restablece después de ~ 1 h sin carga. Otros cargadores no lo hacen.
Mi banco de energía iniu se restablece sin carga dentro de ~ 10s
Registro con carga 20R
0006: FUSB302 ver ID:B_revA
0118: USB attached CC1 vRd-3.0
0172: RX Src_Cap id=1 raw=0x53A1
0172: obj0=0x2A01912C
0172: obj1=0x0002D0E9
0172: obj2=0x0003C096
0172: obj3=0xC076323C
0172: obj4=0xC0DC3228
0172: [0] 5.00V 3.00A
0172: [1] 9.00V 2.33A
0172: [2] 12.00V 1.50A
0172: [3] 5.00V-5.90V 3.00A PPS *
0172: [4] 5.00V-11.00V 2.00A PPS
0176: TX Request id=0 raw=0x1082
0176: obj0=0x42022628
0186: RX GoodCRC id=0 raw=0x0121
0192: RX Accept id=2 raw=0x05A3
0210: RX PS_RDY id=3 raw=0x07A6
0212: PPS 5.50V 2.00A supply ready
0214: Load SW ON
5214: TX Request id=1 raw=0x1282
5214: obj0=0x42022628
5222: RX GoodCRC id=1 raw=0x0321
5228: RX Accept id=4 raw=0x09A3
5246: RX PS_RDY id=5 raw=0x0BA6
5246: PPS 5.50V 2.00A supply ready
10248:TX Request id=2 raw=0x1482
10248: obj0=0x42022628
10256:RX GoodCRC id=2 raw=0x0521
10262:RX Accept id=6 raw=0x0DA3
10280:RX PS_RDY id=7 raw=0x0FA6
10280:PPS 5.50V 2.00A supply ready
...
Registre sin carga:
0006: FUSB302 ver ID:B_revA
0118: USB attached CC1 vRd-3.0
0172: RX Src_Cap id=1 raw=0x53A1
0172: obj0=0x2A01912C
0172: obj1=0x0002D0E9
0172: obj2=0x0003C096
0172: obj3=0xC076323C
0172: obj4=0xC0DC3228
0172: [0] 5.00V 3.00A
0172: [1] 9.00V 2.33A
0172: [2] 12.00V 1.50A
0172: [3] 5.00V-5.90V 3.00A PPS *
0172: [4] 5.00V-11.00V 2.00A PPS
0176: TX Request id=0 raw=0x1082
0176: obj0=0x42022628
0186: RX GoodCRC id=0 raw=0x0121
0192: RX Accept id=2 raw=0x05A3
0210: RX PS_RDY id=3 raw=0x07A6
0212: PPS 5.50V 2.00A supply ready
0214: Load SW ON
5214: TX Request id=1 raw=0x1282
5214: obj0=0x42022628
5222: RX GoodCRC id=1 raw=0x0321
5228: RX Accept id=4 raw=0x09A3
5248: RX PS_RDY id=5 raw=0x0BA6
5248: PPS 5.50V 2.00A supply ready
10250:TX Request id=2 raw=0x1482
10250: obj0=0x42022628
10258:RX GoodCRC id=2 raw=0x0521
10264:RX Accept id=6 raw=0x0DA3
10284:RX PS_RDY id=7 raw=0x0FA6
10284:PPS 5.50V 2.00A supply ready
==> The Power bank resets and defaults to 5V only.
0006: FUSB302 ver ID:B_revA
0118: USB attached CC1 vRd-3.0
0352: TX Get_Src_Cap id=0 raw=0x0087
0704: TX Get_Src_Cap id=0 raw=0x0087
1056: TX Get_Src_Cap id=0 raw=0x0087