19 Comentários

Utilizando microcontroladores para controle de conversor DC-DC personalizado – Parte 2

conversor DC-DC personalizado
Este post faz parte da série Utilizando microcontroladores para controle de conversor DC-DC personalizado. Leia também os outros posts da série:

Olá caros leitores, vamos à segunda parte dessa série de artigos que trata da utilização de microcontroladores para implementar conversor DC-DC. No artigo anterior, falamos de aspectos gerais para uso de um processador digital para controlar uma fonte chaveada baseada em um conversor deles. Além disso, exemplificamos um conversor Buck.

Agora que sabemos, de um modo geral, o que precisamos para controlar um “powertrain” desses, vamos fechar essa série fazendo uma implementação prática.

Quer dizer projetar uma fonte chaveada, ainda que simples? Sim! E melhor, uma fonte chaveada simples porém com tensão de saída ajustável.

Uma das coisas que mais atrai este que vos escreve é desenvolver projetos que possam ser reproduzidos, usando componentes fáceis de achar e de montar. Partindo dessa premissa a minha primeira busca foi pensar em qual microcontrolador seria interessante para demonstrar sua capacidade controlando e atuando sobre um conversor DC-DC? Uma placa que todo mundo use? Sim, Arduino. Confesso que estava há muito tempo sem mexer em um, e também desabituado a programar em C++, mas a ideia de que qualquer pessoa possa reproduzir o setup de teste (ou até fazer um shield)  me chamou a atenção.

Então, vamos projetar uma simples fonte chaveada controlada digitalmente (sim, tem um PID digital, mas já falaremos mais sobre ele) por um Arduino, utilizando o ecossistema nativo de desenvolvimento dele e em C++ para provar que é possível, mas antes, um pouco de teoria.

Conversores Boost

Você leitor deve estar se perguntando: “Mas Felipe, você exemplificou o conversor buck no artigo anterior”. Concordo com você, mas convenhamos um step-down provê uma tensão de saída igual ou menor que a entrada, logo temos uma centena de circuitos que faz o mesmo, o conversor boost pelo contrário é bem mais interessante de se demonstrar, pois realiza o contrário, ou seja, eleva a tensão de saída a partir da entrada. Além disso um step-up é um circuito que costuma ser uma necessidade, uma vez que elevadores baseados em capacitores e diodos fornecem pouca potência ainda mais comparado com um boost. Logo, se você precisa daquela alta tensão para usar de alimentação de um circuito de gate-driver, mas só tem uma simples fonte de 5V disponível, esse circuito é pra você.

Como já citado, um circuito conversor boost fornece uma tensão de saída igual ou maior que a tensão de entrada, seu circuito pode ser demonstrado na figura abaixo.

Figura 1 : Circuito básico step-up
Figura 1 : Circuito básico step-up

Descrever a operação detalhada de um conversor DC-DC boost, está fora do escopo desse artigo, porém vamos revisar seu princípio básico de operação em modo contínuo de condução. Para isso, vamos admitir que o circuito esteja em uma condição inicial em que C1 possua uma tensão inicial VCi, por L1 passe uma corrente inicial ILi, e que o transistor Q1 (comutado por um sinal quadrado, simétrico, e com período ts) esteja em condução no início do período ts. Nesse momento, D1 encontra-se em corte logo podemos considerar que a malha formada por: Vg (bateria), L1, Q1, está isolada do restante do circuito, a corrente em L1 aumenta quase-linearmente carregando, ao passo em que temos idealmente (desconsiderando as perdas no MOSFET Q1)  Vg//L1, logo a tensão em Vg e a tensão VL1 são iguais. Analisemos agora a malha formada por C1 e R1 (que equivale à carga), nesse momento a tensão VCi presente no capacitor é a mesma que aparece na saída do conversor, ou seja, em R1. O capacitor então fica responsável por suprir energia ao conversor enquanto L1 é carregado via Q1. Ao chegar na metade do período ts, a situação muda e com isso Q1 é cortado, assim D1 conduz e conecta L1 e Vg ao restante do circuito. No momento em que Q1 comuta, o indutor L1 transfere a energia acumulada ao capacitor C1 carregando-o,  com a parcela da tensão VL gerada, porém nesse mesmo momento além da tensão VL, temos no mesmo sentido, a tensão do gerador Vg. Para quem gosta de circuitos elétricos, ao observar essa condição, fica fácil perceber que a tensão com a qual se carrega C1 é maior que a tensão da bateria Vg, e assim encerra – se o ciclo e um novo começa.

Para o leitor mais atento, é fácil perceber que a tensão VL do indutor L1 que se somará a Vg quando Q1 estiver em corte será maior (até o nível de saturação do núcleo) à medida que mais energia seja armazenada no estado de condução de Q1 para um mesmo período ts, estamos então falando de um trivial gerador de PWM que qualquer microcontrolador de baixo custo hoje possui, incluindo a maioria das placas Arduino. Para finalizar nossa breve explicação, e dispensando a modelagem matemática, o formulário relevante para o projeto de um conversor DC-DC boost em modo contínuo de condução pode ser aproximado por: 

BoostBaseEq1

Um belo formulário, sem dúvida, mas vale lembrar que esses modelos são muito bons como ponto de partida para projetar um conversor Boost, uma abordagem mais completa pode ser encontrado em [1].

O Controle digital

Sabemos o que é um conversor boost , porém a teoria acima explicada é perfeita para operação em malha aberta, agora imagine que um valor de D foi escolhido para determinar a tensão de saída dado um valor de R1, agora vamos pensar que num dado momento R1 seja substituído por outro resistor com valor R2. Oras, se esse novo valor for menor e temos D fixo, o capacitor C1 vai transferir menos energia do que L1 transfere a ele o que na prática implica num aumento de tensão até que uma nova condição de equilíbrio ocorra (ou o circuito pare de funcionar). De forma análoga, se R2 for menor que R1, C1 terá que transferir mais energia do que L1 consegue transferir a ele, o que geraria um decaimento da tensão de saída. O mesmo problema ocorre para variações na tensão de entrada, logo a operação em malha aberta é perfeita para condições invariáveis, mas sabemos que por se tratar de uma fonte a mesma precisa operar com tensão constante a diferentes níveis de carga e tensão de entrada, e no nosso caso a situação é ainda pior pois queremos que a tensão de saída seja ajustável, é quando entra o papel de uma parte importante de toda fonte chaveada, o circuito de controle.

Para uma fonte com controle analógico, a topologia de um circuito dedicado de controle é a mesma usada em outros circuitos: um elemento sensor, um amplificador de erro com um compensador e um sistema de atuação, nesse caso um gerador de PWM. O popular circuito integrado MC34063 [3] é uma solução de baixo custo para projetar uma fonte boost, seu diagrama pode ser apreciado na figura abaixo:

Figura 2 : Esquemático interno MC34063

Esse controlador é um dos mais simples disponível no mercado  e conta com os já citados blocos. O comparador na verdade contém o amplificador de erro em conjunto com o compensador, veja que o set-point é fixo através de uma tensão de referência interna de 1.25V, logo ajustar a tensão de saída de uma fonte com esse integrado envolve recalcular o divisor resistivo denotado por R1 e R2. O atuador, gerador de PWM, é composto de dois blocos, um oscilador e um latch, e seu ciclo-ativo é ajustado de acordo com o sinal resultante da malha de compensação, para mais informações sobre esse integrado o leitor pode consultar seu datasheet. A figura 3 exibe uma aplicação de uma fonte boost usando esse integrado:

conversor-DC-DC-BOOST
Figura 3: Fonte boost com o MC34063

Como já dissemos no primeiro artigo, usar um integrado dedicado é uma solução para a construção de uma fonte dessas. Porém substituir o controle analógico por um processador digital nos permite sofisticar na construção da fonte, podemos selecionar a frequência de chaveamento, utilizar algoritmos de controle otimizados e mais, tudo isso apenas reprogramando o processador.

Como já citado anteriormente, vamos utilizar uma das queridas pela comunidade maker, as placas Arduino, no caso a variante Arduino Mega (escolhi ela apenas por ser o que tinha em bancada, mas outras placas mais simples podem ser utilizadas). O interessante é que o pequeno processador AVR de 8 bits se mostrou mais que suficiente para realizar essa tarefa, assim vejamos quais recursos vamos precisar para nosso controlador digital, a figura 4 exibe o diagrama de blocos do controlador digital.

Figura 4: Diagrama do controlador digital
Figura 4: Diagrama do controlador digital

O diagrama está bem simplificado (o esquema elétrico também é, não se preocupem) com os blocos mais importantes. Para observar o que ocorre no circuito boost, o Arduino precisa digitalizar o sinal presente no elo de realimentação, para essa tarefa seu conversor A/D é utilizado. O valor desejado (set-point) pode ser ajustado manualmente no código, ou utilizar o mesmo conversor A/D em amostragens intercaladas. Em seguida a CPU AVR será responsável pelo processo, calculando a diferença entre o valor desejado e o corrente, e aplicará digitalmente um compensador tipo-II, basicamente um PI (foi adicionado uma ligeira ação derivativa para melhoria no tratamento de overshoots), ainda o processador de posse do resultado realizará dois processos: o de saturação e o de escala. O atuador para um conversor boost será um gerador de PWM, facilmente configurado no Arduino. Implicitamente, existe um segundo temporizador (atrelado à taxa de amostragem do sistema) que é responsável por aplicar a ação de controle de forma periódica sendo útil caso algum método analítico de ajuste do compensador seja utilizado.

Projeto da fonte

Agora que já falamos sobre o conversor, e sobre nosso controle, vamos às especificações da fonte desejada:

  • Tensão de entrada : 5 [V] com tolerância de +/-20%;
  • Tensao de saída: Ajustável de 5 a 24 [V];
  • Potência de saída: 15 [W];
  • Frequência de chaveamento: 50 [KHz];
  • Ajuste da tensão de saída: por trimpot ou potenciômetro.

As especificações foram escolhidas para que seja uma fonte de uso geral, mas que atenda às necessidades de gerar tensões mais altas através de uma simples fonte de 5V (como essas de protoboard). Pode gerar localmente a alimentação de pequenos motores, ou sinais de comunicação no padrão 0 – 10 [V]. A frequência de chaveamento foi escolhida de forma a minimizar o valor do indutor, e ao mesmo tempo prover uma razoável resolução do gerador de PWM do Arduino. Com esse valor, a uma frequência de clock de 16MHz, consegue – se uma resolução de 8 bits. A seguir formulário para cálculo de resolução:

ResoluçãoPWM

Utilizando as equações básicas do conversor boost ajustei um pouco o modelo, afim de minimizar o valor de indutância. O chaveador escolhido foi um MOSFET variante IRLZ44N. Esse transistor possui uma capacidade de corrente de mais de 40A e baixo RDSon. Sua principal vantagem é que pode ser levado à saturação com baixo valor de tensão de gate, sendo então diretamente acionado pelo Arduino, dispensando um caro e chato gate-driver. Ufront-end minimo foi colocado entre o Arduino e o MOSFET para limitação de corrente. O Ajuste da fonte pode ser efetuado diretamente na entrada analógica A0 no Arduino, para exemplificar optei por um trimpot multivoltas.

O Esquema elétrico completo da fonte é visto na figura 5 abaixo:

Figura 5: Esquema elétrico da fonte boost
Figura 5: Esquema elétrico da fonte boost

Realmente, completo e simples. Veja que o circuito além do conversor, possui apenas a rede de feedback, responsável por realimentar o Arduino com o estado corrente, e o sinal de controle com uma rede de resistores para limitar a corrente RMS que aparece no sinal PWM, e um resistor (R3) para forçar o MOSFET em corte no caso de desconexão do Arduino.

Firmware de controle

Além do projeto do conversor, desenvolver o  firmware de aplicação foi desafiador, pois estou desde 2011 sem fazer uma única linha de código em C++, foi bom para desenferrujar e aproveitar as capacidades da linguagem, a mais usada para desenvolvimento no Arduino. Para realizar a abstração de hardware e ainda obter uma agradável surpresa, criar classes de compensadores é muito mais simples e funcional do que descrever um conjunto de structs. Porém nem tudo foi fácil, o acesso abstraído ao hardware do AVR fornecido pela IDE do Arduino não atendia aos requerimentos de tempo e desempenho que necessitava, algo esperado por ainda que simples, se tratar de um sistema de controle de tempo real.

Assim a primeira tarefa é prover um arquivo de abstração de hardware, mas que o opere com o desempenho necessário para atuar no conversor, assim o leitor que abrir os arquivos hal.cpp/.h irá encontrar classes de objetos para instanciar o conversor A/D em modo de alta velocidade garantindo 50000 amostras por segundo. O gerador de PWM configurado na sua forma mais poderosa, sem prescaler e com resolução máxima de 16 bits, além de uma classe para instanciar os timers 0 e 2 como geradores de tick. A interrupção é abstraída do usuário não sendo necessário mexer com os vetores do processador, assim temos um gerador periódico do eventos para executar a malha de controle com precisão, além da leitura do setpoint a uma taxa fixa de 200Hz.

Configurado o hardware Arduino, os blocos elementares de um conversor boost estão prontos para operar, ficando o maior esforço de firmware em implementar o compensador. Como já citado trata-se de um tipo-II que nada mais é do que um proporcional-integral. Dada a simplicidade do circuito e a CPU do Arduino, foi usada a conhecida aproximação retangular de primeira ordem, e os cálculos utilizam o formato numérico fracionário afim de evitar overflow das sucessivas multiplicações realizadas. Um esqueleto de um objeto completo do conversor esta feito bastando ser implementado. Todas essas definições podem ser encontradas em digitalboost.cpp/.h.

Com esses dois arquivos basicamente qualquer tipo de conversor pode ser criado, assim a aplicação principal simplesmente instancia os objetos de hardware, inicializa um compensador e lê o valor de tensão desejado pelo usuário. A cada 5Hz imprime os valores da tensão setada e da tensão lida pelo conversor. A aplicação de firmware  pode ser vista abaixo:

Bem simples não?

Resultados

Essa é a parte que me surpreendeu, pois resumindo as minhas análises o Arduino deu conta do recado ele corrige o valor da tensão de saída com maestria, seja variando o setpoint ou sofrendo uma perturbação do sistema (variação da tensão de entrada). A seguir vamos ver algumas imagens. A Figura 6 exibe a “aranha” que montei em bancada:

Figura 6: Protótipo em teste
Figura 6: Protótipo em teste

Não ficou lá dos mais bonitos, mas acho que a intenção era exatamente essa, montar um conversor DC-DC digital, com o que se encontra em casa. Apenas o powertrain do conversor não teve outra solução senão montar uma placa, dada o valor de corrente que percorre nesses componentes.

Vejamos agora nosso boost “Arduinado” em ação. As figuras 7, 8 e 9 exibem a tensão de entrada de 5 Volts para uma tensão de saída solicitada de 12V, 15V e 24V.

Figura 7: Conversor em equilibrio
Figura 8: Conversor em equilibrio
Figura 9: Conversor em equilibrio

Ao leitor atento, peço que dê uma olhada no valor da componente AC presente no sinal, que é mínimo, além do valor de ripple terceira linha de medidas, lembrando que o teste da fonte em equilíbrio foi feita com ela a plena carga. Agora vamos mostrar algumas formas de onda do nosso conversor a 10V. A figura  10 exibe a saída para 10V.

Figura 10: Waveform da tensão de saída em equilíbrio

Vejamos agora uma resposta em degrau dessa fonte na figura 11, o traço azul corresponde ao sinal de saída da fonte enquanto que o laranja é o valor de degrau gerado pelo usuário.

Figura 11: Resposta em degrau da fonte

Percebam, que a fonte corrige rapidamente a variação e o tempo de zona morta é mínimo. Além disso a porcentagem de sobressinal é inferior a 10% do valor desejado. Uma das coisas mais interessantes nesse tipo de teste é a possibilidade de ver com detalhes a malha de controle buscando o valor desejado pelo usuário, bem como suas etapas. Dica: esse teste pode ser utilizado para melhorias no ajuste do compensador, eu realizei um ajuste baseado no conhecido método Ziegler-Nichols.

Além dos gráficos, o que me surpreendeu foi a “elasticidade” dessa fonte. Em média a fonte pode sofrer uma variação de 2,50V para mais ou para menos em relação aos 5V centrais que a tensão de saída se mantém constantes, isso é equivalente a uma faixa de variação de 50% do nominal. Além disso a fonte mostrou uma boa regulação de linha (deixo o teste da regulação de carga para o leitor), cerca de 40mV para cada 1V variado na entrada um excelente resultado para uma fonte controlada por um microcontrolador que muita gente fala que é de “brinquedo”.

Conclusão

Nessa pequena série, queríamos mostrar que microcontroladores podem ser utilizados até em campos poucos discutidos por quem desenvolve firmware, como por exemplo, o projeto de fontes que sempre foi algo que ficava a cargo de um integrado dedicado, com pouco ou nenhum acesso para personalização por parte do desenvolvedor. Porém também demonstramos o quanto eletrônica e software podem andar de mãos dadas a ponto de simplificar solução para um problema, no caso utilizar um microcontrolador (e diga – se de passagem, qualquer um) para atuar e configurar um conversor de energia estático, e que essa tarefa não se restringe apenas a topologias complexas munidas de DSP, mas também pode ser realizado na forma mais simples e por pessoas comuns como nós, que enfrentamos desafios diários de como aproximar engenharia e programação. Além disso é gratificante transformar uma plataforma de desenvolvimento tão utilizada pela comunidade em uma resposta para um desafio tido como complexo ou que necessite de mais poder de processamento. Os arquivos aqui desenvolvidos podem ser acessados aqui. O projeto foi desenvolvido utilizando o Atmel Studio com o plugin do Arduino IDE, mas pode ser facilmente portado para a IDE específica do Arduino sem menores problemas. Espero que tenham gostado da série e vamos discutir sobre outras topologias e até onde o Arduino poderia aguentar com controle digital de tempo real. É isso caros leitores, até a próxima.

Referências

RASHID, H. Muhammad – Power Electronics: Circuits, Devices & Applications – Prentice Hall – 2013 – http://www.amazon.com/Power-Electronics-Circuits-Devices-Applications/dp/0133125904

Outros artigos da série

<< Utilizando microcontroladores para controle de conversor DC-DC personalizado – Parte 1
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.

Arduino » Utilizando microcontroladores para controle de conversor DC-DC personalizado - Parte 2
Comentários:
Notificações
Notificar
guest
19 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Edgar Santos Pereira Pinto Mar
Edgar Santos Pereira Pinto Mar
17/02/2016 22:21

Felipe, muito bom. Gostaria de tirar apenas algumas dúvidas com você, pois estou implementando algo parecido.
1) que tipo de indutor você utilizou? Não consigo identificar na foto..
2) no circuito “front-end” da saída do Arduíno, o resistor de 100R é um limitador de corrente e o de 10K um pull down?

Desde já agradeço. Um abraço

Caio Evangelista
Caio Evangelista
23/04/2015 02:54

Ola Felipe, gostei muito do seu trabalho e a algum tempo vinha pensando se poderia por em prática um boost com o Arduíno. Eu queria montar um carregador utilizando este método, sabe se consigo tbm controlar a corrente? Por exemplo eu estava pensando em fazer um carregador meio que universal onde pudesse controlar a tensão e a corrente! Não tenho muito conhecimento em c++ e voce disse que poderia facilmente ser portado para a IDE do Arduíno correto? Se sim como poderia estar fazendo isso? Grato desde já!

Weslley M. da Mata
Weslley Mata
19/04/2015 22:48

Ola Felipe, esse circuito e esta configuração do atmega328 é para um microcontrolador a 16MHZ e alimentação de 5V?poderia utilizar o atmega328 a 8MHZ?pois assim eu poderia diminuir a tensao a 3V..Muito obrigado e parabéns pelo post,este é um belo exemplo de que podemos ler mais o datasheet e usufluir ainda mais destes pequenos micro.

Felipe Neves
Felipe Neves
Reply to  Weslley Mata
21/04/2015 21:35

Olá Weslley, obrigado pelo feedback. Respondendo suas perguntas, sobre a configuração é isso mesmo, 16MHz e 5V de alimentação, repare que os timers usam de base a frequencia de clock de 16MHz (so que especificado em Hz). Sobre usar a 8MHz sim, claro que pode, apenas atente-se que na hora de instanciar os times (PWM e Tick) voce deve passar a frequencia de 8000000Hz em vez do que está atualmente. O Arduino é sem dúvidas uma ferramenta muito poderosa, mas mais desempenho pode ser obtido estudando o basico da CPU que é um AVR 8bits. Espero que seja útil em… Leia mais »

Israel Santos
Israel Santos
06/06/2017 14:12

Amigo você tem o projeto do conversor buck-boost?

Felipe Barreto
Felipe Barreto
10/05/2017 12:33

Amigo, show de bola este artigo e seu projeto. Sou acadêmico de Engenharia Elétruica na UESC – Universidade Estadual de Santa Cruz, e pretendo montar um conversor DC-DC semelhante. Você teria um esquemático da parte elétrica mais detalhado?

Rhonei Patric
Rhonei Patric
26/09/2016 10:29

Como eu consigo gerar o sinal de PWM a 20kHz com o arduino ? Para controlar a chave mosfet?

Rhonei Patric
Rhonei Patric
15/09/2016 22:23

Boa noite, estou fazendo um trabalho com controle do conversor buck, estou aquisicionando a saída do conversor com o arduino através das entradas analógicas e realizando o controle no simulink através da arduino i/o library. Meu conversor está trabalhando com uma frequência de chaveamento de 20kHz, tenho dúvidas sobre o valor de sample time que devo colocar nos blocos do analog read e do analog write no simulink

Carlos Alberto Da Costa Pinto Neto
Carlos Alberto Neto
06/08/2016 15:44

A mateira é legal, mais tem imagens quebras tambem

Pedro Hassan
Pedro Hassan
21/05/2016 12:20

olá felipe, boa tarde. Se possível queria tirar uma duvida, as bibliotecas que você usou são essas mesmas indicadas na conclusão da sua publicação? pois estou usando esses arquivos indicados e quando compilo no ide do arduino ele dá erro diz que algumas variáveis da biblioteca hal.cpp não estão sendo declaradas, eu abro o codigo desta biblioteca e realmente vejo que esssas variaveis não estão sendo declaradas, as variáveis são essas: DDRF DDRK MUX5 DDRE DDRG DDRH DDRL obs: ja tentei editar o codigo da biblioteca declarando essas variáveis junto com as outras, mas sem sucesso. Você poderia me dar… Leia mais »

Rubem Pacelli
Rubem Pacelli
01/05/2016 03:18

Queria conseguir verbalizar o que esse post foi pra mim. Sou engenheiro Eletrônico em formação, na Unifor. Sou apaixonado por assuntos que o meu curso trás, mas principalmente nas área de controle, telecomunicação, processamento digital de sinais e eletrônica de potência (este ultimo, posso falar que é a área que eu sou mais fraco em relação as outras). Na cadeira de Eletrônica de Potência me apaixonei pelo o assunto de fontes chaveadas, devido a enorme utilidade, eficiência e complexidade. Estava louco atrás de um projeto que não fosse demasiadamente complexo pra fazer nessa cadeira, e achei!! Esse projeto é sem… Leia mais »

Felipe Neves
Felipe Neves
Reply to  Rubem Pacelli
02/05/2016 16:03

Rubem, fico muito feliz em saber que o artigo não só serviu como solução, mas também me alegro em saber que ele te ajudou a ter novas visões sobre o mundo da eletronica de potência e espantar o receio que as pessoas costumam ter quanto combinamos três áreas da engenharia tidas como dificeis ou massantes. Sobre o fato do Arduino fazer a parte grossa do processamento, creio que pelo codigo estar em C++ seja de visualização mas complicada, no entanto aqui no embarcados tive a oportunidade de publicar uma série de Digital power com 5 artigos em níveis incrementais, onde… Leia mais »

Talvez você goste:

Séries



Outros da Série

Menu

WEBINAR
 
Porque o RTOS não faz o que eu quero?

Data: 28/10 às 19:30h - Apoio: Mouser Electronics
 
INSCREVA-SE AGORA »



 
close-link