1 Comentário

Digital Power com STM32F334 - Conversor Buck para controle de LED de alto brilho - Parte II

STM32F334 Conversor Buck

Olá caros leitores, como estão? Seguiremos neste artigo a série sobre conversão de energia digital com a placa STM32F334 Discovery fornecida pela STMicroelectronics. Nos primeiros dois artigos desvendamos as soluções para Digital Power fornecidas pela ST, assim falamos um pouco sobre o processador, bem como fizemos uma revisão de hardware da placa discovery. Agora iremos começar a parte realmente divertida, que é trazer os tradicionais (e analógicos) conversores estáticos de potência para o mundo do controle digital.

Neste artigo então vamos: 

  • Revisar o hardware para controle de LED de alto brilho da STM32F334 Discovery;
  • Modelar de forma simples o conversor para controle desse LED;
  • Configurar os periféricos específicos do microcontrolador STM32F334 (Timer de alta resolução e comparador);
  • Implementar uma aplicaçao de controle de brilho digital para LED de potência.

O Hardware para controle de LED de alto brilho

Uma das coisas que esse que vos escreve mais gosta na série das placas Discovery é o hardware onboard fornecido para que o usuário possa avaliar algum periférico específico dos processadores STM32. Com a placa STM32F334 Discovery que temos em mãos não é diferente, nela temos onboard, entre as características já revisadas no artigo anterior, um circuito para controlar um imponente LED de alto brilho de cor branca.

ATENÇÃO: Nunca olhe diretamente para o LED quando ele estiver em pleno funcionamento, pode causar desconforto e até danos permanentes na visão. O experimento aqui descrito poderá ser reproduzido pelo usuário assumindo ele o próprio risco em caso.

Na figura 1 abaixo temos em detalhe o circuito de controle de brilho:

STM32F334 Conversor Buck: controle de led
Figura 1 - Circuito controlador de brilho de LED.

Vejam que o circuito é bem simples em si, agora olhem atentamente e vão perceber algo interessante. Sim, o circuito em torno do LED LD7 possui todos os componentes do conhecido DC-DC tipo Buck, porém em posições modificadas. Apesar de parecer estranho à primeira observação, esse tipo de arranjo Buck é utilizado principalmente onde custo é um fator crítico, pois se nos recordarmos da topologia original, o MOSFET de acionamento localiza-se no chamado High-Side. Em que isso implica? Bem, se ele for um canal N se faz necessário adotar o circuito de um dispendioso (e caro) gate driver, além de toda a periferia necessária para operar o circuito. Agora, se a solução for a de utilizar um canal P, pode sair um pouco mais barato, exceto pelo fato do MOSFET P ser em média mais caro que um equivalente tipo N, além da necessidade de alguma periferia para correto acionamento dele.

Ao usar um circuito com a topologia inverted-buck, ganhamos no acionamento que pode ser um simples MOSFET N pelo low side, além de em nada modificar o comportamento do circuito. A única desvantagem aparente desse arranjo, é que a tensão de saída do conversor não é mais referenciada no GND da discovery, mas sim em relação ao nó que contém L2 e C27.

Bem, já nos atentamos ao conversor, ao LED, e os sinais de controle? Vejam que dada a natureza do arranjo, eliminamos qualquer necessidade imediata  de circuito para condicionamento de sinal. Assim o acionamento do MOSFET T3 é feito diretamente pela CPU da placa através do terminal PB12. O sensoriamento do circuito é realizado por R39. Esse pequeno resistor shunt captura a corrente de saída do conversor e passa por R37 e C26 que formam um filtro passa-baixas cuja função é limitar a reposta do circuito para algo em torno de 3MHz. Em seguida esse sinal é enviado (sim, sem amplificação) diretamente ao pino PB0 da CPU.

Modelando o conversor Buck para controle de corrente

Agora que já sabemos o hardware que temos em mãos, precisamos, antes de por qualquer coisa na CPU e fritar o LED, determinar alguns parâmetros de controle do pequeno Buck que vai atuar sobre nosso querido diodo. Antes de falar do conversor em si, leitores tomem nota: 

Bem, já sabemos o que nosso conversor vai controlar, vamos revisar rapidamente como funciona um conversor Buck. A figura abaixo mostra os dois possíveis estados de um conversor desse tipo:

STM32F334 Conversor Buck: Estados do conversor DC-DC tipo Buck
Figura 2 - Estados do conversor DC-DC tipo Buck

Como alguns já devem saber um conversor Buck produz em sua saída uma tensão mais baixa que a de entrada. Tomando as figuras 1 e 2 de base e com condições iniciais nulas, ou seja, L e C sem qualquer energia armazenada, quando o transistor principal é acionado,  o indutor é carregado progressivamente, armazenando essa energia até o instante dado por uma fração do periodo de chaveamento T. Ao término desse periodo o conversor troca de estado, nesse momento abrindo o MOSFET, a energia armazenada em no indutor L é transferida ao capacitor C através do diodo que agora encontra-se diretamente polarizado. E ao final do restante do periodo T, o ciclo se repete, porém o capacitor C1 agora carregado possui energia para alimentar a saída suficiente para aguardar nova transferência de energia ao final de uma nova fração de T. Ou seja, o valor dessa fração do periodo T em que o MOSFET é acionado (chamado não coicidentemente de ciclo ativo) é função da tensão de saída que aparece na carga (no nosso caso o LED).  

Dispensando modelagens desnecessárias, podemos escrever a função de transferência do ponto de vista de tensão do nosso conversor Buck:

Equacao 1 : Função de transferência buck
Equação 1.

Onde Vin e Vout são as tensões de entrada e saída respectivamente, e D é fração do período de chaveamento T em que o MOSFET permanece acionado. Vale lembrar que essa equação só é valida se o circuito buck estiver operando em modo contínuo, ou seja, o período de chaveamento T possui um valor tal que apenas parte da energia do indutor L é transferida para o capacitor C, ou seja, ela nunca chega a zero. Sabendo disso podemos obter duas equações úteis para calcular o valor do capacitor C e da indutância L. Mais um detalhe, vamos admitir componentes ideais para facilitar as contas:

Eq 2 : Indutor para conversor Buck
Equação 2.

Lembrando, esse valor para o indutor L é o valor mínimo para que o conversor opere em modo contínuo.

Eq 3 : Cálculo do capacitor para conversor Buck
Equação 3.

De posse dessas três equações podemos modelar um conversor DC-DC Buck para qualquer valor de tensão ou corrrente de forma genérica, e para casos críticos, os valores obtidos servem de ponto de partida para que possam ser ajustados de forma experimental. Porém tem um pequeno detalhe, o controle de LEDs de um modo geral se realiza por corrente e não por tensão, além do mais se observarmos novamente a figura 1 vamos ver que não existe qualquer forma de medir a tensão de saída do circuito da discovery. Porém podemos mensurar a corrente que passa em algum ponto do circuito, mais especificamente a corrente do indutor IL.

Com isso podemos aplicar uma estratégia de controle por corrente, conhecida por CMC (Current Mode Controller) em que a corrente que carrega o indutor é função da corrente que queremos que apareça na nossa carga. Assim precisamos determinar que função é essa, para isso vou recorrer ao método chamado de "Charge Balance" que pode ser melhor compreendido em aqui. Retomemos às leis de Kirchoff no capacitor de saída para os dois estados do conversor:

  • Para o instante de tempo t em que 0 < t < D.Ts
Equacao 4
Equacao 4.
  • Para o instante de tempo t em que D.Ts < t < Ts
Equação 5.
Equação 5.

O método Charge Balance faz uma estimação do conversor em estado estacionário, de forma simplista, para todo espaço de tempo t tendendo ao infinito a variação de corrente no capacitor tende a ser zero. Assim podemos proceder da seguinte forma:

Eq 6 : Charge balance final
Equacao 6.

Sim, é isso mesmo, a corrente do indutor é a mesma que circula na carga, de forma que se tomarmos seu valor conforme o hardware de medida provido na discovery, vamos poder regular o brilho do nosso LED. 

Periféricos especiais para digital power do STM32F334

Já sabemos o que controlar e como controlar, porém uma pergunta que povoa a cabeça do leitor neste momento pode ser a que isso já era possível fazer com o Arduino. Mas se lembrarmos do artigo em que experimentamos controlar um conversor Boost com ele iremos nos recordar que isso é feito às custas de muita CPU, principalmente para rodar a malha de controle para corrigir a tensão de saída na carga. 

É onde a linha de processadores para digital power da ST se sobressai até mesmo para uma aplicação simples como essa, dentre o conjunto poderoso de periféricos. Vamos explorar o timer de alta resolução para gerar o modulador de PWM, como o próprio nome já diz, a característica desse timer é sua altíssima resolução, de 217ps (sim, picossegundos!) para fins de comparação com esse timer é possível gerar um sinal de PWM com frequência próximas de  1MHz e granularidade de 12 bits, enquanto que com o Arduino, em máxima frequência de clock, é possível gerar apenas 78KHz com 8 bits de granularidade.

Outro grande diferencial desse timer é o seu crossbar, que pode acionar e desacionar as saídas PWM não só a partir dos eventos de comparação e quando o período expira, mas também pode vir de várias fontes externas, incluindo periféricos analógicos como o amplificador operacional e o comparador. Além disso o HRTIM possui até 10 canais de saída permitindo gerar as mais variadas combinações de  forma de onda para controle de motores por exemplo (não usaremos nessa aplicação, mas nas próximas...).

Além do HRTIM, esse processador traz no seu conjunto de periféricos até 3 comparadores analógicos. Para quem tem uma familiaridade com fontes chaveadas ou não, comparadores de tensão são extremamente úteis para implementar proteções, ou mesmo controle em modo de corrente (como o nosso controle de LED), o COMP4 (usado em nossa aplicação) possui tempo de resposta rápida da rodem de 30ns (sim, nanossegundos), além disso, ele é integrável ao HRTIM, de forma que seu evento de comparação possa ser enviado ao crossbar para processamento (sem intervenção da CPU). O COMP4 (assim como os outros) possui multiplexação das entradas de forma que podemos selecionar várias fontes, entre elas...

...o DAC, sim o conversor digital-analógico de dois canais on-chip, podendo gerar o valor de setpoint do brilho do LED, que pode ser comparado ao sinal de feedback de corrente presente em PB0 agindo como um amplificador de erro, que envia seu sinal para controlar um gerador de PWM, então...

...sim caro leitor, com esses três periféricos podemos criar uma engine de controle de brilho de LED em malha fechada sem qualquer intervenção da CPU, ficando essa livre para realizar outras tarefas. Vejam só a ideia, baseada neste application note, porém com algumas modificações do método original:

Hardware do processador que sera usado
Figura 3 - Hardware do processador que sera usado

Neste application note já existe uma aplicação de controle de dimming do LED na discovery. A aplicação aqui apresentada é uma derivação do método, removendo o uso do DMA para geração da compesação por rampa, uma vez que o nosso sistema raramente opera com o ciclo ativo acima de 50%, ela não se faz necessária. Além disso, utlizamos o HRTIM em modo continuo em uma frequência bem elevada, cerca de 250KHz, eis onde o HRTIM faz muita diferença pois podemos fazer um controlador bem "quieto" mas sem perder a granularidade de controle (em torno de 16mil passos!).

Aplicação, o firmware do controlador de brilho para LED

E finalmente chegamos à parte em que colocamos tudo junto, já sabemos o que vamos controlar, como devemos controlar e os recursos que temos para isso. O nosso firmware realiza uma sequência de passos muito simples uma vez que a principal complexidade está em configurar o hardware corretamente para que ele tome conta do controle enquanto o firmware interage com o usuário.

Para essa aplicação estou estreando minha instalação do OpenSTM32, uma IDE baseada em Eclipse voltada para os processadores da familia STM32, seu grande diferencial é o de ser de graça, e oferecer suporte a todas as linhas. Por enquanto existe apenas um port para Windows, mas já existe previsão de suporte em sistemas Linux e MAC no segundo semestre desse ano. Ela pode ser obtida aqui. E o projeto completo está aqui.

Falemos do firmware agora, utilizaremos de suporte o pacote de software fornecido pela STMicro para manipular os periféricos, a STDPeriph, que fornece em forma de APIs um jeito intuitivo de inicializar e comandar todos os periféricos da CPU da nossa placa. Apenas o HRTIM é configurado sem o uso dessa lib, dada as particularidades de operação. O único arquivo de usuário, main.c, pode ser visto abaixo.

As funções AFE_Init e HRTIM_Init são quem fazem todo o trabalho duro de configurar o hardware para operar em malha fechada. Em AFE_Init o comparador e DAC são configurados e roteados entre si. Dessa forma,  a entrada inversora do comparador enxerga o sinal analógico do DAC número 2, e a entrada não inversora é roteada para observar constantemente o pino PB0 que está conectado ao resistor shunt de medida de corrente.. HRTIM_Init é função mais hardcoded aqui, ela sobe as chamadas timer-unit, e seleciona a frequência de chamamento, que foi escolhida em torno de 250KHz utilizando as equações 2 e 3. Uma vez que os valores de capacitor e indutância são dados, chegamos a um valor que mantém o circuito operando em modo contínuo para que o modelo de análise via Charge Balance seja válido. Além disso o registrador CMP1 é inicializado com um valor correspondente à aplicação dos 350mA ao LED, ou seja, o valor máximo de brilho, garantindo que esse nunca será excedido. Após a configuração básica do gerador de PWM, essa função prepara o crossbar para que o modulador fique sensível a eventos externos gerado pelo nosso amplificador de erro formado por DAC e COMP4, ao final os periféricos são disparados e a engine roda sem intervenção da CPU.

O restante do firmware é trivial, como a discovery só possui 1 botão de usuário, foi criada uma máquina de estados para que o usuário possa aumentar ou decrescer o valor de brilho desejado entre o range das constantes DIMMING_MIN_VAL e DIMMING_MAX_VAL. E para fechar uma rotina de scanning do botão, controlada para ocorrer a cada 10ms com a ajuda do SystickTimer, ajuda a garantir interação do usuário livre do efeito de bounce.

Vamos ver o sisteminha em ação? E aá vai um vídeo da aplicação rodando, vejam que o canal 1 do osciloscópio com escala de 100mV por divisão está conectado em PB0, ou seja, onde está o feedback de corrente do circuito. Já o canal 2 com escala de 2V por divisão encontra-se em PB12 que é o sinal de PWM vindo do microcontrolador. Vejam que legal!

[wpfilebase tag=fileurl path='posts/STM32F334-Conversor-Buck.mov' linktext='Video : Aplicação de controle de brilho em ação.' /]

E então caro leitor, o que achou? Seria interessante substituir um complexo e caro controle analógico por uma CPU que pode dar conta de controlar seu próximo projeto de iluminação LED? Além disso, seria legal deixar os periféricos da CPU tomar conta de controlar de forma precisa e robusta seu circuito de iluminação, enquanto que a CPU propriamente dita tome conta de tarefas de comunicação ou mesmo de cálculos de efeitos complexos uma vez que 72MHz com o set SIMD e a FPU fazem do STM32F334 um verdadeiro canhãozinho para construção de dispositivos de iluminação LED inteligente e robusta.

Espero que tenham gostado desse nosso primeiro experimento, e que este seja útil nos seus projetos. Na próxima parte do artigo, antes de seguirmos para o complexo buck-boost bidirecional onboard, vamos aproveitar o poderoso HRTIM na sua máxima capacidade e sintetizar algumas formas de onda com o filtro passa-baixas que vem embarcado na discovery.

Então é isso, até a próxima!

Série "Digital Power com STM32F334"

Referências

Manual de hardware da placa discovery STM32F334

ERICKSON, W. Robert - Fundamentals of Power Electronics , 2001

AN4885 - High brightness LED dimming using the STM32F334 Discovery kit

OpenSTM32 - System Workbench for STM32

Projeto de firmware do controlador de brilho

Figura 1 - Fonte: Manual de hardware da placa STM32F334 Discovery

Outros artigos da série

<< Introdução a Digital Power com os processadores STM32F334 - Parte IDigital Power com STM32F334 - Conversor Boost Síncrono - Parte III >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Digital Power com STM32F334 - Conversor Buck para controle de LED de alto brilho - Parte II
Talvez você goste:
Comentários:

1
Deixe um comentário

avatar
1 Comentários
0 Respostas
0 Seguidores
 
Discussão de maior alcance
Discussão mais quente
1 Autores de comentários
Rafael Gebert Comentários recentes
  Notificações  
recentes antigos mais votados
Notificar
Rafael Gebert
Visitante
Rafael Gebert

Muito bom o artigo Felipe! Texto com linguagem clara e direta.... Ainda com link do código fonte e com o application do fabricante. Se todos os artigos/posts na internet fossem dessa forma ninguém passaria trabalho 😉

Séries



Outros da Série

Menu