Nenhum comentário

Digital Power com STM32F334 - Firmware do Conversor Boost Síncrono Closed Loop - Parte final

Olá caro leitor, primeiramente esse que vos escreve lhe deseja um excelente 2016. E como primeiro artigo do ano, iremos fechar a nossa pequena série de introdução a controle digital de potência baseada na placa de desenvolvimento STMDiscoveryF334. Assim gostaria de agradecer a STMicroelectronics por ter cedido uma unidade da placa para que pudêssemos explorar conceitos tão interessantes desse belo microcontrolador voltado para controle de energia. No artigo anterior, implementamos o firmware do conversor boost síncrono, usando a infraestrutura fornecida na placa, porém sem qualquer tipo de realimentação envolvida, de forma que o usuário variava a tensão através de um dos botões da placa, e o firmware atuaria no conversor a partir de cálculos utilizados para determinar o regime estacionário do conversor.

A importancia de fechar a malha de controle

Fato, é que o firmware apresentado no artigo anterior possui muito mais utilidade na modelagem inicial do conversor para cálculo dos componentes do que uso em uma aplicação real de digital power. Isso porque a atuação do firmware sobre a infraestrutura do conversor não é periódica e muito menos recorrente, ou seja, se o usuário quiser uma determinada tensão de saída o firmware vai se ajustar no momento em que ele pressionar o botão. Entretanto, se variarmos a carga, ou a tensão de entrada por exemplo, aparecerá um erro entre a tensão selecionada e a real na saída, que nunca será corrigido, apenas com uma nova interferência do usuário. Isso porque o firmware consegue atuar sobre o conversor, mas não "enxerga" o que está de fato ocorrendo em sua saída e fica impedido de tomar qualquer ação caso haja alguma perturbação da condição escolhida no set point.

Fechar a malha de controle tem exatamente esse propósito. Utilizando o ponto de medida de tensão de saída podemos levar essa informação ao microcontrolador, de forma que ele entenda o que está ocorrendo. Como a saída está variando, podendo assim ser programado para atuar periodicamente sobre o conversor e corrigindo eventuais pertubações na condição de set point desejada. Vamos dar novamente mais uma olhada no esquema elétrico dessa seção para localizar o ponto de medida desejado.

Conversor Boost Síncrono Closed Loop: Esquema elétrico do boost sincrono da placa discovery
Figura 1 : Esquema elétrico do boost sincrono da placa discovery

Vamos observar o canto superior direito da Figura 1, próximo ao conector de saída CN3. Temos um divisor resistivo formado pelos componentes R52 e R46, e sua saída é enviada para o microcontrolador através do terminal PA3, fornecendo o valor da tensão de saída escalada pela razão entre R52 e R46. Assim agora o microcontrolador já consegue saber o que está acontecendo no conversor e com que intensidade.

O conceito de digital power no conversor síncrono

Como vimos em posts anteriores, o conceito de digital power consiste em substituir a infraestrutura responsável pelo controle de conversores que são tradicionalmente analógicos ou circuitos híbridos discretos, por uma unidade de processamento digital que consiga reproduzir a estratégia de controle, com ganhos de espaço, flexibilidade e uso de algoritmos de controle avançados. No caso do nosso conversor a parte de digital power estava semipronta, pois a unidade de processamento (o microcontrolador) já atuava sobre o conversor e agora já enxerga o que ocorre na saída. Porém ainda falta um elemento para completar a cadeia de controle digital, a figura abaixo nos ajuda a entender o que.

Conversor Boost Síncrono Closed Loop: Controle tradicional x controle digital
Figura 2 : Controle tradicional x controle digital

Olhando para a figura inferior que contém um controle completo baseado em digital power, e lembrando dos posts anteriores, fica óbvio saber que o elemento faltante é o compensador, representado pelo bloco PID Filter. A importância desse bloco é justamente executar a estratégia de controle para qual a fonte foi projetada, ou seja, se buscar as condições do set point a partir da diferença entre esse e a saída medida é o fator principal de fechar a malha. Adicionando um compensador colocamos um elemento que vai acelerar essa busca com o mínimo de stress possível imposto ao conversor durante uma pertubação de carga ou na tensão de saída, e esse elemento foi adicionado ao novo firmware.

As modificações no firmware

O firmware modificado pode ser acessado através deste repositório no github, que é basicamente o mesmo do artigo anterior, sendo a base exatamente a mesma, apenas realizei nela alterações necessárias para que o mesmo consiga operar em malha fechada. Além disso a aplicação principal mudou um pouco de perspectiva. No firmware do post anterior, utilizávamos um botão para variar a tensão de saída do conversor. Na versão malha fechada, a interface com o usuário é mais rebuscada, podendo ele conectar um potenciômetro no terminal PA7 (que fica na barra de pinos principal à esquerda na placa) ou um gerador de funções e realmente entrar com valores de tensão. Isso se fez importante para podermos mostrar comportamentos legais do conversor como a resposta a degrau, ou seja, a resposta do conversor a uma variação do set point.

Em boost.c e boost.h, pouca coisa mudou, pois na versão do firmware anterior eles já estavam preparados para rodar como malha fechada (ok, precisei arrumar alguns bugs na rotina do PID Filter), bastando modificar a definição BOOST_CTL_TYPE para 1 em boost.h permitindo a compilação de trechos de código necessários à operação em malha fechada.

Veremos ainda um terceiro arquivo, dpl.S que já existia mas não era adicionado ao firmware pois em malha aberta ele ficava desabilitado. Esse arquivo contém o código em assembly do PID Filter chamado periodicamente como parte da estratégia de controle. O assembly foi escolhido pois essa rotina é chamada dentro de uma interrupção tendo que ser o mais leve possível em termos de overhead, além disso o compilador GNU-ARM não parece ser muito fã de usar o set de instruções DSP do core ARM Cortex-M4, mesmo otimizando o código. Por outro lado o PID Filter final ficou tão enxuto que permitiu o uso das instruções da FPU de forma que o controlador foi feito todo em ponto flutuante.

A estratégia de controle funciona de forma simples, mas bem definida, síncrona e independente do resto do sistema. O HRTIM foi ligeiramente reprogramado de forma que agora ele dispare uma interrupção periódica com tempo igual ao seu período de repetição, dentro da ISR. O mesmo dispara a conversão A/D que também irá gerar uma interrupção, capturando o valor da tensão de saída e a colocando dentro do PID Filter, que calcula quanto de ciclo ativo o conversor deve adicionar ou retirar. O valor é saturado e remapeado para ponto fixo, e colocado no registrador de ciclo ativo do HRTIM que comanda os transistores do conversor implementando a chamada compensação ciclo-a-ciclo, muito similar a obtida (só que por hardware) no firmware de controle do LED de alto brilho usado em posts anteriores.

Assim, chegamos no diagrama de blocos abaixo que representa a execução dos módulos, repare que entre o controle de tempo real, e o de usuário não existe dependência, eles rodam em separado, ao passo que a prioridade de execução é do controle de tempo real do conversor.

Conversor Boost Síncrono Closed Loop: Firmware do boost converter simplificado
Figura 3 : Firmware do boost converter simplificado

O diagrama de blocos da esquerda representa o chamado "background loop", ou seja, esse é o pedaço reservado da CPU para executar tarefas lentas ou tarefas que não necessitem de um exato ciclo de execução da CPU para completar sua execução, que é o caso da interação com o usuário. A tarefa principal tem por função monitorar o terminal PA7, e capturar a tensão que aparece ali (que pode ser um potenciômetro por exemplo, ou um gerador de função). O valor é escalado para o range do conversor boost, que é entre Vin (configurado por software) e 15,0 V (também configurado por software). Em seguida esse valor é enviado para a malha de controle através de uma função do módulo do conversor. Já o diagrama da direita representa a tarefa de tempo real dessa aplicação, ou seja, que possui execução periódica e executa sempre na mesma quantidade de tempo e que sua interrupção pode ocasionar falha no sistema, por isso sua prioridade é elevada e qualquer dependência do background loop deve ser minimizada ou cortada. Aqui, para conseguir uma base de tempo livre do efeito de Jitter (execução em diferentes pontos dá área de amostragem do sistema), amarramos o gerador de PWM de alta resolução do microcontrolador (pra quem tiver dúvidas sobre seu funcionamento, sugiro que leiam o artigo introdutório da placa discovery, e o primeiro artigo desta série) de forma que a cada ciclo de PWM ocorrido uma interrupção é gerada logo no seu inicio. Assim, obtemos a tensão corrente na saída, e de posse do valor desejado enviamos esses valores ao algoritmo de controle, que nos devolverá quanto devemos atuar sobre o PWM no próximo ciclo de atuação. Além disso a estratégia de controle conta com mecanismo de saturação e escala de valor para o range de PWM, prevenindo estouros ou problemas de wind-up no controlador PID. Ao final, o registrador do PWM é atualizado realizando fisicamente a correção da tensão de saída. Simples não?

O ajuste da malha de controle

Por ser um sistema em malha fechada, é natural que a implementação da estratégia de controle precise ser ajustada às características da planta (ou sistema) a ser controlado. Com o conversor boost não é diferente, o melhor ponto de busca é conseguido carregando corretamente os coeficientes do compensador digital que é executado a cada ciclo da malha de controle. O firmware foi estruturado para que essa parte seja feita apenas uma vez na inicialização do conversor, podendo ser modificado para ajuste em tempo de execução facilmente, e é encapsulado e sem acesso por via das funções públicas do conversor boost digital. Vamos explicar como o ajuste deve ser feito, para tal considere a linha 480 do arquivo boost.c que é exibido a seguir:

Nessa linha ocorre a chamada da função DigitalPowerLoopSetCoef. Esta recebe três parâmetros convenientemente chamados de KP, KI, e KD, que fazem referência ao conhecido conjunto de coeficientes do compensador Proporcional-Integral-Derivativo, ou PID. Como já mencionado antes, ele é o elemento central da estratégia de controle do nosso conversor, e foi inteiramente implementado em assembly para aproveitar ao máximo possível a unidade de ponto flutuante do Cortex-M4 que está na discovery a fim de garantir bom desempenho e baixa penalidade de execução. Mas voltando aos coeficientes, esses são quem devem ser ajustados para garatir que as perturbações ocorridas na tensão de saída sejam compensadas o mais rápido possível, mantendo também baixo erro de estado estacionário e estabilidade incondicional, ou seja, em qualquer situação de comportamento do sistema. Postulado isso, vamos ver o que acontece com a malha de controle sem qualquer ajuste, com um ganho proporcional (KP) igual a 1.0 sob um degrau gerado no set point, vejam a imagem abaixo:

Conversor Boost Síncrono Closed Loop: Resposta em degrau KP = 1.0
Figura 4 : Resposta em degrau KP = 1.0

Como podemos ver, após um degrau no setpoint (traço verde), sem o ajuste a malha de controle praticamente não atua, causando esse erro de estado estacionário enorme, além da velocidade de correção que está em perfeita incógnita, pois não vimos sequer a tensão de saída (traço amarelo variar). Vamos melhorar um pouco a correção agora aumentando o ganho proporcional para um valor que encotrei previamente, em torno de 25.0. Vejamos o que acontece:

Conversor Boost Síncrono Closed Loop: Reposta degrau KP = 25.0
Figura 5 : Reposta degrau KP = 25.0

Com o ganho ja obtemos uma melhora na resposta, veja que os sinais param quase no mesmo valor ao entrar em regime estacionário, a velocidade de correção está suficientemente boa a partir do momento que o tempo morto é respeitado (lembre - se que temos pelo menos 10 ms ou mais até que uma nova tensão no A/D seja capturada), mas o erro de estado estacionário ainda permanece seguida de uma pequena oscilação de baixa amplitude. Para melhorar um pouco mais vamos usar a ação integral para tentar eliminar o erro estacionário, assim, vamos iniciar com mais um valor que obtive experimentalmente, 0.729. 

Conversor Boost Síncrono Closed Loop: Resposta degrau KI = 0.729
Figura 6 : Resposta degrau KI = 0.729

Vejam que o erro de estado estacionário ficou bem minimizado, com o valor de realimentação muito próximo ao set point. Um problema que pode ocorrer com os ganhos proporcional e integral com valor elevado é a aparição do fenômeno de sobressinal, ou seja, é quando a tensão de saída vai pra um valor acima do desejado e oscila por um tempo até que a ação integral consiga surtir efeito e a oscilação diminua. Vamos experimentalmente colocar o ganho proporcional e integral em valores altos, 50.0 e 25.0 respectivamente. Vamos ver o resultado:

Conversor Boost Síncrono Closed Loop: Resposta degrau KP = 50.0 e KI = 25.0
Figura 7 : Resposta degrau KP = 50.0 e KI = 25.0

Esse é o cuidado que devemos ter ao elevar os ganhos proporcional e integral. Se mal dimensionados podem levar o sistema para essa oscilação desagradável da imagem, e o sistema à instabilidade permanente. Acredite, com esses valores você vai escutar um chiado bem desagradável. Vamos agora aplicar as três ações obtidas experimentalmente, que deram um ajsute final bem interessante. Vejam essa última reposta a degrau com KP, KI e KD sendo respectivamente 8.5, 0.729 e 43.93:

Conversor Boost Síncrono Closed Loop: Resposta degrau com KP = 8.5, KI = 0.729 e KD = 43.93
Figura 8 : Resposta degrau com KP = 8.5, KI = 0.729 e KD = 43.93

Vejam que além de melhorar problemas com overshoot, praticamente eliminamos o efeito de zona morta, tendo compesação tão logo haja uma variação do conversor A/D ou alguma perturbação na tensão de saída. Essa resposta pode ser melhorada mais ainda caso o usuário conheça bem o modelo da planta do conversor usado. E por falar em modelo, creio que o leitor agora vá me questionar de onde eu tirei tais valores para ajuste dos coeficientes do algoritmo de controle. Bem posso dizer que o modelo por espaço de estados (que pode ser lido rapidamente aqui) já esteja de cor em minha cabeça, porém modelar sistemas não lineares como conversores de potência está fora do escopo da série (que está mais pra algo introdutório). Porém é possível utilizar uma técnica empírica que ajuda a extrair os coeficientes de forma experimental, com ela cheguei a valores muito próximos do obtido pela simulação com MatLab. Trata-se do método Ziegler - Nichols, explicar de onde ele vem também está fora do escopo da série, o que é importante citar é que esse método fornece um bom ajuste inicial como ponto de partida para uma melhoria mais fina nos coeficientes, ou como no nosso caso podemos ter a feliz coincidência dos valores caírem bem próximos aos de coeficientes obtidos analiticamente. Trata - se de um método intuitivo, para tal considere a Tabela abaixo:

Tabela 1 : Coeficientes de tunning Ziegler - Nichols

E abaixo listamos como fazer o uso dessa tabela. Veja que os coeficientes resultantes dela podem ser inseridos diretamente na chamada da função DigitalPowerLoopSetCoef em boost.c (linha 480). O termo dT que aparece em KI e KD trata-se de uma normalização para seu uso em sistemas discretos (como no nosso caso), então seu valor pode ser obtido tomando o inverso da frequência de chaveamento configurada no firmware (veja boost.h), assim prossigamos: 

  • Primeiramente, com o sistema em funcionamento, aumente o ganho KP até que o sistema comece a ter em sua saída uma oscilação sem amortecimento e constante, lembre - se de deixar KI e KD zerados;
  • De posse desse valor, ele será o parâmetro Kc que pode ser usado na Tabela 1. Para busca do ganho proporcional de acordo com o tipo de compensador desejado;
  • Ainda sem ajustar a malha, volte ao sistema que ainda está oscilando, meça com o osciloscopio ou frequencímetro o valor do período dessa oscilação. Esse valor é o parâmetro Pc que também poderá agora ser usado na tabela 1;
  • Use Kc e Pc para buscar os valores de KP, KI, KD (ou a combinação que desejar de acordo com o compesador necessário) com o uso da tabela 1, calcule os valores e coloque diretamente na chamada da função DigitalPowerLoopSetCoef em boost.c (linha 480).

A partir desse ponto o controlador estará ajustado de forma razoável, e o usuário poderá brincar com os coeficientes afim de obter a melhor resposta. É sábio lembrar que esse método é o mais básico para ajuste de compensador, outros métodos analíticos podem ser empregados sempre com problemas com os tradicionais root locus, e por resposta em frequência (esse meu favorito para uso em digital power).

O conversor boost em funcionamento

Bem agora que já ajustamos nosso conversor, nada melhor que ver um vídeo da aplicação em ação, reparem que o traço verde é a tensão de entrada escalada e o traço amarelo a tensão de saída escalada. Em determinado ponto colocarei a ponta de prova onde o leitor irá ver a tensão de saída real na carga. Aliás convêm falar que a carga usada possui uma impedância de 100 ohms com uma capacitância de 10 nF para gerar uma condição de inrush da nossa planta, afim de mostrar nosso conversor próximo a aplicações do mundo real. Submeti o conversor a entradas de diferentes formas de onda para verificar sua resposta dinâmica, o resultado é bem legal, e pode ser visto no video a seguir:

Conclusão

Bem aqui chegamos ao fim de mais uma série cobrindo o mundo as vezes místico do controle digital aplicado em conversores de energia. Foi uma série introdutória, o assunto é bem extenso, mas conseguimos atingir o objetivo de dar uma visão de como funciona para eventualmente cobrirmos tópicos mais complexos. O kit fornecido pela STMicroelectronics atendeu muito bem em ilustrar os experimentos aqui desenvolvidos além de, ao mesmo tempo, mostrar quais inovações a ST vem trazendo para o campo de digital power como seu poderoso HRTIM para geração de PWM de altíssima resolução. Conseguimos em torno de 15bits operando a uma elevada frequência de chaveamento digna de circuitos integrados analógicos, além disso os comparadores ultra rápidos combinados com o DAC permitiram realizar um controle de malha fechada totalmente por hardware para o LED de alto brilho feita nos artigos anteriores. A ST também se superou no quesito conversor A/D, provendo um que converte a taxas impressionantes de até 5 Milhões de amostras por segundo permitindo o uso das configurações mais simples até mesmo em um software um pouco mais agressivo como o controlador de tempo real do conversor boost. Enfim, uma solução interessante e com custo competitivo ante a outras fabricantes de semicondutores especializadas em digital power. A série termina, mas a discussão está aberta, e a sugestão que deixo ao leitor é que utilize os conhecimentos obtidos e tente realizar um conversor buck-boost sem inversão afim de prover um poderoso regulador de tensão para qualquer situação. Com a discovery da ST a coisa fica mais fácil pois o hardware do conversor está prontinho, bastando pensar no firmware. Bem caro leitor, por enquanto é isso, aguardo você nas próximas séries e artigos, afinal 2016 está só começando.

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

Datasheet do STM32F334

Manual de referência do STM32F334

Repositório no github com o firmware de controle boost closed loop

Outros artigos da série

<< Digital Power com STM32F334 - Firmware do Conversor Boost Síncrono 'Open Loop' - Parte IV
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.

Hardware » Digital Power com STM32F334 - Firmware do Conversor Boost Síncrono Closed Loop - Parte final
Talvez você goste:
Comentários:

Deixe um comentário

avatar
  Notificações  
Notificar

Séries



Outros da Série

Menu