Interface para carregadores USB tipo C com PD/PPS
Este projeto se origina em uma colaboração com o Embres GmbH.
Eles fizeram um ótimo trabalho em
Existem algumas placas interessantes para acionar fontes de entrega de energia USB tipo C. Como o zy12pdn.
Você pode encontrar muitos detalhes em Manuel BL .. Esses módulos permitem que você passe pelos perfis fixos disponíveis, que incluem 5 V, 9 V, 12 V, 15 V e 20 V. Existem muitos outros por aí, alguns têm tensão selecionável através de resistores ou saltadores.
Consegui colocar minhas mãos em uma que utiliza um chip Husb238 de Hynetek. Este é programável através de resistores ou de um microcontrolador usando I2C.
Infelizmente, isso está bem abaixo dos recursos de uma fonte de alimentação compatível com PD 3.0. Todos esses módulos usam apenas os chamados perfis fixos. Mas existe o modo PPS (fonte de alimentação porgrama). Isso usa o perfil aumentado. Os perfis aumentados são espacificados de 3,3 V a 21 V e até 5 A. A tensão pode ser selecionada em etapas de 20 mV e a corrente máxima pode ser selecionada em etapas de 50 mA.
E aqui está minha ideia: você já usou uma daquelas fontes de alimentação de laboratório grossas, comendo mais espaço em sua mesa? Essas fontes de alimentação geralmente variam de 0 a 30 V e 0 - 5 A. No que me diz respeito, uso principalmente 5 - 15 V em alguns amplificadores.
E se pudermos usar esse perfil aumentado para imitar uma fonte de alimentação de laboratório? Precisamos de um chip capaz de solicitar esse perfil de uma fonte de alimentação USB Tipo C adequado para PPS.
Bem, existe a maneira fácil e difícil:
A maneira mais fácil seria dizer a alguns chips para solicitar a tensão desejada da fonte de alimentação.
Esse chip é o AP33772 disponível na Incorporated Diodes Incorporated. Você pode obter um formulário de formulário de avaliação dedicado diodos ou outros fabricantes, por exemplo. Microe. Este é o Microe de Formulário de Formulário de Pia USB-C 2 : 
Este chip foi marcado como NRND e foi substituído pelo AP33772S. A versão "S" é ainda mais fácil de usar, mas tem uma desvantagem enorme: permite apenas 100 mV e etapas de 250 Ma.
A maneira mais difícil é usar um desses USB-C PD Phys. Eles fornecem uma interface OSI 0 + 1 para a fonte de alimentação. Níveis mais altos devem ser implementados no SW. O chip mais usado parece ser a forma FUSB302 no semicondutor. Este chip foi usado no Zy12pdn original.
E aqui está: 
Esta é a PD-Micro digitada por Ryan Ma. É o Aruduino Pro Micro com o FUSB302, alguns LEDs, um interruptor de energia e um regulador de tensão. Ryan facilitou a seleção de perfis apropados. Kai Clemens Liebich fez algumas melhorias no FUSB302 de Ryan.
O único problema é a estabilidade da tensão. Mesmo ao usar 5 cabos USB C, a queda de tensão é bastante significativa. Portanto, podemos precisar medir a tensão de saída para ajustar a tensão da fonte de alimentação. A idéia de Frist era usar o ADC interno com uma eferência de tensão de 2.048 V externa. O problema é que isso é apenas um ADC de 10 bits, mas precisamos medir tensões até 21 V. Supondo que prendemos a 20,48 V, teremos uma resolução de 20 mV. Isso parece ser o suficiente, mas podemos fazer melhor. Ao usar um ADC dedicado, por exemplo, o Ina219
Podemos melhorar a precisão para 4 mV. Isso está bem abaixo do tamanho de 20 mV. E temos um sensor atual no topo.
Aviso no sensor atual ACS712
O ACS 712 é um sensor de corrente isolado fácil de usar. Mas:
Agora, podemos definir uma tensão, ativar a saída e medir a tensão e a corrente de saída. Portanto, podemos escrever algumas linhas de código para implementar uma tensão constante / fonte de corrente. Bem, o tempo de resposta do reaglador será limitado pela velocidade da fonte de alimentação, mas está dentro dos limites razoáveis, dependendo da sua fonte de alimentação USB. Meu PS é um nexodo de Ugreen desatualizado 2 com 100W, que alterna em ~ 40 .. 50 ms.
Mas como é a tensão e a sletet atual? Bem, poderíamos usar uma interface serial e um computador para "controle remoto" do circuito. Mas que tal um LCD um interruptor rotativo como interface do usuário?.
E isso me leva ao meu primeiro protótipo.

E aqui estão os componentes no sentido horário, começam com o canto superior esquerdo.

Esta é a tensão e o sensor de corrente. O resistor de derivação foi reduzido para R015 para obter uma leitura em escala 5 em escala.
Há uma EEPROM serial 24C256 no quadro. Isso é usado para armazenamento de parâmetros. Eu poderia ter usado o atmel no chip eeprom, mas isso tem muito menos resistência ao desgaste. Eu não sabia quantos ciclos de escrita seriam necessários, então escolhi um EEPROM externo

Este é o coração do circuito.
A porta USB - C do PD -Micro é ocupada pela fonte de alimentação. A interface USB não pode ser usada para comunicação. A interface serial HW é, portanto, conectada a um chip ft232 USB para serial.

Esta é uma tela compatível com 20x4 HD44780 com PCF8574, inversor de tensão e fonte atual para contraste, conforme descrito na minha biblioteca LCD.
À esquerda para a tela, há um interruptor do codificador rotativo KY-040. Logo acima do interruptor, há apenas uma barra de barramento I2C e VCC.
Quais recursos uma fonte de alimentação de laboratório precisa?












Na inicialização, o sistema exibirá uma versão e criará uma mensagem antes de iniciar no menu principal.
PD/PPS-Controller
====================
Ver. : 3.3 nbl
Build: mmm dd yyyy
Depois que a inicialização for concluída, o menu principal será exibido
Mode (x:...) [UI^] !
UU.UU V I.II A
OUT UU.UU V I.II A
[i i i i i] (i)
Última linha I: ícones de menu
Para selecionar um item de menu Pressione o botão, um cursor aparecerá. Vire o interruptor rotativo até que o cursor esteja na posição do item desejado. Pressione o botão novamente para selecionar o menu. Neste menu, o "V" e "A" na segunda linha também são itens de menu. Selecione para ajustar a tensão ou corrente desejada.
Este menu é usado para selecionar o perfil PD desejado.
# 1 / n (...)
U= UU.UU V - UU.UU V
I= I.II A max
[i i i] (i)
Última linha I: ícones de menu
Para selecionar um perfil Pressione o botão Navegue até o símbolo "#" na primeira linha e pressione novamente para inserir a seleção de perfil. Virar passará pelos perfis Avalabla. Para selecionar um perfil Pressione novamente e navegue até a marca de seleção na linha Buttom ou selecione "X" para abortar.
Este menu é usado para alterar o modo de operação ou o valor de calibração.
(i)=auto (*)=. *
(i)=auto
(i)=auto
[i i i x] (i)
[i] ou (i) ícones entre colchetes
I= I.III A: I.III A
[i i i x] (i)
[i] ou (i) ícones entre colchetes
Para ajustar a calibração de medição de corrente, ative a saída com uma carga e use um medidor de ampere calibrado para medir a corrente.
Digite o menu Configurações e vá para o menu de calibração. Digite a corrente medida e selecione a marca de seleção que ela é recomendada para escolher uma corrente o mais alta possível para obter a máxima precisão.
O AVR SW está escrito com Arduino IDE. Ao desenvolver o SW, descobri algumas coisas sobre o sistema:
Após o sucesso inicial, um sucesso rapidamente encontrou problemas com Flash e RAM. Você pode executar o código AVR, mas eu recomendo reduzir a funcionalidade a memória gratuita.
E isso me leva ao segundo protótipo usando ATSAMD21G18.
O software na pasta AVR é como está. Não haverá mais desenvolvimento nesse ramo. É meio que trabalha, mas use por sua conta e risco. Ele compila apenas sem bootloader, você precisará adicionar o arquivo de placas.local.txt da pasta de configuração para
C:Users_user_AppDataLocalArduino15packagesarduinohardwareavr1.8.6
(pelo menos nas máquinas do Windows) e selecione Arduino Leonardo sem bootloader nas placas disponíveis.
Você precisará de avrdude e um USBASP
Dica: tenha cuidado ao comprar um dos clones baratos. Eles geralmente vêm com SW desatualizado e não funcionam. Não há problema em atualizá -los, mas você precisará de um adaptador USBASP em funcionamento.
Programador para piscar o SW. Para usuários não CLI: o avrduess é um ótimo GUI para avrdude.
Você também pode usar um Arduino UNO como USB para ISP Bridge.
Depois dos meus contratempos, tentei um Arduino Zero. Esta placa usa o ATSAMD21G18, que é um controlador de braço Cortex M0+ em execução a 48 MHz. Possui flash 256 kb e 32 kb de RAM e muitas interfaces. Uma porta rápida mostrou que o SW poderia ser fácil de transportar do AVR para o braço, quase sem problemas.
Foi o ponto em que decidimos iniciar nosso primeiro PCB personalizado, evitando todos os problemas encontrados com o primeiro portotipo.
Alguma dor de cabeça causa a fonte do VCC. A maioria dos circuitos de conversor de buck precisa de algum espaço de tensão para operar e "apresentar" um circuito de bloqueio de baixo tensão. Mas isso é um não ir para este circuito. Ele precisa operar até 3,3 V VBUs. Precisamos de um curcuit de desvio de subtensão para garantir a operação em 3,3 V VBUs. Caso contrário, o circuito bloquearia quando o VBUS cair abaixo do Thresholt, que é tipicamente 4 V - 4,7 V na saída de 3,3 V.
Esse problema foi resolvido um pouco demais. Utilizamos dois reguladores de 3,3 V que são orados por diodos ideais.
O TPS62932 está configurado para a saída 3,45 V. O UVLO é definido como 4,55 V e a ativação é definida como 5,06 V. Isso garante que o conversor de Buck opere acima de 5 V e saídas ligeiramente acima de 3,3 V, para que o LDO de 3,3 V seja desativado. O LDO é um NCV2951ACDMR2G definido como 3,3 V. A tensão de abandono é máxima de 450 mV a 100 mA. O consumo atual do circuito está abaixo de 50 mA, por isso teremos um abandono máximo estimado de 300 mV.
Quando a tensão de entrada está acima de 5,06 V, o LDO está inativo e o VCC é de 3,45 V. Quando a voltag de entrada cai abaixo de 4,55 V, o conversor Buck é desativado e o LDO leva ov, resultando em um VCC de 3,3 V.
A CPU operará mal para 2,7 V, dependendo das configurações de brownout.
O PCBA: 
Um protótipo funcional: 
Current Calibration
internal I.III A
reference I.III A
[i i i x] (i)
A leitura atual e o valor de referência foram reorganizados.
O SW foi reformado e agora é USB-PD2. No primeiro SW, o controle da fonte de alimentação foi implementado na classe de menu. Isso foi movido para sua própria classe de controlador.
Um cabeçalho para lembretes de TODO foi adicionado Uma classe de teste de fonte de alimentação foi adicionada às alterações do perfil de teste.
Para exibir o SW pela primeira vez, você precisará de uma interface de depuração JTAG, como
Você pode usar o Atmel Studio ou o Arduino IDE para exibir o Arduio Zero Bootloader.
Você também pode usar a demonstração do piscar. Selecione Sketch -> Exportar binário. O IDE criará um arquivo xxx.ino.with_bootloader.arduino_zero.bin. Basta piscar o arquivo. Pode ser necessário copiar os bits de fusíveis de um Arduino Zero.
Existem algumas amostras na pasta Fuses. Alguns dos fusíveis estão sintonizados na fábrica e não podem ser substituídos.
Depois que o carregador de inicialização funciona, você poderá piscar SW usando o SAM-BA Bootloader. O SW fornecido pelo Microchip possui uma CLI adequada para todos os dispositivos SAM que suporta o SAM-BA e, portanto, é um pouco complicado de usar. Uma ferramenta muito mais simples é a Bossa da Shumatech.
Meu carregador suporta 5 v / 9 v / 12 v / 15 v @ 3a e 20 v @ 5a perfis fixos e 3,3 V - 21 V @ 5 Um perfil aumentado. Cuidado, muitos carregadores marcados com 100W (até a Ugreen) suportam apenas 65 W PPs (3,25 a) com faixa de tensão limitada. Eles podem não suportar tensões abaixo de 3,3 V. Alguns terão até dois perfis de PPS com classificações de tensão / corrente de diferença.
Ugreen Nexode 2 Port 100W PD-Charger (modelo CD254 #50827) Perfis suportados:
Ugreen Nexode 100W Desktop Charger (modelo CD328 #90928) perfis suportados:
Anker Powerport I 30W PD
Perfis suportados:
Ilepo USB C Charger Fast 65 W
Perfis suportados
INIU Power Bank 20000mAh, 22,5W
Perfis suportados
Algum energia parece suplamente redefinir a energia quando nenhuma corrente é desenhada.
Meu "carregador de desktop de 100w de 100W" é redefinido P/N 90928 após ~ 1 h sem carga. Outros carregadores não.
Meu banco de energia INIU é redefinido sem carga dentro de ~ 10s
log com 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
...
log sem 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