De alguma forma, historicamente, não funcionou para mim com a família STM32F030, há cerca de 5 anos, tentei trabalhar com eles e, por um longo tempo, fiquei surpreso com o trabalho desajeitado da maioria dos periféricos e depois os consertei. E no outro dia, eu ainda tinha que voltar a esta série, era necessário medir por dinheiro mínimo a tensão constante em uma bateria de chumbo (ou montagem de até 4 peças em série) de 8 a 60V com uma precisão não pior que ± 0,1V com baixa frequência de polling.
A solução do problema "frontal" tornou possível medir com precisão a tensão apenas quando o valor da entrada ADC é superior a 1,5 ... 1,6V, ou seja, apenas na segunda metade da faixa, o que significava 30 ... 60V para mim, em vez dos 8 necessários. .60V. O principal problema estava na faixa de 0 ... 1,6V, parecia que meu divisor de tensão estava "flutuando" ou a tensão de referência para o ADC (V
ref ) era extremamente instável.
Era necessário resolver rapidamente o problema, embora não da maneira mais elegante, mas pelo menos sem muletas óbvias. Para fazer isso, primeiro foi necessário estudar o problema e entender de onde as “pernas crescem” e depois eliminar esse problema. Se não der certo, pelo menos contorne-o para obter um dispositivo funcionando e enviá-lo ao cliente.

Essência da tarefa
Em geral, eu venho tentando não resolver esse problema por um longo tempo, mas um parente se voltou para mim e, em período parcial, uma boa pessoa que também trabalha em tópicos próximos a mim - ele coleciona pequenos SES em algum lugar da região de Moscou. Eu não queria recusar, e mesmo naquele momento essa tarefa me pareceu “algumas horas de ferro + algumas horas de código”. O projeto no Altium Designer realmente me levou algumas horas, mas a luta contra o ADC foi iniciada a noite toda, então decidi compartilhar informações para que outros não perdessem tempo.
O dispositivo em si é extremamente simples, o algoritmo é o seguinte:- meça a voltagem na montagem de 1 a 4 baterias de chumbo conectadas em série;
- se a tensão for menor que o "limiar inferior", feche o relé e ligue o gerador, que carrega nossas baterias;
- se a tensão subir acima do "limiar mais baixo + histerese", ou seja, as baterias estiverem carregadas até o limiar definido, desligue o gerador;
- se a tensão estiver acima do "limite superior", proibimos a ativação do gerador por precaução.
Isso é tudo! Exemplo: existe uma bateria de 12V e o inversor é alimentado por ela. Se a tensão cair abaixo do "limiar inferior", o padrão é 10,2V e ligue o gerador. Se a voltagem da bateria aumentar para "limiar mais baixo + histerese", desligue-a. Por padrão, a histerese é configurada para 2V e é necessária para que o gerador a gasolina não seja cortado assim que carregar ligeiramente a bateria para 10,3V. De constante ligar / desligar, o gerador simplesmente morre. Bem, por precaução, proteção: se a tensão da bateria estiver acima de 14,4V, não ligue o gerador exatamente.
O algoritmo é simples e claro, além disso, foi necessário fazer um pequeno menu para que três variáveis pudessem ser alteradas: “limiar inferior”, “histerese”, “limiar superior”. Nada complicado, mas o diabo está nos detalhes.
Inicialmente, a empresa em que o parente trabalha usava um dispositivo chinês com funcionalidade semelhante. Das desvantagens menores - era impossível alterar a histerese, pois a energia precisava de uma fonte adicional de 5V e uma medição de apenas 30V, ou seja, para 1 ou 2 baterias. Dos
grandes desvantagens - o dispositivo chinês às vezes congela e reinicia no momento do início do gerador de gasolina que ele controlava. O último "recurso" acabou de se tornar o motivo da tentativa de abandonar a decisão chinesa.
Eles queriam eliminar todas essas desvantagens de mim e que o preço do dispositivo era igual ao dos chineses, ou seja, US $ 10. A "ninharia diabólica" nesse caso foi que eles queriam comprar um dispositivo acabado de mim por US $ 10 em lotes de apenas 20 a 30 peças, embora fosse estável e com frequência suficiente. Ou seja, eu tive que tornar o dispositivo muito melhor e muito mais barato que os chineses em uma pequena série, também preciso ganhar dinheiro no futuro. Sim, eu também fui engraçado nos primeiros 10 minutos, mas quando percebi essa situação, eu já disse "SIM", ou seja, não havia terra além do Volga para mim ...
Resolução de problemas de ferro
Como escrevi acima, o principal problema é a operação instável do dispositivo durante a partida do gerador. Como resultado, um dispositivo chinês com aliexpress foi comprado para testes e pesquisas. O principal motivo da “demolição da cabeça” acabou não sendo o gerador, mas o relé :)) No momento de alternar a fonte de alimentação, um pulso com uma amplitude de cerca de 25V passava pelo barramento de 3,3V, o que sugeria ... O mesmo foi para os circuitos de sinal. No circuito chinês, para combater esse problema, estavam os diodos LL4148, que bloqueavam o caminho da interferência. Isso acabou sendo suficiente para o dispositivo funcionar normalmente em cima da mesa, mas não em um monte de interferências externas adicionais, como um gerador e outros equipamentos. Para me livrar permanentemente do descrito acima, decidi usar o
isolamento galvânico através de um monte de "optocoupler + dc / dc", que eliminava completamente o contato elétrico e o caminho da interferência entre a bobina do relé de controle e o restante do circuito.

Uma alternativa a essa solução foi o uso de diodos de TVS de proteção em conjunto com uma bobina de modo comum, bem como a complicação do filtro de energia. Mas por que uma fazenda tão coletiva? Colocar dc / dc é mais fácil, mas na prática ficou ainda mais barato - o módulo chinês Mornsun B0505S-1WR2 me custou US $ 0,4 com o custo de uma bobina de modo comum por um pequeno lote de cerca de US $ 0,32.
Como resultado, após tal decisão e teste de protótipo, o dispositivo começou a funcionar como uma espingarda de assalto Kalashnikov e os problemas com a reinicialização desapareceram. Em geral, estou um pouco surpreso que o relé + um pouco o gerador ainda tenha sido forçado a reiniciar o stm-ku, os desenvolvedores chineses, em princípio, fizeram tudo bem: 10 kOhm + 0,1 uF para redefinir, bloqueando capacitores de energia, contas de ferrite, tudo estava, mas acabou sendo o mesmo de qualquer maneira não é suficiente.
O segundo menos dos "chineses" era a necessidade de energia adicional, aparentemente economizada em dc / dc. Resolvi o problema na testa - peguei energia do sinal de entrada, diretamente de um conector. Para fazer isso, basta colocar dc / dc, que digerirá pelo menos 4 * 14,4V, ou seja, 57,6V. Minha escolha caiu no LMR16010PDDAR. Em primeiro lugar, este é o Texas e é isso. Em segundo lugar, os camaradas asiáticos sugeriram que eu carregasse esse chip por um preço muito baixo.
O parágrafo anterior decidiu de maneira abrangente o terceiro menos - a capacidade de conectar até 4 baterias em série. DC / DC digere facilmente 60V, começa a tentar queimar apenas em 72 ... 73V, então o máximo de 57,6V definitivamente não é assustador para ele. O divisor de tensão em geral não se importa com o valor da entrada, então tudo foi decidido com o mínimo esforço.
Você pode ver como tudo isso é implementado no diagrama aqui -
PDF . O esquema é grande o suficiente, então eu não o preenchi com uma imagem. A propósito, em pdf, você também pode ver as dimensões com uma placa de circuito impresso, mas não há nada sobrenatural.
Como resultado, os componentes para 10 dispositivos foram encomendados para o primeiro lote de teste e, após a montagem, ficou assim:

Não foi sem incidentes - quando criei o componente para o módulo dc / dc, misturei as pernas 1 e 2 em alguns lugares, tive que fazer uma pequena fazenda. Embora eu tenha feito isso com mais cuidado nas placas subseqüentes para que ninguém percebesse, a placa da foto permaneceu comigo como uma ferramenta de depuração, apenas para o caso de aprimoramentos de software, se o cliente descobrisse algo durante o teste.
Combate à precisão da ADC
Agora vamos para a parte principal do artigo. Como escrevi no início do artigo, o F030 ADC acabou sendo impreciso, ou seja, até uma tensão de 30 ... 32V na entrada do dispositivo, as leituras flutuaram com um desvio de até 15 ... 20% e o erro desapareceu gradualmente. Uma coisa me agradou - à primeira vista, os desvios tinham alguma regularidade, o que significa que este não é um erro aleatório e você pode acompanhá-lo e tentar corrigi-lo.
Vamos dar um pouco mais de detalhes sobre o erro ... Após a conversão, o ADC envia os dados brutos para o registro
DR , que contém um valor de 0 a 4095 (2
12 ). Para converter esse valor em voltagem, você precisa multiplicá-lo pela etapa de quantização. No meu caso, a tensão no pino do VDDA, da qual o ADC recebe o suporte, foi de 3,3072V e, consequentemente, o passo é de 3,3072V / 4096 = 0,000807V, arredondado para 0,0008. Para obter a tensão na entrada do dispositivo, a tensão obtida precisa ser multiplicada pelo coeficiente do divisor de tensão; no meu caso, o resistor no braço é de 100 kOhm, e no braço de 4,7 kOhm, o que fornece o divisor 22,2765. Com base nisso, a tensão na entrada do dispositivo, ou seja, a tensão da bateria, é encontrada usando a fórmula:
float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = (float)adcData * voltageReference * voltageDivider;
Acontece que, depois de ler os dados
ADC1-> DR , eles são convertidos no tipo
float e simplesmente multiplicados pelos coeficientes, que são constantes, e obtemos o resultado nos volts habituais. Na prática, verificou-se que tudo está muito ruim com precisão.
Lembrando-me da navalha de Hanlon, comecei a procurar o lugar onde havia cometido um erro. Primeiro, verifiquei a tensão na perna do VDDA, pensei que de alguma forma flutua e depende da tensão de entrada, por exemplo, o LDO está com defeito. Armado com um multímetro de mesa, ele monitorou a tensão no VDDA e alterou a tensão de entrada de 8 para 60V, enquanto a tensão na perna do VDDA permaneceu inoperante em 3,3072V, apenas os 2 sinais seguintes flutuaram, o que é muito bom para um medidor linear de 10 centavos.
O próximo local para erro em potencial foi o divisor de tensão. Embora me parecesse estranho que os resistores de Bourns estejam flutuando ± 0,1%, de modo que os dados apresentem um erro de até 20% e esse erro não seja linear. Conduzi o mesmo experimento: medi a tensão após o divisor com um multímetro e alterei a tensão de entrada em etapas de 0,5V e, como resultado, o coeficiente do divisor também foi firmemente fixado em 22,2768.
Nesse momento, começou a se tornar interessante. Havia apenas um componente que eu duvidava - o amplificador operacional LMV611MFX. Este amplificador operacional está incluído como um seguidor de tensão. A tensão ANTES e DEPOIS era a mesma até 4 casas decimais. Estranho ... Pela folha de dados não é ruim e é a mesma TI, duvidei, mas decidi verificar, porque é esse opamp nunca usado. Só para garantir, o meu favorito e testado em vários projetos OPA320, que tenho nas bobinas, foram soldados em seu lugar e ele mostrou o mesmo resultado.
O último componente permaneceu - MK, ou seja, o seu ADC. Ao longo dos anos usando o STM, estou acostumado a confiar nos produtos deles, especialmente porque eu só pego os originais, então pensei na MK por último. A primeira coisa que pensei foi que esqueci de calibrar ou fiz errado. Úteis no manual de referência, eles exigiram não apenas reduzir o ADC escrevendo zero no bit
ADEN , mas também definir 1 para
ADDIS e 0 para
DMAEN . Os últimos 2 passos não foram seguidos, geralmente eu diminuo o ADC e tudo funciona bem, como resultado, corrigi um pedaço de código com calibração:
if (ADC1->CR & ADC_CR_ADEN) { ADC1->CR |= ADC_CR_ADDIS; while (ADC1->CR & ADC_CR_ADEN) {} } ADC1->CR |= ADC_CR_ADCAL; while(ADC1->CR & ADC_CR_ADCAL) {} ADC1->CFGR2 = 0; ADC1->CR = ADC_CR_ADEN; while(!(ADC1->ISR & ADC_ISR_ADRDY));
Infelizmente, não ajudou e decidiu realizar o experimento a seguir ... Eu já verifiquei os coeficientes e eles estão 100% corretos, então aplicarei a tensão da fonte de alimentação do laboratório na entrada, altere-a e exibirei os resultados brutos da medição ADC em um indicador de sete segmentos e compararei com o que deve estar lá com o que você realmente mediu. Como resultado, recebi os seguintes resultados:

Como você pode ver, o gráfico teórico possui excelente linearidade, porque não está ligado ao ferro. O gráfico baseado em dados reais também é quase linear com desvios mínimos. De fato, o gráfico com dados reais pode ser combinado com o gráfico teórico por transferência paralela para uma determinada constante. Falando na linguagem da eletrônica,
o ADC tem um deslocamento!De acordo com os dados em que os gráficos foram construídos, descobri que o ADC tem um deslocamento em diferentes pontos de 71 a 73 etapas. Esse era o problema, mas pensei em “não linearidade” porque o deslocamento de 71 passos em 10V é de cerca de 14% e em 30V já é de 4%. Ou seja, se você construir um gráfico de desvios em%, a dependência terá uma forma exponencial, mas esse gráfico não é interessante.
Decidiu-se que, para esclarecer os resultados, tente introduzir outra variável na fórmula, que alterará meus valores e terá a seguinte forma:
uint16_t offsetVoltage = 72; float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = ((float)(adcData+offsetVoltage))*voltageReference*voltageDivider;
Após essas simples manipulações, meu dispositivo começou a medir com precisão a tensão e os dados pararam de flutuar. Até aquele momento,
ficava em
72 * 0,0008V * 22,2768 = 1,28V , o que é muito crítico no caso de controle de uma bateria. A bateria de chumbo certamente não explode como o íon de lítio, mas ainda bate rapidamente, especialmente se for descarregada constantemente, não para 10,2V, mas para 8,92V.
Aqui está uma história tão pequena sobre um pequeno pedaço de ferro. Espero que alguém ache este material útil ou pelo menos interessante de ler. Tenha cuidado com todos esses ADCs e outras coisas desagradáveis :))
UPD olartamonov pede zelosamente para não enganar as pessoas e usar o código de calibração do manual de referência - fez a alteração com prazer. Infelizmente, no meu caso, isso não mudou a situação e a mudança não foi a lugar nenhum. Provavelmente o problema está no próprio chip.
conforme orientação do Departamento de Estado jogou produtos falsificadosConcorrência
Está
ocorrendo uma
competição entre projetos técnicos entre os camaradas do
PCBway , qualquer um pode participar. As regras são simples. Placas de circuito impresso para o seu projeto serão gratuitas. E o mais importante, prêmios! Estes são alguns documentos em verde com senhores americanos em seu paypal + moeda virtual para os quais você pode solicitar placas de circuito impresso + honra e respeito + a oportunidade de obter uma oferta de emprego em algum lugar fora da CEI :)) Eu recomendo especialmente que os alunos participem, o nível técnico não é muito alto lá , embora, a partir da experiência de concursos anteriores, haja projetos muito fortes, portanto, uma caixa de bricolage “forte” possa facilmente chegar aos vencedores!