Interface pour les chargeurs USB de type C avec PD / PPS
Ce projet provient d'une colaboration avec Embre GmbH.
Ils ont fait un excellent travail dans
Il existe des planches intéressantes pour déclencher des sources de livraison de puissance de type C USB. Comme le zy12pdn.
Vous pouvez trouver de nombreux détails chez Manuel BL. Ces modules vous permettent de parcourir les profils fixes disponibles qui incluent 5 V, 9 V, 12 V, 15 V et 20 V. Il y en a beaucoup, certains ont une tension sélectionnable à travers des résistances ou des cavaliers.
J'ai réussi à mettre la main sur celui qui utilise une puce HUSB238 de Hynetek. Celui-ci est programmable soit par des résistances, soit un microcontrôleur utilisant I2C.
Malheureusement, cela est bien inférieur aux capacités d'une alimentation électrique conforme PD 3.0. Tous ces modules n'utilisent que des profils dits fixes. Mais il y a le mode PPS (alimentation électrique portimable). Cela utilise le profil augmenté. Les profils augmentés sont spacifiés de 3,3 V à 21 V et jusqu'à 5 A. La tension peut être sélectionnée en 20 mV et le courant maximum peut être sélectionné en étapes de 50 mA.
Et voici mon idée: avez-vous déjà utilisé une de ces grosses alimentations de laboratoire mangeant le plus d'espace sur votre bureau? Ces alimentations vont souvent de 0 à 30 V et 0 - 5 A. En ce qui me concerne, j'utilise principalement 5 à 15 V à quelques amplis.
Et si nous pouvons utiliser ce profil augmenté pour imiter une alimentation en laboratoire? Nous aurions besoin d'une puce capable de demander ce profil à partir d'une alimentation PPS PPS de type C appropriée.
Eh bien, il y a la manière facile et à la dure:
Le moyen facile serait de dire à une puce de demander la tension souhaitée Forme de l'alimentation.
Une telle puce est l'AP33772 disponible auprès de Diodes Incorporated. Vous pouvez obtenir des diodes de formulaire d'évaluation dédiées ou d'autres fabricants, par exemple. Microe. Ceci est le puits USB-C 2 cliquez sur Form Microe: 
Cette puce a été marquée comme NRND et a été remplacée par les AP33772. La version "S" est encore plus facile à utiliser, mais a un énorme inconvénient: il n'autorise que 100 mV et 250 mA.
La manière difficile est d'utiliser l'un de ces USB-C PD Phys. Ils fournissent une interface OSI 0 + 1 à l'alimentation. Des niveaux plus élevés doivent être mis en œuvre en SW. La puce la plus couramment utilisée semble être la forme FUSB302 sur le semi-conducteur. Cette puce a été utilisée dans le ZY12PDN d'origine.
Et le voici: 
Ceci est le PD-micro daigné par Ryan MA. C'est Aruduino Pro Micro avec le FUSB302, certaines LED, un interrupteur d'alimentation et un régulateur de tension. Ryan a facilité la sélection des profils appropriés. Kai Clemens Liebich a apporté quelques améliorations à la lib FUSB302 de Ryan.
Le seul problème est la stabilité de la tension. Même lorsque vous utilisez 5 câbles USB C, la chute de tension est assez importante. Nous pourrions donc avoir besoin de mesurer la tension de sortie pour ajuster ajusté la tension d'alimentation. L'idée FRIST a été d'utiliser l'ADC interne avec une eference de tension externe 2,048 V. Le problème est que ce n'est qu'un ADC à 10 bits, mais nous devons mesurer les tensions jusqu'à 21 V. En supposant que nous coupons à 20,48 V, nous aurons une résolution de 20 mV. Cela semble être juste assez, mais nous pouvons facilement faire mieux. Lorsque vous utilisez un ADC dédié, par exemple l'INA219
Nous pouvons améliorer la précision à 4 mV. Ceci est bien en dessous de la taille de 20 mV. Et nous obtenons un capteur de courant sur le dessus.
Avertissement sur le capteur actuel ACS712
L'ACS 712 est un capteur de courant isolé facile à utiliser. Mais:
Maintenant, nous pouvons définir une tension, activer la sortie et mesurer la tension et le courant de sortie. Nous pouvons donc écrire quelques lignes de code pour implémenter une tension / source de courant constante. Eh bien, le temps de réponse du réagullateur sera limité par la vitesse de l'alimentation, mais il est dans des limites raisonnables qui se détachent de votre alimentation USB. Mon PS est un Ugreen Nexode 2 obsolète avec 100W qui passe en ~ 40 .. 50 ms.
Mais comment est la tension et le courant de courant? Eh bien, nous pourrions utiliser une interface série et un ordinateur pour "télécommande" le circuit. Mais qu'en est-il d'un écran LCD un interrupteur rotatif comme interface utilisateur ?.
Et cela m'amène à mon premier prototype.

Et voici les composants dans le sens des aiguilles d'une montre avec le haut à gauche.

Il s'agit du capteur de tension et de courant. La résistance de shunt a été réduite à R015 pour obtenir une lecture à grande échelle 5.
Il y a un EEPROM en série 24C256 sur le tableau. Ceci est utilisé pour le stockage des paramètres. J'aurais pu utiliser les atments sur la puce EEPROM, mais cela a beaucoup moins de résistance à l'usure. Je ne savais pas combien de cycles d'écriture seraient nécessaires, alors j'ai choisi une EEPROM EXTERNEL

C'est le cœur du circuit.
Le port USB - C du PD-MICRO est occupé par l'alimentation. L'interface USB ne peut pas être utilisée pour la communication. L'interface série HW est donc câblée à une puce FT232 USB vers série.

Il s'agit d'un affichage compatible HD44780 20x4 avec PCF8574, onduleur de tension et source de courant pour le contraste comme décrit dans ma bibliothèque LCD.
À gauche à l'écran, il y a un interrupteur d'encodeur rotatif KY-040. Juste au-dessus de l'interrupteur, il n'y a qu'une barre de bus I2C et VCC.
De quelles fonctionnalités une alimentation en laboratoire a-t-elle besoin?












Au démarrage, le système affiche un message de version et de construction avant de commencer dans le menu principal.
PD/PPS-Controller
====================
Ver. : 3.3 nbl
Build: mmm dd yyyy
Une fois l'initialisation terminée, le menu principal s'affichera
Mode (x:...) [UI^] !
UU.UU V I.II A
OUT UU.UU V I.II A
[i i i i i] (i)
Dernière ligne I: icônes de menu
Pour sélectionner un élément de menu, appuyez sur le bouton, un curseur apparaîtra. Tournez l'interrupteur rotatif jusqu'à ce que le curseur soit à la position de l'élément souhaité. Appuyez à nouveau sur le bouton pour sélectionner le menu. Dans ce menu, le "V" et "A" dans la deuxième ligne sont également des éléments de menu. Sélectionnez pour ajuster la tension ou le courant souhaité.
Ce menu est utilisé pour sélectionner le profil PD souhaité.
# 1 / n (...)
U= UU.UU V - UU.UU V
I= I.II A max
[i i i] (i)
Dernière ligne I: icônes de menu
Pour sélectionner un profil, appuyez sur le bouton Accédez au symbole "#" dans la première ligne et appuyez à nouveau pour saisir la sélection du profil. Le virage passera dans les profils Avalabla. Pour sélectionner un profil, appuyez à nouveau et accédez à la coche dans la ligne Buttom ou sélectionnez "x" pour abandonner.
Ce menu est utilisé pour modifier le mode de fonctionnement ou la valeur d'étalonnage.
(i)=auto (*)=. *
(i)=auto
(i)=auto
[i i i x] (i)
[i] ou (i) Icônes entre parenthèses
I= I.III A: I.III A
[i i i x] (i)
[i] ou (i) Icônes entre parenthèses
Pour ajuster l'étalonnage de mesure de courant, activez la sortie avec une charge et utilisez un compteur d'ampère calibré pour mesurer le courant.
Entrez le menu Paramètres et accédez au menu d'étalonnage. Entrez le courant mesuré et sélectionnez la coche, il est recommandé pour choisir un courant aussi élevé que possible pour gagner une précision maximale.
L'AVR SW est écrit avec Arduino IDE. En développant le SW, j'ai découvert quelques choses sur le système:
Après les successions initiales, un problème a rapidement rencontré des problèmes avec Flash et Ram. Vous pourriez être en mesure d'exécuter le code AVR, mais je recommande de réduire les fonctionnalités de la mémoire libre.
Et cela m'amène au deuxième prototype en utilisant ATSAMD21G18.
Le logiciel du dossier AVR est tel quel. Il ne sera plus de développement dans cette branche. Cela fonctionne en quelque sorte mais utilise à vos propres risques. Il ne compile que sans chargeur de démarrage, vous devrez ajouter le fichier boards.local.txt du dossier de configuration à
C:Users_user_AppDataLocalArduino15packagesarduinohardwareavr1.8.6
(au moins sur les machines Windows) et sélectionnez Arduino Leonardo sans chargeur de démarrage dans les cartes disponibles.
Vous aurez besoin d'une Avrdude et d'un usbasp
Astuce: Soyez prudent lors de l'achat de l'un des clones bon marché. Ils viennent souvent avec SW obsolète et ne fonctionneront pas. Ce n'est pas un problème de les mettre à jour, mais vous aurez besoin d'un adaptateur USBASP fonctionnel.
programmeur pour flasher le SW. Pour les utilisateurs non CLI: Avrduess est une excellente GUI pour Avrdude.
Vous pourriez aussi bien utiliser un Arduino Uno comme USB à ISP Bridge.
Après mes revers, j'ai essayé un arduino zéro. Cette carte utilise l'ATSAMD21G18 qui est un contrôleur ARM Cortex M0 + fonctionnant à 48 MHz. Il a 256 Ko Flash et 32 Ko RAM et beaucoup d'interfaces. Un port rapide a montré que le SW pouvait être facilement porté d'AVR à ARM avec presque aucun problème.
C'était le point où nous avons décidé de commencer notre premier PCB personnalisé en évitant tous les problèmes rencontrés avec le premier portotype.
Certains maux de tête provoquent l'offre VCC. La plupart des circuits de convertisseur de mâles ont besoin d'une hauteur de tension pour fonctionner et "entiver" un circuit de verrouillage sous tension. Mais c'est un non pour ce circuit. Il doit fonctionner jusqu'à VBU de 3,3 V. Nous avons besoin d'un curcuit de contournement sous-tension pour garantir l'opération à 3,3 V VBU. Sinon, le circuit verrouillerait lorsque VBU tombe sous le seuil qui est généralement de 4 V - 4,7 V à la sortie de 3,3 V.
Ce problème a été résolu légèrement surgénéré. Nous avons utilisé deux régulateurs de 3,3 V qui sont ORED par des diodes idéales.
Le TPS62932 est configuré pour sortir 3,45 V. L'UVLO est défini sur 4,55 V et l'activation est définie sur 5,06 V. Ceci garantit que le convertisseur de buck fonctionne au-dessus de 5 V et sortira légèrement au-dessus de 3,3 V, donc le 3,3 V LDO est désactivé. Le LDO est un ensemble NCV2951ACDMR2G à 3,3 V. La tension de dépôt est max 450 mV à 100 mA. La consommation de courant du circuit est inférieure à 50 mA, nous aurons donc un décrochage maximum estimé de 300 mV.
Lorsque la tension d'entrée est supérieure à 5,06 V, le LDO est inactif et que le VCC est de 3,45 V. Lorsque la voltag d'entrée tombe en dessous de 4,55 V, le convertisseur de buck est désactivé et que le LDO prend OVE, ce qui entraînera un VCC de 3,3 V V.
Le processeur fonctionnera à 2,7 V selon les paramètres de Brownout.
Le PCBA: 
Un prototype de travail: 
Current Calibration
internal I.III A
reference I.III A
[i i i x] (i)
La lecture actuelle et la valeur de référence ont été réorganisées.
Le SW a été refactorisé et est maintenant USB-PD2. Dans le premier SW, le contrôle de l'alimentation a été mis en œuvre dans la classe de menu. Ceci a été déplacé vers sa propre classe de contrôleur.
Un en-tête pour les rappels de TODO a été ajouté qu'une classe de test d'alimentation a été ajoutée pour les modifications de profil de test.
Afin de flasher le SW pour la première fois, vous aurez besoin d'une interface de débogage JTAG telle que
Vous pouvez utiliser Atmel Studio ou l'Arduino IDE pour flasher le chargeur de démarrage Arduio Zero.
Vous pouvez également utiliser la démo Blink. Sélectionnez Sketch -> Exporter binaire. L'IDE créera un fichier xxx.ino.with_bootloader.arduino_zero.bin. Flash simplement le fichier. Vous devrez peut-être copier les bits de fusibles d'un arduino zéro.
Il y a quelques échantillons dans le dossier FUSE. Certains des fusibles sont réglés en usine et ne peuvent pas être écrasés.
Une fois que le chargeur de démarrage fonctionne, vous pouvez flasher SW à l'aide du chargeur de démarrage SAM-BA. Le SW fourni par Microchip a une CLI qui convient à tous les appareils SAM en soutenant SAM-BA et est donc un peu difficile à utiliser. Un outil beaucoup plus simple est Bossa de Shumatech.
Mon chargeur prend en charge 5 V / 9 V / 12 V / 15 V @ 3A et 20 V @ 5A Profils fixes et 3,3 V - 21 V @ 5 un profil augmenté. Soyez prudent que de nombreux chargeurs marqués de 100W (même Ugreen) ne prendront en charge que 65 W PPS (3,25 a) avec une plage de tension limitée. Ils peuvent ne pas supporter les tensions inférieures à 3,3 V. Certaines auront même deux profils PPS avec des cotes de tension / courant différente.
UGREEN NEXODE 2 PORT 100W PD-CHARGER (modèle CD254 # 50827) Profils pris en charge:
UGREEN NEXODE 100W Charger de bureau (modèle CD328 # 90928) Profils pris en charge:
Anker Powerport I 30W PD
Profils pris en charge:
ilepo USB C Fast Charger 65 W
Profils pris en charge
INIU Power Bank 20000mah, 22,5W
Profils pris en charge
Une certaine puissance semble réinitialiser la puissance lorsqu'aucun courant n'est dessiné.
Mon "chargeur de bureau Nexode 100W" P / N 90928 réinitialise après ~ 1 h sans charge. D'autres chargeurs ne le font pas.
Ma banque d'alimentation iniu se réinitialise sans charge dans les ~ 10s
Connexion avec charge 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
...
journal sans charge:
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