Desenvolvimento de um conversor buck no STM32F334: princípio de operação, cálculos, prototipagem

Nos meus dois últimos artigos, falei sobre o módulo de energia e a placa de controle baseados no microcontrolador STM32F334R8T6, criados especificamente para a implementação de sistemas de controle para conversores de energia e acionamentos elétricos. Também foi considerado um exemplo de um conversor CC / CA, que era uma demonstração, não uma construção concluída. Agora é hora de fazer algo simples, mas útil e, o mais importante, concluído.

A maioria das perguntas relacionadas ao projeto e à eletrônica de potência está relacionada a topologias específicas: alguém está interessado em aprender o algoritmo de controle do PFC, alguém quer aprender a construir uma meia ponte LLC, mas a topologia mais popular é, sem dúvida, uma vantagem. Afinal, o conversor buck (também conhecido como conversor buck) é o principal dos projetos mais interessantes: este é o driver para lâmpadas LED, a base do controlador MPPT para painéis solares, carregadores e muito mais.

A rede possui muitas informações sobre buck, incluindo planilhas de dados, mas está dispersa e eu pessoalmente não encontrei material que descreva em detalhes o processo de criação de um conversor buck com controle digital. É hora de consertar isso. Praticamente não há matemática, a explicação está "nos dedos", por isso será interessante para todos que estão de alguma forma conectados à eletrônica.



1. Introdução


Primeiro, você precisa entender o que queremos obter no final e que introdução temos. A topologia do buck é reduzida, ou seja, permite construir um conversor de tensão de redução. Como você verá mais adiante, a tensão na saída do conversor buck depende quase linearmente da tensão na entrada; portanto, é necessário adicionar feedback. Hoje vou falar sobre o feedback de tensão simples, que é o mais intuitivo e permitirá que você entenda o princípio de operação, enquanto esse feedback é suficiente para você implementar a maioria das tarefas.

No final do artigo, obteremos uma fonte de tensão estabilizada em funcionamento de acordo com a topologia “buck síncrona”, operando em uma frequência bastante alta com controle digital, implementada no STM32F334R8T6 usando PWM de alta resolução (HRPWM). A faixa de tensão de entrada é de 15 a 60V, a tensão de saída é de 12V e a corrente máxima de saída é 2A.

Capítulo 1. O princípio da topologia


Começarei a contar a partir do básico e melhorarei gradualmente nosso conversor, conforme "Buck síncrono" é uma versão da versão aprimorada com maior eficiência e complexidade de controle. A versão básica da topologia que você provavelmente usou é a seguinte:



Essa topologia é usada em conversores de voltagem de baixa potência, por exemplo, para alimentar circuitos digitais e outros dispositivos de baixa potência. A redução de CC / CC que você usa em seus dispositivos provavelmente é implementada em microcircuitos, de acordo com esta topologia. Um exemplo desse chip é o LMR16006 .

O princípio de operação deste circuito é muito simples, um sinal PWM é fornecido ao transistor VT1, o trabalho em si é dividido em 2 etapas, que alternam uma após a outra:

  • O estágio de armazenamento de energia no circuito LC. Nesta fase, o transistor VT1 está aberto e a corrente flui através do transistor para a carga, armazenando simultaneamente energia no capacitor do indutor e de saída:

  • Estágio de descarga. Nesta fase, o transistor VT1 fecha e então a diversão começa. Acelerador - é algo que acumula energia se um potencial é aplicado a ele (VT1 aberto) e o distribui se o potencial desaparecer (VT1 é fechado). Ao mesmo tempo, ele busca não apenas fornecer energia, mas salvar o valor da corrente e sua direção; portanto, para usar essa propriedade, é necessário adicionar o diodo VD1 para fechar o circuito, porque a corrente flui apenas em um circuito fechado:


Quando me familiarizei com essa topologia na 6ª à 7ª classe, não entendi imediatamente por que o diodo não conduz corrente no 1º estágio, agora parece comum, mas acho que vale a pena mencionar. Quando o VT1 está aberto, o potencial + VIN, por exemplo, + 20V, é aplicado ao cátodo do diodo VD1 e o potencial terra, respectivamente, no ânodo do diodo. Para que a corrente flua através do diodo, deve ser exatamente o oposto: o potencial no ânodo deve ser maior que o potencial no cátodo; portanto, no buck-e, na fase de armazenamento de energia, o diodo é "fechado". No estágio de descarga, o diodo já fecha o circuito, o potencial + VIN não age em seu cátodo e não o "bloqueia". Espero ter explicado claramente.

Então você deve ter uma pergunta: “E qual voltagem estará na saída, se aplicarmos 20V à entrada?”. Como sempre, tudo é simples:



Como pode ser visto na fórmula, a tensão de saída depende linearmente do fator de serviço do sinal PWM que fornecemos ao transistor VT1. Se alguém não souber ou esquecer o “fator de serviço”, essa é a razão entre o tempo em que o transistor está no estado aberto e a duração do período. Este coeficiente pode assumir um valor de 0 a 1 ou de 0 a 100%. Além disso, operaremos com essa figura em particular ao controlar o conversor, mas, para entender a essência, vamos substituir essa relação na fórmula:



A frequência de operação do conversor buck é constante e é selecionada durante o projeto, não muda durante a operação e, portanto, o período (T) é constante. Acontece que a tensão de saída depende diretamente de duas quantidades físicas:

  • a partir do momento em que abrimos o transistor superior (VT1) - quanto mais aberto, mais energia tem tempo para acumular no filtro LC e, consequentemente, a tensão de saída é maior;
  • da tensão de entrada, por exemplo, se fixarmos o preenchimento em 50% e mudarmos o Vin de 20 para 40V, a tensão de saída também mudará de 10 para 20V.

Penso que o quadro geral e o princípio do trabalho começaram a aparecer em você, vamos corrigi-lo agora e examinar os oscilogramas reais e verificar essa proporção na prática. Montei um layout de fanfarrão carregado com um LED de 10 W. Usei 3 canais do osciloscópio, incluídos nos seguintes pontos:



Experiência nº 1 - Tensão de entrada (Vin) constante 20V, o ciclo de trabalho muda

  • Vin = 20V, D = 25%, Vout = D * Vin = 0,25 * 20V = 5V

  • Vin = 20V, D = 50%, Vout = D * Vin = 0,5 * 20V = 10V


Como você pode ver nas formas de onda, a relação entre a tensão de saída e o ciclo de serviço está correta. Obviamente, esse foi um experimento "idealizado"; na realidade, a tensão de entrada não é estável e flutua em uma faixa bastante ampla. Vamos agora ver qual será a dependência da tensão de entrada em um enchimento fixo.

Experiência nº 2 - A tensão de entrada (Vin) está mudando, o ciclo de trabalho é constante e igual a 50%

  • Vin = 15V, D = 50%, Vout = D * Vin = 0,5 * 15V = 7,5V

  • Vin = 20V, D = 50%, Vout = D * Vin = 0,5 * 20V = 10V

  • Vin = 30V, D = 50%, Vout = D * Vin = 0,5 * 30V = 15V


Agora vimos na prática que a tensão de saída também depende linearmente da tensão de entrada em um ciclo de trabalho fixo. Você já entende como isso estabilizará a saída? O princípio de estabilização é simples como a própria fórmula - Vout é 12V e constante, podemos alterar o ciclo de trabalho com a ajuda de um microcontrolador; portanto, se Vin aumentar, a tensão de saída também aumenta e, neste momento, diminuímos o fator de trabalho até que se torne 12V novamente. Assim, quando o Vin diminui, começamos a aumentar o ciclo de trabalho até que a tensão Vout se torne 12V.

O que mais eu gostaria de chamar a atenção na seção teórica ... Ah, sim! Certamente você está se perguntando como um PWM com uma amplitude de 20V depois que um transistor acabou se transformando em uma tensão constante com ondulações escassas? De fato, se colocarmos a sonda vermelha do osciloscópio na fonte do transistor VT1, a sonda verde após o filtro LC, veremos a seguinte imagem:



Você pode ver como o filtro LC “lubrifica” a tensão alternada em tensão constante, mas o importante é que a energia armazenada na indutância e na capacitância não pode ser consumida instantaneamente, portanto, a tensão não pode mudar instantaneamente. Entendemos que no momento em que o PWM na frente do indutor se torna 0V, a tensão de saída é fornecida pela energia armazenada no filtro, que não absorve imediatamente e é suficiente para manter a tensão no momento em que o VT1 fecha. Está tudo nos dedos, é claro, se é interessante aprofundar, então, como sempre, aconselho B. Yu. Semenova "Eletrônica de Potência: do simples ao complexo" , há um capítulo inteiro sobre buck (helicóptero).

A luta pela eficiência


Como escrevi um pouco antes, essa era a versão básica da topologia. Sua principal desvantagem são as altas perdas no diodo de travamento. Qual é a corrente nos sistemas simples que operam no MK e no CPLD? Geralmente dentro de 1A, às vezes 2A, se houver algum tipo de exibição TFT. Nesse caso, a perda, mesmo ao usar um diodo Schottky, será de 0,4V * 2A = 0,8 watts. Em princípio, é aceitável dissipar tanto no pacote SMA / SMB sem problemas, embora com uma tensão de 3,3V e 2A, uma perda de 0,8V ainda seja 12% de eficiência!

Agora imagine o caso em que a corrente que temos é 20A. Pode ser um controlador MPPT, um grande sistema de energia FPGA e muito mais. Nesse caso, a perda será de 0,4V * 20A = 8 W! O que isso significa? Por exemplo, no caso do MPPT, você terá menos energia armazenada na bateria; no caso da energia do FPGA, serão 8 watts adicionais de calor, que devem ser dissipados em algum lugar e, em ambos os casos, é sem dúvida uma perda de eficiência geral. O que pode ser feito? E vamos substituir o diodo VD1 por outro Mosfet de canal N e obter este circuito:



Agora, o transistor VT2 atua como um diodo, ou seja, ele conduz corrente quando o VT1 é fechado. O diodo, que estava na versão básica, não exigia controle, agora somos obrigados a pagar um canal de controle adicional com um sinal PWM para melhorar o desempenho.

Primeiro, vamos calcular quanto reduzimos as perdas. A resistência do canal de um mosfet moderno é de vários megaohms. Como exemplo, vamos pegar um transistor do meu módulo de potência, sobre o qual falei em artigos anteriores - IPP083N10N5AKSA1 com uma resistência de canal de 8,3 mOhm. Temos perdas estáticas iguais a 0,0083 * 20A * 20A = 3,32 watts. Obviamente, haverá perdas dinâmicas, que com um driver adequadamente projetado não serão mais do que 20%, ou seja, as perdas totais para nós serão de 4 watts. Concluímos que a transição de um buck convencional para um síncrono pode reduzir pela metade a perda do diodo.

Agora, vejamos o gerenciamento mais complicado. Como já entendemos, o diodo de bloqueio estava conduzindo corrente quando o VT1 foi fechado. Daí resulta que o VT2 deve ser fechado quando o VT1 está aberto e, portanto, o VT2 está aberto quando o VT1 está fechado. Se for mais simples, os transistores funcionam alternadamente: um está aberto ou o outro, se os dois transistores estiverem abertos, haverá uma corrente de passagem, porque eles estão interconectados entre VIN e GND. Vamos ver qual deve ser o sinal, onde o "canal amarelo" é o transistor VT1 e o "canal verde" é o transistor VT2:



Como você pode ver, se o "1" lógico estiver definido no canal amarelo (no VT1), nesse momento o "0" lógico deverá ser definido no canal verde (no VT2). Conseguimos que o VT1 bombeie energia para o filtro LC, e o VT2 fecha o circuito no estágio de descarga.

Há mais um ponto que você já ouviu ou leu acima - através da corrente . O fato é que um transistor real, e não ideal (mosfet), tem uma certa capacitância no portão, ou seja, na realidade não passa instantaneamente do log.0 para o log.1, e a energia no transistor não se dissolve instantaneamente, resultando em transistores por um curto período de tempo no momento da troca, ambos podem estar abertos. Isso pode levar, na melhor das hipóteses, a maiores perdas, o que significa aquecimento e, na pior, a uma babá, porque corrente de passagem é um curto-circuito comum (curto-circuito). Para evitar isso, é introduzido um atraso ou o chamado tempo morto entre desligar um transistor e ligar outro. É assim:



Eu acho que você percebeu que há uma pequena lacuna no limite de comutação de sinal. Eu o instalei conscientemente grande (cerca de 3%) para que você possa vê-lo, na realidade é muito menor. Em geral, o tempo morto (doravante dt) é definido o mais curto possível, mas ao mesmo tempo suficiente para permitir que os transistores se fechem. Pode ser calculado, ou pode ser selecionado empiricamente. Pessoalmente, acho que essa e aquela opção são normais, mas o Jedi barbudo provavelmente lhe dirá: "É necessário considerá-lo, mas é melhor modelá-lo!" Isso certamente está correto, mas decida por si mesmo - se você não for muito preguiçoso, modele no LTspice levando em consideração indutâncias e capacitâncias dispersas de condutores e componentes.

Para o suporte deste artigo, defino dt como ~ 100 ns (na verdade, 104). Meu módulo permite que você o instale muito menos, porque o driver é aplicado com muita rigor, mas com certeza muitos de vocês criarão seu layout sem o meu módulo, o que significa que provavelmente haverá ranho. Para não ficar preso devido ao ranho, deixarei o dt com uma margem e, se você tiver uma fiação normal na placa, poderá reduzi-la - então, no capítulo do código, você verá como, por enquanto, veremos se há realmente dt:



Pode-se ver que dt dura 2,5 divisões e cada divisão é de 40 ns, o que significa que a duração é de ~ 100 ns, como pretendido. Espero que você entenda por que o dt é necessário, quanto tempo deve durar e como o conversor funciona de acordo com a topologia buck. Se você não entende, então, como de costume, são aceitas perguntas nos comentários, PM e correio, enquanto pareço responder a todos.

Capítulo 2. O Cálculo dos Componentes Principais


Nesta parte do artigo, mostrarei como calcular rápida e facilmente os principais componentes de potência de um conversor síncrono, a saber: indutor, capacitores de entrada e saída, transistores.

Deixe-me lembrá-lo dos dados de entrada:

  • Tensão de entrada: 15 ... 30V
  • Tensão de saída: 12V
  • Corrente nominal de saída: 2A
  • Frequência de comutação: 100 kHz

A tensão de saída de 12V é selecionada porque Eu pretendo usar um LED de 12V 20W como carga, que ficou à mão e é uma carga muito óbvia. Antecipando as perguntas dos "especialistas" nos comentários - sim, eu sei que o LED precisa de estabilização de corrente, mas então fazemos um estabilizador de tensão e o LED é apenas uma carga.

A tensão de entrada é selecionada no bulldozer, você pode fazer de 15 a 60V; portanto, se você estiver interessado em uma faixa diferente, poderá calcular o valor dos componentes para si mesmo. Uma corrente nominal de 2A é escolhida para obter a potência de saída de 12V * 2A = 24 W, ou seja, um pouco mais do que o necessário para o LED. O próprio LED a 12V consome cerca de 1,82 ... 1,9A.

O parâmetro mais interessante permaneceu - a frequência de operação do conversor. O que deveria ser? Você terá que responder aqui você mesmo, no meu caso, é 100 kHz. A escolha é baseada em dois pontos:

  • Um aumento na frequência leva a uma diminuição da indutância necessária do indutor, capacitor de entrada e saída. Simplificando - com o aumento da frequência, as dimensões do dispositivo diminuem. Com frequência decrescente, as dimensões aumentam.
  • Uma diminuição na frequência leva a um aumento na eficiência, já que perdas dinâmicas quando os transistores chaveadores são reduzidos. Aumentar a frequência aumenta o componente dinâmico dos transistores e, consequentemente, reduz a eficiência.

Agora não vou discutir a escolha da frequência, basta assumir que 100 kHz. Depois de mostrar a metodologia de cálculo, retornaremos a essa pergunta, porque de acordo com as fórmulas, a dependência das classificações dos principais componentes na frequência de operação será mais claramente visível.

Etapa 1. Escolhendo transistores

Estaremos interessados ​​principalmente em três parâmetros: a tensão máxima "fonte de drenagem", a resistência do canal no estado aberto e a capacitância do portão. O potencial total da fonte de tensão (Vin) é aplicado ao transistor, e também há surtos no momento da comutação. Você tem duas opções: pegue o transistor VT1 e VT2 com uma margem de tensão ou a história do amortecedor RC no VT2. No meu caso, o módulo de potência possui transistores de 100V e, com uma entrada de 30V, essa é uma enorme margem de tensão, até 60V foi suficiente para ficar sem amortecedores e proteger o transistor de quebra.

Resistência do canal - quanto menor, melhor, mas existe uma MAS. Com uma diminuição na resistência do canal, reduzimos as perdas estáticas (I 2 * R), mas a tecnologia é tal que a capacitância da porta aumenta, e isso leva a um aumento nas perdas dinâmicas. Você precisa encontrar um meio termo entre "resistência do canal" e "capacidade do obturador". Para tensões de até 100V, aconselho que você preste atenção aos transistores da série Infineon OptiMOS, já observe as altas tensões por pesquisa paramétrica ou mesmo para transistores IGBT. Estes últimos também são suportados pelo meu módulo de energia e não exigem nenhuma alteração no driver.

Etapa 2. O cálculo da indutância do indutor

É necessário calcular o valor mínimo da indutância, o que permitirá que nosso conversor dc / dc funcione no modo de corrente contínua (L min ):



Em termos de variáveis, acho que tudo está claro, exceto - k ind . Essas são correntes de ondulação permitidas no indutor, geralmente escolhem um valor de 20 ... 50%, mas eu quase sempre defino 30%. Quanto menor a ondulação da corrente, mais longe estaremos da borda de saturação do núcleo no qual o indutor é enrolado, mas, como pode ser visto na fórmula, é necessária uma grande indutância do indutor.

Agora calculamos o valor mínimo da indutância, que será necessário para os meus dados de entrada, a ondulação que colocarei 30% como escrevi acima:



Deve-se entender que essa é a indutância mínima necessária para o conversor buck operar no modo de correntes inextricáveis, mas novamente há uma nuance. No processo de aumentar a corrente atuando no enrolamento, a permeabilidade do núcleo e a indutância do indutor SEM corrente e Com corrente são um pouco diferentes, a dependência é diferente para diferentes materiais.Para evitar a situação em que, com um aumento da corrente no indutor, a indutância diminui abaixo de L min e dc / dc não entra no modo de corrente de ruptura, é necessário aumentar a indutância um pouco, ou seja, adicionar algumas voltas extras durante o enrolamento. Um aumento na indutância de 10 a 15% será suficiente para o material de Kool Mu, e meu estrangulamento estará nele.

Etapa 3. Cálculo e fabricação do indutor

Gostaria de descrever este procedimento na seção "prototipagem", mas a etapa de cálculo da indutância permaneceria menos clara para você, e provavelmente perdi as imagens interessantes, por isso descreverei tudo aqui. Para a fabricação do acelerador, levarei o acelerador R26 / 14/11 (R é o anel e os números são as dimensões) do material Kool Mu com permeabilidade 60, você pode fazer o download da documentação e comprar aqui -Lepkos .



Agora você precisa calcular quantas voltas e qual fio precisa enrolar. Vamos começar com o número de turnos, talvez. Existe um parâmetro tão conveniente na documentação para o núcleo - A L , que é igual a 75 nH / turno 2 . Aqui com cuidado - vira um quadrado! Para encontrar a indutância do núcleo, multiplique LA pelo número de voltas no quadrado. A partir daqui, a fórmula para encontrar o número de voltas é assim:



para obter a indutância mínima necessária, é necessário dar 40 voltas, mas como já discutimos, é necessário aumentar levemente a indutância, vamos adicionar 3 voltas. Damos o anel e giramos 43 voltas, conseguimos um acelerador:



Agora, por uma questão de interesse, calculamos qual indutância deve resultar:



E, para confiabilidade, verificamos a indutância do indutor com uma pinça:



137 μH, ótimo! Resultados convergente, um erro de ± 8% a A L . Vale mencionar apenas que, se você não puder medir a indutância, não compre núcleos para aliexpress, no ChiD, computador, engenheiro eletrônico e outros "restaurantes" - há uma chance de obter o núcleo de outro material ou com a permeabilidade incorreta, mas com a marcação correta - verificado. Sem a capacidade de medir a indutância, você não poderá verificar A L e poderá se atormentar bastante em busca da causa do "babakh" do seu conversor.

Isso levanta uma questão razoável: “teremos núcleo suficiente e suas dimensões? Talvez fosse necessário mais? ". Para o material Kool Mu, o limite de indução magnética é de 0,5 T; na prática, é melhor não ultrapassar o limite acima de 0,45 T sem claramente necessário. Acontece que o enrolamento no núcleo não precisa criar indução em cada ponto do núcleo mais de 0,45 T, portanto verificamos:



Como você pode ver, o valor da indução magnética de 0,06 T é muito menor que o limite de 0,5 T. Duas conclusões podem ser tiradas disso: em primeiro lugar, o acelerador não entrará em saturação; em segundo lugar, o núcleo é muito grande e é poderoso usar um anel muito menor. Peguei o anel R26 simplesmente porque tenho a caixa inteira, não há outro significado secreto.

Resta determinar qual seção do fio levar para o indutor. Em primeiro lugar, eu recomendo fortemente que você não pegue um fio com um diâmetro superior a 1 ... 1,2 mm em frequências tão altas, porque o efeito de pele já tem um efeito significativo e reduz a seção transversal efetiva. Em segundo lugar, a densidade de corrente no fio deve ser selecionada com base nas condições e potência de resfriamento. Em potências baixas (até 10-20 W), é possível estabelecer com segurança uma densidade de corrente de 8 a 10 A / mm 2, mesmo sem fluxo de ar. Em potências de até vários quilowatts, é melhor estabelecer a densidade de corrente na faixa de 5 ... 6 A / mm 2 , e em potências de 10 kW em diante, será razoável reduzir a densidade de corrente para 3 ... 4 A / mm 2 .

Na ponta dos meus dedos, havia um fio envernizado com um diâmetro de 0,8 mm. Sua seção transversal, respectivamente, é de ~ 0,5 mm 2 . Em uma corrente de 2A, obtemos uma densidade de corrente no enrolamento de cerca de 4 A / mm 2 . Eu poderia usar um fio com metade da seção transversal, mas meu núcleo é grande o suficiente, para que um fio de seção transversal maior se encaixe sem problemas. Ao otimizar o seu dispositivo, você primeiro precisa contar e, em seguida, adquirir o fio da seção transversal desejada, para obter as dimensões ideais do indutor.

Etapa 4. Cálculo do capacitor de saída

Nesta fase, como no caso da indutância, consideraremos o valor mínimo da capacitância que deve ser instalada no filtro LC na saída do conversor buck. Assim, se você instalar mais, será melhor e depois veja o porquê. Vamos calcular a capacidade:



é claro, a capacidade também deve ser colocada com alguma margem, especialmente se você usar apenas cerâmica na saída, porque sua capacidade é bastante reduzida dependendo da tensão aplicada a ele. Também vale a pena prestar atenção à dependência de pulsações - o pulso V variável. Este é o valor máximo da ondulação na saída, ou seja, idealmente, com uma capacitância de 147,8 μF, a amplitude da ondulação será de 0,2V, ou seja, a tensão de saída flutuará na faixa de 11,9 ... 12,1V. Deseja reduzir a ondulação? Em seguida, reduza-os na fórmula e o valor da capacidade resultante aumentará de acordo. Obviamente, você não terá uma fonte de alimentação de laboratório simplesmente aumentando a capacidade de saída. Também é necessário levar em consideração a necessidade de uma VHS baixa, para isso eles costumam colocar 1-2 eletrólitos em paralelo e pendurar cerâmicas várias microfarads paralelas a eles com um dielétrico X7R, de preferência. Se o orçamento permitir, é possível substituir o capacitor eletrolítico pelo polímero de tântalo (como na GPU) e, portanto, a cerâmica não é necessária, pois eles têm uma pequena ESR.

Considerações sobre frequência

Agora, como eu disse, retornaremos à questão de escolher a frequência de operação do conversor. Deixe-me dividir as conclusões em alguns pensamentos:

  • Como você vê na fórmula, a frequência aparece, quanto maior a frequência operacional, menor a indutância do indutor será necessária e menos voltas terão que ser enroladas - economizamos cobre e simplificamos a fabricação de produtos de enrolamento
  • A indutância e o número de voltas estão presentes na fórmula para calcular a indução magnética, embora, como você se lembra, a indutância tenha uma dependência quadrática das voltas, o que significa que quando o número de voltas é reduzido em 2 vezes, a indutância diminui em 4 vezes. Daí resulta que, com frequência crescente, a indutância e o valor da indução magnética diminuem, o que significa que um núcleo menor pode ser usado, ou seja, reduzimos as dimensões
  • , — , , . !
  • … , . buck- mosfet- 200 . ( ) ? GaN

Acho que, a partir dessas teses, ficou claro para você o que a frequência de comutação afeta, agora você precisa aprender como encontrar a “média de ouro” entre as perdas nos transistores e o tamanho do dispositivo. Em um dos artigos a seguir, ensinarei a otimizar a frequência de operação para obter a máxima eficiência, o principal é não esquecer que eu faria isso.

Capítulo 3. Montando um Layout do Conversor Buck


Então, a parte mais entediante, mas importante, acabou, agora o hardware e o código desaparecerão. Vamos montar um layout no qual implementaremos cálculos teóricos. Para fazer isso, você precisará de dois módulos sobre os quais falei nos artigos anteriores: o módulo de energia e o módulo de controle no STM32F334 . Você também pode montar uma meia ponte de qualquer lixo improvisado do tipo IR2110 em uma placa de ensaio e usar qualquer MK como controle: STM32-Discovery, LaunchPad, Arduino e apenas adaptar a lógica do trabalho e do código ao seu MK favorito, nada será complicado se você entendeu nos dois primeiros capítulos como o conversor buck funciona.

Agora vamos tornar nosso diagrama mais realista, adicionando os valores de todos os componentes a ele e refletir corretamente o número de capacitores, além de observar qual parte do meu módulo de potência pode realizar:



Como você pode ver no diagrama, o módulo já contém uma meia ponte (dois transistores) para implementar um buck síncrono e um capacitor de entrada, a propósito, ele está no módulo com uma margem enorme - existem 3 eletrólitos de 1000 uF e 100V cada, isso é suficiente para montar facilmente um buck para 500 -800 watts Resta adicionar um estrangulamento, que já fabricamos e capacitamos para saída, este último também a propósito com uma margem, porque Eu encontrei apenas 4700 uF 25V para baixa voltagem, mas eles são algum tipo de chinês, então decidi paralelizar alguns. De fato, existem 470 uF suficientes lá, mas eu simplesmente não tive essa ninharia na versão de saída. Acontece que este design:



Como mencionado anteriormente, um poderoso LED de 20 W é usado como carga. Não sei quanta luz brilha e não é muito interessante, mas consome apenas 21 ... 22 W a 12 V para a qual meu conversor buck foi projetado. O próprio LED revestiu o KPT-8 e parafusou-o no radiador, é claro que não é suficiente, mas dura de 5 a 7 minutos sem problemas (aquece até +40 ... 50 o C) e não preciso mais. Conectamos 2 sinais HRPWM, GND do módulo de controle e, por meio do divisor, conectamos a saída buck ao ADC, como resultado, temos um suporte:



Capítulo 4. Gravando Software e Iniciando o Conversor


Agora, temos tudo o que precisamos para começar a escrever código e revitalizar nosso conversor buck. Primeiro, vejamos a pinagem do microcontrolador STM32F334R8T6, localizado no módulo de controle:



Agora entendemos quais pinos do microcontrolador serão usados. No próprio módulo, eu preciso de apenas 1 em cada 5 canais para controlar a unidade de energia, usaremos o canal "A". Este canal, como todo o resto, possui 2 saídas de PWM de alta precisão (HRPWM), 1 entrada de erro (não o usamos), GND para combinar o terra das placas e 2 canais ADC (usaremos apenas um para tensão).

Um pouco sobre HRPWM

Nas extensões do segmento da Internet em idioma russo, quase não encontrei nenhum material de treinamento sobre HRPWM e não encontrei nenhum material sobre como trabalhar com HRPWM baseado em microcontroladores STM32, e este é um periférico muito útil.

Não vou me aprofundar na teoria dessa periferia dentro da estrutura deste artigo; portanto, descreverei a essência. HRPWM ou PWM de alta resolução é o nosso módulo PWM habitual, que possui uma resolução aumentada para definir o fator de serviço e, além disso, geralmente possui configurações mais flexíveis.



  • O microcontrolador STM32F334R8T6 possui 10 canais HRPWM, que são combinados em 5 grupos de 2 canais. Esses 2 canais dentro do grupo podem trabalhar de forma independente e formar um par complementar - precisamos do último;
  • Dentro do par complementar entre 2 sinais PWM, é possível instalar o tempo morto do hardware para proteção contra a corrente de passagem;
  • Todos os 10 canais são cronometrados a partir de um timer - Master timer, para que todos sejam sincronizados um com o outro e você não precise configurar manualmente uma cadeia de temporizadores. Basta ligar o mestre e os temporizadores A ... E para obter um tempo a partir dele;
  • A frequência em HRPWM é dobrada, ou seja, em uma frequência central de 72 MHz, em HRPWM é de 144 MHz após um multiplicador adicional (x2) com PLL. Isso torna possível controlar os conversores a uma frequência de centenas de kHz;
  • Muitas configurações para o controle PWM, por exemplo, juntamente com a capacidade de vincular a geração do PWM ao início e ao final do período, existem mais 4 eventos configuráveis ​​(comp) que permitem converter o PWM para 0 ou 1 em qualquer ponto do período que não seja o início / fim do período;
  • Existem modos para topologias específicas, por exemplo, modo push-pull, que permitem implementar muitas topologias push-pull.

E isso é apenas uma pequena parte dos recursos. No diagrama de dispositivos HRPWM, você pode ver os recursos de sincronização com vários eventos, DACs, comparadores incorporados ao MK e, juntamente com este diagrama de blocos, há muitas outras possibilidades documentadas.

Resta a última pergunta que precisa ser abordada - “por que esse PWM é alto?”. Para fazer isso, considere um exemplo simples. Imagine que decidimos usar o MK sem HRPWM, digamos STM32F103C8T6, que também funciona a uma frequência de 72 MHz. Precisamos controlar a meia ponte a uma frequência de 70 kHz, consideramos que etapa de regulação podemos obter: 72 000 000/1025 etapas = 70 243 Hz. Sim, temos 1025 etapas e, ao ajustar, podemos alterar a tensão de saída com uma etapa teórica de 1/1025 = ~ 0,1%. Agora, pegamos o STM32F334, com uma frequência de clock de 144 MHz e uma largura de deslocamento do timer de 32 bits, obtemos a frequência equivalente a 144 MHz * 32 = 4,608 GHz. Para quem ficou assustado e duvidou da figura:



Não, essa não é uma frequência operacional, é uma frequência equivalente. O que isso nos dá? Tomamos a frequência equivalente de 4 608 000 000 Hz / 70 300 Hz = 65 535 passos. Agora podemos ajustar a tensão (ou corrente) na saída em incrementos de 1/65 535 = ~ 0,001%, ou seja, 100 vezes mais preciso!

E agora vamos fazê-lo - temos uma frequência de 700 kHz, o que é normal para um dinheirinho multifásico, por exemplo. O F103 terá 72.000.000 Hz / 700.000 Hz = 102 etapas, o que permite obter 1% de regulação na melhor das hipóteses, mas isso é 1% para serviço, ou seja, na realidade, com tantas etapas, você terá a tensão flutuando na saída como se estivesse estabilizando e não realmente. Enquanto no F334 o número de etapas será aproximadamente 6500, o que ainda permite criar um regulador de tensão ou corrente muito preciso. Concluímos que a resolução (etapa) da configuração do ciclo de trabalho é muito mais alta / com mais freqüência do que com um MK convencional com um módulo PWM padrão interno.

Configuração do sistema de relógio

Eu usei o TrueSTUDIO como o ambiente de desenvolvimento neste artigo, porque é gratuito, não é tão miserável quanto Keil ou IAR , sim, conte-me sobre seu maravilhoso depurador , plataforma cruzada e talvez a melhor solução para iniciantes e não apenas. No final do artigo, haverá um arquivo com o projeto especificamente para este IDE. Não vou lhe dizer como criar e configurar um projeto, apenas deixarei um link para o vídeo, onde tudo é mostrado em detalhes - assista .

Depois de criar um projeto e piscar o LED, você precisa configurar o sistema de clock, a partir de 8 MHz, aumentar a frequência para 72 MHz e aplicar no núcleo e, em seguida, ajustar o divisor para reduzir a frequência fornecida ao ADC:

void StartInitClock (void) { RCC->CR |= RCC_CR_HSEON; // Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)); FLASH->ACR |= FLASH_ACR_LATENCY_1; RCC->CFGR |= RCC_CFGR_PLLMUL9; // PLL mult x9 RCC->CFGR |= RCC_CFGR_PLLSRC; // Source HSE RCC->CFGR2 |= RCC_CFGR2_ADCPRE12_DIV10; // ADC source AHB/10 RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0){} RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; // Select source SYSCLK = PLL while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} // Wait PLL } 

Aqui, eu acho que o algoritmo de ajuste é o seguinte: ele muda para quartzo externo (HSE) -> esperamos quando a transição é concluída e o sinalizador pronto é definido -> enviamos o sinal do quartzo para a entrada PLL -> multiplicamos 8 MHz por 9 -> dividimos a frequência por 72 MHz por 10 para registrar o ADC -> ativar PLL -> aguardar até que acenda e definir o sinalizador pronto -> enviar um sinal do PLL para o barramento e núcleo do sistema -> aguardar até que a chave seja concluída -> concluída.

Configuração HRPWM

Aqui tudo é um pouco mais complicado, porque Este módulo possui muitas funcionalidades, várias configurações e a quantidade de documentação é muito grande, mas é um sinal de menos e, ao mesmo tempo, mais - você precisa pagar pela flexibilidade.

 RCC->CFGR3 |= RCC_CFGR3_HRTIM1SW_PLL; RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN; 

Você precisa especificar que o HRTIM tenha o clock da PLL, o multiplicador x2 já está ativado por padrão. Em seguida, simplesmente ligamos o relógio para o HRTIM, eis o primeiro recurso - pois entendemos que o timer recebe o relógio da PLL, mas o APB2. Isso não é totalmente lógico, mas é facilmente pesquisado no arquivo com CMSIS ou na documentação.

  RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER &= ~GPIO_MODER_MODER8; GPIOA->MODER |= GPIO_MODER_MODER8_1; // Alternative PP GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; // Very high speed GPIOA->MODER &= ~GPIO_MODER_MODER9; GPIOA->MODER |= GPIO_MODER_MODER9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; GPIOA->AFR[1] |= 0xDD; // PA8 and PA9 - AF13 

PA8 e PA9 são a saída do Timer A, que no meu módulo vai para o canal nº 1, que você pode ver no diagrama e na pinagem. As pernas são configuradas como push-pull com uma função alternativa; o número da função em si para as duas pernas é o 13º. Também é importante sintonizar a frequência GPIO máxima; caso contrário, haverá um bloqueio incompreensível do sinal frontal e de queda, o que é extremamente crítico para a eletrônica de potência.

 HRTIM1->sCommonRegs.DLLCR |= HRTIM_DLLCR_CAL | HRTIM_DLLCR_CALEN; while ((HRTIM1->sCommonRegs.ISR & HRTIM_ISR_DLLRDY) == RESET); 

Antes de começar, você precisa calibrar o timer, porque Funciona com atrasos mínimos e aguarde o sinalizador pronto.

 HRTIM1->sTimerxRegs[0].PERxR = PeriodTimerA; // Period for timer A HRTIM1->sTimerxRegs[0].CMP1xR = 0; // Duty for timer A 

Isso é flexibilidade. Primeiro, podemos definir nossa própria frequência para cada timer A ... E, aqui simplesmente registramos o período do nosso PWM. Em segundo lugar, por padrão, temos o alinhamento do PWM no início do período, ou seja, o sinal passa para o log.1 no início de um novo período e agora precisamos escolher quando ele retornará ao log.0, nesse caso, pelo comparador nº 1, ou seja, Eu pergunto nele essencialmente o fator dever.

Por exemplo, você pode converter o PWM não no início do período, mas pelo comparador nº 1 e retornar ao log.0 pelo comparador nº 2 e, assim, mover o hardware da fase.

 // Deadtime enable HRTIM1->sTimerxRegs[0].OUTxR |= HRTIM_OUTR_DTEN; // Tdtg = 6.94 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTPRSC_0 | HRTIM_DTR_DTPRSC_1; // Deadtime rising = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTR_0 | HRTIM_DTR_DTR_1 | HRTIM_DTR_DTR_2 | HRTIM_DTR_DTR_3; // Deadtime falling = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTF_0 | HRTIM_DTR_DTF_1 | HRTIM_DTR_DTF_2 | HRTIM_DTR_DTF_3; HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTFSLK | HRTIM_DTR_DTRSLK; 

Nesta fase, habilitamos o tempo morto e configuramos, em princípio, os comentários contêm todas as fórmulas, também podem ser encontrados no manual de referência. TD com uma duração de ~ 100 ns que você já viu na forma de onda no capítulo teórico deste artigo. O tempo morto pode ser definido separadamente na borda e no declínio do sinal. A propósito, [0] é o timer A, respectivamente [1] é o timer B e assim por diante.

 // Samples in middle of ON time HRTIM1->sTimerxRegs[0].CMP2xR = PeriodTimerA / 10; // ADC trigger 1 update: Timer A HRTIM1->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 event: Timer A compare 2 HRTIM1->sCommonRegs.ADC1R |= HRTIM_ADC1R_AD1TAC2; 

Para mim, este não foi o momento mais óbvio. A linha inferior é - quero garantir que, durante 10% da duração do período do timer A, seja gerado um evento que desencadeie a conversão ADC e meça o sinal de feedback. Por que 10%? Simplesmente, idealmente, a medição não deve ocorrer no momento da transição do PWM de 0 para 1 ou vice-versa, porque neste momento na unidade de energia, existem transitórios e interferências, mas não precisamos medi-los. Portanto, 10% no meu caso é ideal, porque na saída de 12V e 30V, a tensão de entrada do fator de serviço não cairá para 10% e o momento da troca do transistor não corresponderá exatamente à medição ADC.

Agora você precisa examinar o sistema de comunicação de eventos entre o HRTIM e o ADC:



Na primeira linha, escolhemos quando o comparador será acionado, no meu caso, é 10% do período do timer A. Em seguida, selecionamos um acionador específico no ADC que entrará em contato com o MK, temos acesso ao 1º ou 3º. Agora, ele simplesmente indica qual evento enviará o sinal para o ADC, no meu caso, é o comparador nº 2.

 // Enable output PWM for TA1 and TA2 HRTIM1->sCommonRegs.OENR |= HRTIM_OENR_TA1OEN | HRTIM_OENR_TA2OEN; // Continuous mode HRTIM1->sTimerxRegs[0].TIMxCR |= HRTIM_TIMCR_CONT; // Period for master timer HRTIM1->sMasterRegs.MPER = 65000; // Enable counter for Master and timer A HRTIM1->sMasterRegs.MCR |= HRTIM_MCR_MCEN | HRTIM_MCR_TACEN; 

E o acorde final! Permitimos que o HRTIM produza sinais do Timer A para o nosso GPIO. Agora, selecionamos o modo, acontece sem fim (eu tenho), mas acontece que o timer é ativado por um período e depois disso precisa ser reiniciado. Em seguida, defina o período para o timer mestre e ligue-o como o último passo, ele começa a registrar os temporizadores do canal e o sinal PWM aparece na saída.

Era uma função de ajuste, resta fazer uma função que definirá o fator de serviço; é com ele que trabalharemos ao criar o controlador:

 void SetDutyTimerA (uint16_t duty) { HRTIM1->sTimerxRegs[0].CMP1xR = duty; } 

Listando configurações de funções e definindo o ciclo de serviço
 // f = 102,4 kHz #define PeriodTimerA ((uint16_t)45000) void InitHRPWM (void) { RCC->CFGR3 |= RCC_CFGR3_HRTIM1SW_PLL; RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN; /************************************************ * Setting GPIO ***********************************************/ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // Alternative PP GPIOA->MODER &= ~GPIO_MODER_MODER8; GPIOA->MODER |= GPIO_MODER_MODER8_1; // Very high speed GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; GPIOA->MODER &= ~GPIO_MODER_MODER9; GPIOA->MODER |= GPIO_MODER_MODER9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; // PA8 and PA9 - AF13 GPIOA->AFR[1] |= 0xDD; /************************************************ * Setting timer A ***********************************************/ HRTIM1->sCommonRegs.DLLCR |= HRTIM_DLLCR_CAL | HRTIM_DLLCR_CALEN; while ((HRTIM1->sCommonRegs.ISR & HRTIM_ISR_DLLRDY) == RESET); // Period for timer A HRTIM1->sTimerxRegs[0].PERxR = PeriodTimerA; // Duty for timer A HRTIM1->sTimerxRegs[0].CMP1xR = 0; // Deadtime enable HRTIM1->sTimerxRegs[0].OUTxR |= HRTIM_OUTR_DTEN; // Tdtg = 6.94 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTPRSC_0 | HRTIM_DTR_DTPRSC_1; // Deadtime rising = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTR_0 | HRTIM_DTR_DTR_1 | HRTIM_DTR_DTR_2 | HRTIM_DTR_DTR_3; // Deadtime falling = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTF_0 | HRTIM_DTR_DTF_1 | HRTIM_DTR_DTF_2 | HRTIM_DTR_DTF_3; HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTFSLK | HRTIM_DTR_DTRSLK; // Event forces the output to active state for TA1 HRTIM1->sTimerxRegs[0].SETx1R |= HRTIM_SET1R_PER; // Event forces the output to inactive state for TA1 HRTIM1->sTimerxRegs[0].RSTx1R |= HRTIM_RST1R_CMP1; /************************************************ * ADC trigger intialization (with CMP2 event) ************************************************/ // Samples in middle of ON time HRTIM1->sTimerxRegs[0].CMP2xR = PeriodTimerA / 10; // ADC trigger 1 update: Timer A HRTIM1->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 event: Timer A compare 2 HRTIM1->sCommonRegs.ADC1R |= HRTIM_ADC1R_AD1TAC2; /************************************************ * HRTIM start ***********************************************/ // Enable output PWM for TA1 and TA2 HRTIM1->sCommonRegs.OENR |= HRTIM_OENR_TA1OEN | HRTIM_OENR_TA2OEN; // Continuous mode HRTIM1->sTimerxRegs[0].TIMxCR |= HRTIM_TIMCR_CONT; // Period for master timer HRTIM1->sMasterRegs.MPER = 65000; // Enable counter for Master and timer A HRTIM1->sMasterRegs.MCR |= HRTIM_MCR_MCEN | HRTIM_MCR_TACEN; } void SetDutyTimerA (uint16_t duty) { HRTIM1->sTimerxRegs[0].CMP1xR = duty; } 


Agora vamos descobrir se estamos seguindo o caminho certo. Na função principal , inicialize a configuração HRTIM e defina o ciclo de serviço, por exemplo, 22500. Com uma tensão de entrada de 20V e um período de 45000, nosso ciclo de trabalho será de 50% e a saída será de cerca de 10V. Isso não é suficiente para expandir o LED para cheio, mas deve acender e entenderemos se a seção de energia está funcionando, está tudo bem com dt e assim por diante. Comecei tudo na primeira vez:



Você pode ver que todos os cálculos teóricos anteriores foram confirmados. Com um fator de serviço fixo de 50%, a tensão de saída foi simplesmente dividida por 2: 20V -> 10V, 22V -> 11V, 18V -> 9V. Agora vamos tornar a tensão de saída estável e independente da entrada, ou seja, adicionar feedback.

ADC e ajuste do controlador

Muito já foi escrito sobre os ADCs do STM32 antes de mim, apenas me refiro à configuração do gatilho associado ao comparador HRTIM. Vou falar brevemente sobre as configurações restantes da ADC. Examinamos a função de inicialização:

 void InitBasicADC (void) { RCC->AHBENR |= RCC_AHBENR_ADC12EN; RCC->AHBENR |= RCC_AHBENR_GPIOCEN; /************************************************ * Calibration ***********************************************/ ADC2->CR &= ~ADC_CR_ADVREGEN; ADC2->CR |= ADC_CR_ADVREGEN_0; // Vref enable Delay(10); ADC2->CR &= ~ADC_CR_ADCALDIF; ADC2->CR |= ADC_CR_ADCAL; // Start calibration while (ADC2->CR & ADC_CR_ADCAL); // Wait end calibration /************************************************ * Select event trigger and channel ***********************************************/ // Enable start conversion external trigger ADC2->CFGR |= ADC_CFGR_EXTEN_0; // Event 7 - HRTIM ADC2->CFGR |= ADC_CFGR_EXTSEL_0 | ADC_CFGR_EXTSEL_1 | ADC_CFGR_EXTSEL_2; // Select ADC2 channel IN5 ADC2->SQR1 |= ADC_SQR1_SQ1_0 | ADC_SQR1_SQ1_2; // Length regular ADC channel = 1 ADC2->SQR1 &= ~ADC_SQR1_L; ADC2->IER |= ADC_IER_EOCIE; // Interrupt enable NVIC_EnableIRQ(ADC1_2_IRQn); // enable interrupt ADC1 and ADC2 /************************************************ * Start ADC ***********************************************/ ADC2->CR |= ADC_CR_ADEN; // Enable ADC2 Delay(10); ADC2->CR |= ADC_CR_ADSTART; } 

Eu uso o modo de canal regular, tenho apenas um canal e ele é selecionado no registro SQR1 . O número de ADC envolvido 2, ou seja, sua entrada IN5, é rápido e pode operar na frequência máxima de amostragem, mas não desta vez. A frequência de amostragem é igual à frequência PWM, porque 1 período = 1 amostra, em princípio, isso é mais do que suficiente.

Além disso, no registro CFGR , precisamos selecionar o evento pelo qual a conversão será iniciada, ou seja, o Evento 7 , por que exatamente? Nós olhamos no RM:



O gatilho 1 do módulo HRPWM chega ao Evento 7 para o nosso ADC No. 2, que neste caso funciona como escravo, depois é controlado pelo módulo HRPWM. Eu acho que agora está claro como conectar 2 módulos, em princípio, o algoritmo é semelhante para qualquer periferia e qualquer timer, apenas o nome do registro será diferente.

Quando o contador do período do timer mestre for atingido, uma conversão será iniciada, que após cerca de 15 ciclos (para quanto exatamente é exibido no RM) causará uma interrupção e você poderá obter o resultado. É nessa interrupção que organizamos o algoritmo de controle. Sim, dentro da interrupção, algo maciço é melhor não fazê-lo, é melhor definir o sinalizador e transmitir a execução, mas vou me permitir tal simplificação, porque neste caso meu controlador não está particularmente carregado e conseguirá calcular e sair da interrupção com uma probabilidade de 146% para o surgimento de um novo.

Um pouco sobre gerenciamento

Imagine que você entrou no banheiro e decidiu lavar as mãos na pia. Você abre levemente a água, toca com a mão, fria? Adicione mais água quente, mais quente? Bom! Adicione mais água quente? Quase o que você precisa? Bom! Adicione mais água quente, tente com a mão, queime-se? Vamos desligar um pouco o calor agora. Ta bom E assim, para o infinito, você abrirá a torneira até a temperatura da água se tornar ideal. Este é o botão mais fácil!

Somente nós não regulamos a quantidade de água quente, mas o ciclo de trabalho do PWM. Em vez de uma mão, temos um ADC com um resultado medido. Resta apenas implementar a lógica. Calculamos o que o ADC deve produzir na saída de 12V e, usando a condição if , forçaremos nosso controlador a manter esse valor alterando o fator de serviço.

Para começar, vamos desligar um divisor de tensão para reduzir 12V para 2-2,5V, por exemplo, porque O ADC pode medir de 0 a + 3,3V e, se for fornecido 12V, o microcontrolador queimará simplesmente. Portanto, colocarei um divisor com valores nominais de 10 kOhm e 2 kOhm, o que dará uma taxa de divisão de 6 e, portanto, nossos + 12V se transformarão em + 2V. Nosso ADC produzirá o resultado: adcResult = (V out / k) / V ref * 2 12 = (12V / 6) / 3,3 * 4095 = 2481. Agora, escrevemos o código para o manipulador de interrupção:

 void ADC1_2_IRQHandler (void) { ADC2->ISR |= ADC_ISR_EOC; adcResult = ADC2->DR; if (adcResult > 2480) { dutyControl = dutyControl - 10; } else { dutyControl = dutyControl + 10; } SetDutyTimerA(dutyControl); } 

Primeiro de tudo, depois de entrar no manipulador de interrupções, você precisa limpar o sinalizador dessa interrupção; caso contrário, na segunda vez, você não entrará nele. Em seguida, lemos o resultado e o salvamos como uma variável adcResult . Agora, conhecendo a tensão na saída, você precisa ajustar o ciclo de trabalho do PWM, eu implementei isso simplesmente através da condição if . Em cada período do PWM, fazemos uma medição, aumentamos ou diminuímos o ciclo de serviço e definimos o resultado para o próximo período. Tudo é simples, rápido e a essência é visível. Analisamos o resultado do trabalho:



Como você pode ver, tudo funciona e quando a tensão de entrada muda, a saída em si permanece estável em 12V. Muito atencioso pode notar pequenas agulhas deslizando, então você só precisa pendurar a cerâmica X7R na saída de 1-10 microfarads e elas sairão, estou com preguiça de procurá-la e soldá-la. Agora o próprio oscilograma, para não estragar os olhos:



Aqui você pode ver como a tensão de saída aumenta. O fato é que, devido ao algoritmo de controle, para que o preenchimento atinja um valor de 0 a 10000, por exemplo, são necessários mil períodos ou cerca de 10 ms. Combina comigo porque um início suave, se você deseja reduzir o tempo de subida, complica um pouco o algoritmo e adiciona +1000, não +10, e quanto mais perto você chegar dos 12V especificados, menos regulamentação você fará até atingir +10 . Em geral, muitas coisas podem ser feitas em termos de gerenciamento, para que você tenha um campo para experimentos.

Outro ponto interessante é a oscilação no momento do desligamento, como uma "gaita". O fato é que, depois de desligar a energia, minha parte digital continua a trabalhar em outro PSU e tenta manter o valor desejado na saída. De onde vem a energia? Sim, pelo capacitor de entrada, são aqueles que são 1000 microfarads já com 3 peças, este é um fenômeno tão interessante.

Conclusão


O artigo não era pequeno, mas você queria tudo e imediatamente eles dizem que vamos preparar o pedaço de ferro - prepare-o. Espero que você goste do artigo, tentei torná-lo não científico, mas popular, para que o material seja acessível a pessoas com diferentes níveis de conhecimento e experiência. Talvez no futuro eu analise similarmente outras topologias como boost, bridge cheia e outras.

A propósito, este artigo e código servirão para o novo controlador MPPT em 20A, que estou projetando. Agora estou aguardando as placas PCBway , que realmente se ofereceram para patrocinar meus projetos de código aberto com placas de circuito impresso, as fontes MPPT também estarão abertas como para todos os meus módulos.

Eu esqueci a coisa mais importante! Mantenha o projeto com o código para TrueSTDIO - RAR .

Source: https://habr.com/ru/post/pt432778/


All Articles