Métodos para depurar software de microcontrolador em uma unidade elétrica

imagem

Como depurar programas de microcontroladores? O JTAG é obtido, o osciloscópio é de alguns dias / semanas e o programa é depurado. Essa será uma resposta típica e, na maioria dos casos, estará correta ... Mas nem sempre. Os microcontroladores resolvem problemas muito diferentes e, neste artigo, consideraremos o que fazer se você precisar desenvolver um software pesado de baixo nível para controlar qualquer equipamento elétrico de potência, por exemplo, conversores de frequência para motores elétricos, conversores de carga de bateria DC / DC para trens, corretores de energia, servos e etc. Equipamento, onde fluem kiloamperes e kilovolts PWM, onde é contado cada comutação das chaves do inversor IGBT, onde o tempo de resposta do microcontrolador a uma situação anormal é medido em microssegundos e o próprio equipamento em caixas seladas é instalado e operado em algum lugar nas fábricas de Yakutia.Se você quiser saber quais recursos isso impõe aos métodos de depuração, seja bem-vindo ao gato.


Recursos de sistemas de controle de depuração


Quais são os recursos dos microcontroladores (MK) de depuração que executam essas tarefas? Primeiro, quando o MK trabalha com equipamentos de energia, ele não pode ser parado.O MK, com a ajuda do PWM, controla as teclas de força, regula muitos valores em seus corredores - correntes das fases do motor, tensão do link CC, velocidade, posição do corpo de trabalho, etc. Se você parar o MK enquanto trabalha no ponto de interrupção, na melhor das hipóteses o equipamento será desligado devido à proteção do hardware e, na pior das hipóteses, tudo simplesmente explodirá (se os interruptores permanecerem na posição "um" ou com um ciclo de trabalho). Portanto, a maneira clássica de depuração é "percorrer as etapas com o depurador" nessas tarefas. Portanto, você pode executar apenas sobre a mesa “módulos de software completamente não processados ​​antes da primeira inclusão em equipamentos reais.

Em segundo lugar, essa é a complexidade do software de baixo nível. O tamanho da seção do código do programa .text é de 50-200 Kbytes para o código do programa que controla exclusivamente o hardware (sem drivers de comunicação de alto nível etc.) - essa é uma situação típica para um microcontrolador de algum servoconversor industrial. Portanto, microcontroladores da série motorcontrol são usados ​​para essas tarefas, que combinam ao mesmo tempo periféricos muito desenvolvidos, alto desempenho e um tamanho de memória relativamente grande (para MK). Como exemplo de MKs importados, podem ser citados os MK MK32 de 32 bits da série Texas Instruments C2000, do chip doméstico K1921VK01T do NIIET OJSC. O software para esse MK geralmente contém dezenas ou centenas de milhares de linhascódigo C / C ++ otimizado perfeito, que simplesmente não pode ser depurado “piscando um LED”, “imprimindo no UART” ou observando a operação das pernas de um osciloscópio externo.

Em terceiro lugar, o controlador do sistema de controle de acionamento elétrico geralmente fica dentro do conversor de energia, cuja caixa está fechada e às vezes até selada. Portanto, o acesso via JTAG já é um grande problema, mesmo que seja para firmware (com a energia desligada). E um problema ainda mais sério é a depuração JTAG com a energia ligada. Aqui, o JTAG necessariamente isolado galvanicamente e à prova de ruído deve ser usado (usamos para o MK TI JTAG SAURIS com isolamento galvânico interno - caro, mas funciona).

Quarto, nenhum sistema operacional!Podemos prever como algumas pessoas têm a ideia "bem, já que você tem uma tarefa tão difícil, coloque um microcontrolador normal no Linux e escreva aplicativos regulares para ele, atualizando o software a partir de uma unidade flash". Os sistemas de controle de equipamentos de energia são sistemas muito difíceis em tempo real. Não que o Linux, nem todos os sistemas operacionais especializados em tempo real sejam adequados para essas tarefas. Por exemplo, a interrupção do ADC através da leitura e da média dos dados analógicos pode ser causada com uma frequência de até 100 kHz. Ao mesmo tempo, ele conterá apenas uma dúzia ou duas linhas de código - coleta de dados de canais analógicos, algumas verificações das proteções de alta velocidade e saída - tudo, nada mais a fazer. Se você instruir essa interrupção a algum agendador de tarefas do SO, simplesmente sua própria execução consumirá mais recursos. Sem mencionar que, em particular,para Linux, em vez de um chip MK, você precisa colocar mais dois na placa - RAM externa e memória flash, alocando um monte de pernas de cristal preciosas, usar uma placa de seis camadas para a fiação apropriada, obter um tempo de inicialização enorme do MK (às vezes com falta de energia ou um timer de vigilância) comece a trabalhar antes que o mecanismo pare!), tenha problemas com a integridade do sistema de arquivos e muito mais.

Bem, a quinta característica - sistemas de controle de baixo nível para acionamentos elétricos e outros equipamentos de energia (em contraste com tarefas de comunicação em diferentes interfaces, CLPs, controladores de todos os tipos de alarmes, controles remotos, etc.) implementam principalmente algoritmos de sistema de controle automático. Ou seja: a metade do software consiste em vários tipos de estruturas fechadas com controladores PID, blocos de saturação, zonas mortas, tabelas de dependência uma da outra, filtros, observadores, ajustadores de intensidade, planejadores de movimento e outros. Os cálculos nesse software são realizados com uma certa frequência - digamos, a uma frequência de 10 kHz, uma interrupção é acionada e calcula todos os blocos listados, que juntos formam a estrutura de controle de equipamento necessária. Nesses algoritmos, a depuração passo a passo não ajuda - na maioria das vezes, a cada etapa, cada módulo gera o queo que se espera dele - de fato, todos esses filtros, reguladores etc. já foram depurados há anos e há poucas surpresas por lá.Os problemas surgem durante a operação de toda a estrutura como um todo - cada unidade trabalha individualmente e o processo regulatório desejado não ocorre conforme o esperado . E os problemas acabam no ajuste de centenas de parâmetros e coeficientes desses blocos, bem como na estrutura montada a partir deles - pode acontecer que você precise adicionar um novo circuito de estabilização em algum lugar, adicionar um bloco de previsão, restrições, etc. Portanto, essa é outra "pedra no jardim" das mensagens de depuração passo a passo e de impressão: você precisa depurar com mais frequência do que o código do programa, mas a estrutura de controle automática montada. Se alguém tem pouca idéia do que é (estrutura), então aqui está a estrutura mais simples de um controle vetorial sem sensor de um motor síncrono:



Às vezes, cada caixa contém algumas fórmulas e, às vezes, um módulo em uma dúzia ou duas páginas de código. O módulo possui entradas / saídas, além de algumas variáveis ​​de estado (por exemplo, a parte integrante do controlador PI e assim por diante). Quem desejar também poderá ver uma estrutura semelhante na página da Wikipedia . Como o sistema de controle está fechado, a operação incorreta de uma unidade (ou a configuração incorreta) leva à inoperabilidade de toda a estrutura. E descobrir exatamente onde está o problema - isso é outra tarefa.

Como depurar?


Então, o que fazer, como depurar? Um osciloscópio externo? Não vai ajudar. O osciloscópio, é claro, é necessário para depurar alguns problemas puramente de hardware, mas eles só podem ver os valores de entrada e saída do microcontrolador, e centenas de variáveis ​​dentro da estrutura permanecerão nos bastidores. Bem, você verá que a corrente de fase do motor treme estranhamente e a tensão de saída do inversor treme estranhamente. E por que - qual bloco dentro do software MK leva a isso (ou um motor ou sensor de posição ou outra coisa leva a essa curva) - permanece incerto.

Modelo? Sim, esta é uma boa ajuda.Na maioria das vezes, o desenvolvimento de estruturas de gerenciamento complexas começa com a modelagem. Em termos de TAU e na forma de equações diferenciais, o objeto de controle é descrito, o sistema de controle proposto é construído (como na figura acima, por exemplo), e tudo isso é realizado ... bem, quem ama o que, mas o padrão de fato é o Simulink Matlab. Nele, você pode "desenhar" uma estrutura juntamente com um modelo do objeto de controle, usando "loose" na forma de integradores, somadores, funções de transição etc. Você pode usar seu pacote para modelar circuitos elétricos, onde existem chaves IGBT prontas, motores elétricos, resistores, capacitores e muito mais, dando à mercê dos programadores do matlab a implementação do desenho na forma de equações diferenciais e desenhar a própria estrutura de controle na forma de "folhas soltas".E você pode escrever todos os blocos necessários no matlab em C. Este método é conveniente, pois o código do programa depurado no matlab pode ser simplesmente copiado para o microcontrolador. Geralmente, esta etapa segue sempre o “desenho”, quando a estrutura do sistema de controle após um trabalho aproximado de pesquisa em modelagem é mais ou menos formada. Mas frequentemente os parâmetros do objeto são desconhecidos a priori, ou são conhecidos de maneira imprecisa - nunca antes o software que trabalha no modelo começou a funcionar bem no objeto também. Também é impossível colocar "tudo" no modelo - transistores de comutação transitória, saturação do circuito magnético, correntes de Foucault, acoplamento capacitivo, parâmetros flutuantes da temperatura e de exemplo a exemplo, interferência aqui e ali ... E às vezes o objeto de regulação é tão complicado,que é mais fácil desenvolver uma estrutura de controle diretamente na instalação.
, , () - . , , «» – , , - ? ( – , « », ).


Há também vários produtos que permitem "desenhar" programas diretamente para microcontroladores. Incluindo o mesmo Matlab, é possível gerar código C para marcas famosas MK, com base no modelo do Simulink. Alegadamente, você pode desenhar e depurar a estrutura desenhada do sistema de controle no computador do modelo e carregá-la no MK - e pronto, vamos lá! E mesmo esses ambientes permitem depurar estruturas de controle desenhadas diretamente dentro do MK, observar variáveis ​​etc., e nos sites de tais produtos há vários projetos de demonstração para os sistemas mais complexos que são "programados" dessa maneira. Mas como todos os projetos reais ainda estão sendo programados com "mãos" por algum motivo, podemos adivinhar que algo está errado com "desenhar". Mas aqui é até difícil descrever o que exatamente, quando não é, é tudo. O principal argumento contra. Você pressiona um botão em um ambiente de "bem-estar" e espera que o gerador de código faça o resto por você. Para alguns sistemas simples, nos quais o desempenho do MK está "por trás dos olhos", o cronograma de desenvolvimento é muito pequeno e ninguém sabe como programar na empresa que iniciou o projeto ... então sim, você provavelmente pode tentar "desenhar" o programa. Mas se não funcionar como deveria, ou tiver alguma falha muito específica, não haverá mais chance de depuração. E para uma tarefa complexa, em que mesmo quando programar com mãos com desempenho MK sempre é um problema, o desenho não é adequado simplesmente por falta de recursos - qualquer linguagem de programação que seja de nível superior (muito superior ao desenho) gera código de máquina menos ideal. E as otimizações de baixo nível que um programador C fariaesse sistema não será capaz de fazer (calcular blocos da mesma estrutura com relógio diferente, usando os valores em cache do seno e do cosseno, substituindo as funções de divisão pela multiplicação por um valor pré-preparado ou coisas realmente complicadas, comotais etc).

Portanto, você deve escrever seu software e escrever em C. E de uma maneira ou de outra, você precisa depurar seu software, e isso é necessário no objeto. Provavelmente, todo mundo neste ponto do artigo já entendeu que a estrutura de controle pode ser depurada apenas visualizando os oscilogramas de variáveis ​​internas , ou seja, visualizando os gráficos no tempo, como essa ou aquela variável em C muda - digamos, “a saída desse bloco, o quinto da esquerda, simultaneamente com as entradas do terceiro da direita”. Obtendo fotos como esta:

E isso só pode ser feito por meio do próprio microcontrolador. Você não pode simplesmente pegar e colocar a interface de comunicação rápida externa e enviar "up" o valor de alguma variável, o mais rápido possível, e criar um gráfico no sistema de nível superior. Como nenhuma interface de comunicação MK terá tempo para fazer isso com a frequência com a qual transitórios regulados ocorrem. E se você tiver sucesso, todos os recursos do MK irão para a manutenção dessa interface de comunicação. Portanto, eles fazem isso - eles gravam a forma de onda na RAM do MKapenas em uma matriz. Geralmente, muitos pontos não são necessários - basta pegar o momento certo para escrever exatamente os dados: coloque o gatilho certo no início da gravação. E então você pode ver o que esses ou aqueles blocos do sistema de controle estavam divulgando no momento da falha, como estava se desenvolvendo, o que o MK estava tentando fazer. Obviamente, todas as variáveis ​​não podem ser osciladas de uma só vez - mas, na prática, existem suficientes, digamos, quatro matrizes de 256 pontos cada - uma espécie de osciloscópio de quatro canais usando MK. Se o equipamento não funcionar mais de uma vez por semana, a depuração não é um problema - em um experimento, examinamos essas 4 variáveis, no próximo substituímos metade pelas outras, examinamos novamente ... até encontrar uma unidade com defeito ou até remover tudo o que acontece todos os quarteirões e não deixe de ver as "imagens", arranhando o lugar que pensa o que ...

Como filmar esses oscilogramas? Que software pode fazer isso? Que interface de comunicação isso encaminha? Na verdade, a Texas Instruments é, portanto, líder na produção de microcontroladores de controle de motor, pois fez tudo para isso: Code Composer Studio (seu ambiente de desenvolvimento) mais MK em tempo real. O modo em tempo real é quando, através do JTAG, o ambiente de desenvolvimento pode solicitar e gravar dados na memória RAM do MK sem pará-lo. Mesmo não apenas sem parar, mas sem a menor interrupção em seu trabalho. Este modo está disponível em todos os MKs da série C2000, mas requer o JTAG caro e rápido para usá-lo, que o suporta. Mas, além do próprio modo, o MK deve ter algo correspondente na parte traseira do cabo: o ambiente de desenvolvimento do Code Composer Studio é capaz de criar formas de onda prontas para uso.Além disso, no modo mais simples, quando o usuário define o nome da variável C e vê sua mudança no tempo no gráfico, o ambiente solicita dados com a frequência com que pode (geralmente boa, se o Hertz 10) e no modo de exibir o array na memória em forma de onda - ou seja, exatamente o que é descrito acima. , , , Code Composer Studio JTAG .Ao mesmo tempo, o dispositivo pode continuar funcionando como se nada tivesse acontecido. Essa ferramenta foi usada com sucesso por mais de dez anos e, de fato, essa ideologia de depuração (ao que parece, mas posso estar errada) foi proposta pelo Texas. Em todos os seus projetos de demonstração, há um módulo datalogger (que registra matrizes de formas de onda) e os manuais descrevem como usá-lo. A propósito, aqui você precisa jogar uma pedra no jardim do BRAÇO. Eles também têm um modo em tempo real, e nessa arquitetura existem MKs que podem controlar motores elétricos. No entanto, em nenhum ambiente de desenvolvimento, deparei-me com uma função gráfica, mesmo que o modo em tempo real seja suportado. Por exemplo, no Keil é amado por todos, é até impossível alterar normalmente o valor de uma variável em um MK em execução - ele é atualizado constantemente,e o novo valor inserido pelo usuário na janela é apagado ... Sem mencionar nenhum gráfico lá. Talvez alguém nos comentários sugira uma opção de trabalho? Ou é "ninguém precisa" e, portanto, não funciona?

Mas há um problema com esse método de depuração, mesmo através do Code Composer Studio. E esse problema é JTAG. Como foi dito, seu conector nem sempre está disponível e, na maioria das vezes, em equipamentos em execução e nem sequer está disponível. E, francamente, não é muito confortável sentar-se a alguns metros do conversor de megawatts, assistir seus oscilogramas de trabalho e muito concentrado e concentrado para percorrer o botão "parar" do microcontrolador com o mouse, e se um dedo tremer ao longo do caminho? Você sabe como o touchpad é defeituoso ao usar um PWM poderoso? E se o ambiente falhar? E o JTAG? Tudo, broads?
Babakh comum


Além disso, os oscilogramas no ambiente de desenvolvimento são exibidos nos valores "como estão" em C, sem nenhuma escala, em diferentes janelas dos gráficos, sem unidades de medida personalizadas (lembre-se de que neste gráfico 0,342 são volts, eles devem ser multiplicados na mente por 540 para obter unidades físicas, e aqui 1,2 são amperes com uma escala de 800A). E desconfortável e assustador. E, no entanto, nem todos os MKs e ambientes de desenvolvimento podem assistir a oscilogramas! De repente o seu não é o Texas? Portanto, decidimos inventar outra maneira.

Nossa decisão


Na verdade, se não precisamos de depuração passo a passo, qual é o problema? Substituímos tudo o que fazemos através do JTAG por qualquer outra interface de comunicação e criamos nosso próprio shell de nível superior, que cria os gráficos da maneira que queremos. Lucro!

Então nós fizemos. Interface de comunicação que escolhemos CAN, protocolo - CANopen. Porque O CAN é uma interface de comunicação industrial muito boa, resistente a ruídos, possui arbitragem de hardware, acesso não destrutivo ao barramento, confirmação de hardware dos pacotes e, ao mesmo tempo - apenas dois fios e terra. Isso é melhor que todos os RSs e menos monstruoso que a Ethernet (que é bastante exótica no controle de motor MK). Por que abrir? Na verdade, existem dois protocolos comuns para o CAN, que são o J1939 (“automotivo”) e o CANopen (máquinas-ferramenta, automação, sensores, etc.). Não há muita diferença entre eles, mas o CANopen nos pareceu mais flexível, então o implementamos em nossa própria pilha (driver). Quem não sabe nada sobre o CANopen - sua principal função, como muitos protocolos para o MK, é fornecer acesso ao dicionário de objetos (lista de variáveis ​​no C MK) em um endereço específico. Isso pode ser feito de duas maneiras principais:Mensagens SDO do tipo solicitação-resposta, bem como mensagens DOP na forma de valores de envio constantes por timer ou evento (define o nível superior do que enviar e quando). Existem também vários serviços de serviço, como mensagens de emergência, mensagens sobre a presença de dispositivos na rede (pulsação), etc. Não é necessário um assistente na rede: quem deseja - envia, a quem deseja - aceita.

Criamos a pilha CANopen não apenas para MK, mas também para o computador na forma de uma biblioteca. E já em sua base, o Windows escreveu seu próprio ambiente de nível superior. Primeiro, eles simplesmente acessaram as variáveis ​​do dicionário de objetos para que fosse possível examinar e alterar as configurações do sistema de controle (e existem centenas delas, a propósito!), Então eles criaram gráficos consultando periodicamente o parâmetro do dicionário de objetos na rede e adicionaram o carregamento de formas de onda de matrizes MK (além disso, a escolha do que oscilografar também é feita a partir de objetos variáveis ​​do dicionário). Temos tudo a mesma coisa que fornece depuração através do JTAG. Ou não? Não, porque eu também precisava da função de atualizar o software via CAN. Apesar da presença de um gerenciador de inicialização CAN no Texas MK, decidimos fazer o nosso próprio, já que o padrão não era o CANopen e poderia interferir na operação de outros dispositivos na rede enquanto costurávamos um, assim como os dispositivos poderiam interferir no firmware. Além disso, houve problemas com a correção de erros e a perda de mensagens (embora o CAN seja muito bom, às vezes falha e o firmware é uma coisa muito importante para não fazer a verificação ou tentar enviar novamente um pedaço quebrado). Portanto, implementamos nosso “programador” na rede CAN , mas dentro da estrutura do protocolo CANOpen. Agora é tudo. Agora fomos capazes de abandonar completamente o JTAG, usando-o apenas uma vez, para programar um novo MK.

Ao mesmo tempo, essa abordagem abriu novos horizontes de depuração que não tínhamos visto antes. Como criamos o ambiente de nível superior de olho não apenas nos programadores, mas também nas “pessoas comuns”, criamos todos os parâmetros em nomes de idioma russo e documentamos o instalador de cada parâmetro (a documentação não é o ambiente, mas o dispositivo, é claro). E foi benéfico - agora, se houver algum problema com a unidade, você não precisa "puxar" o desenvolvedor- a equipe de atendimento ao cliente, em alguns casos, pode diagnosticar problemas de forma independente. Agora podemos receber um e-mail como “Nossa unidade começou a emitir sons estranhos às vezes; olhei para o oscilograma do sensor de posição, foi o que vi (foto). Eu verifiquei o aterramento da tela, ela caiu, soldou e tudo funcionou como deveria! ” E absolutamente não há necessidade de ir a qualquer lugar ou voar! A segunda "descoberta" - se houver algum problema, pedimos ao cliente que conecte o computador ao equipamento e forneça controle remoto da área de trabalho pela Internet - lançamos nosso ambiente de nível superior, oscilamos tudo, corrigimos os parâmetros / firmware / dizemos que ele quebrou - lucro! Novamente, você não precisa ir a lugar nenhum (o principal é que a Internet esteja nas instalações, pelo menos através de uma rede celular).

Ao longo dos anos, esse programa de nível superior adquiriu pequenas funções, como cogumelos (um processo natural para o software que eles usam). Isso inclui trabalhar com o log de falha do dispositivo, salvar / carregar uma pepita de todos os parâmetros em um arquivo no computador, configurar o painel de controle do dispositivo como um "painel de controle", manter registros de rede em um arquivo e retornar o tráfego de rede CAN por TCP / IP, e firmware / parametrização múltiplos automáticos de dispositivos semelhantes na rede (se houver dezenas de dispositivos, piscar tudo com as mãos é preguiçoso, você precisa de um script), etc.

Bem, agora alguma publicidade. Agora, ela já é uma ferramenta muito poderosa (nós a chamamos de UniCON), que em algumas tarefas parece mais funcional do que um software similar de marcas famosas para configurar suas unidades e dispositivos. Além disso, ele não está ligado a um dispositivo específico - você pode configurar pelo menos uma unidade elétrica, pelo menos um fogão, pelo menos um carregador - apenas o dicionário de objetos é alterado. Agora, em nossa empresa, não vemos a oportunidade de concluir com êxito um novo projeto complexo sem nossas ferramentas de depuração CANopen. Para trabalhar com o UniCON, basta incorporar nossa pilha CANopen no MK, após o que o MK se transforma em um laboratório digital. Temos certeza de que todas as empresas que fabricam sistemas de controle sérios no MK possuem ferramentas de depuração semelhantes. Porém, oferecemos nossa solução CANopen na forma de um produto de software independente, pois é universalmente implementada em termos de independência das funções do dispositivo. Atualmente, implementamos a pilha CANopen com as funções avançadas descritas para o Texas Instruments C2000 MK, seus microcontroladores ARM (por exemplo, a família Concerto) e para o K1921VK01T do NIIET OJSC. Portanto, se você precisar desenvolver um sistema de controle para um acionamento elétrico ou outro objeto de controle complexo, convidamos você a cooperar.



PS:
Nos comentários, aguardamos críticas do formulário "Portanto, existe *** - faz o mesmo e de graça". Como procuramos ferramentas de depuração semelhantes para funcionalidade do ARM por um longo tempo, chegamos a encontrar ambientes de desenvolvimento famosos.

UPD: Graças aos comentários de Indemsys , olekl e LeonidLeninencontramos funções de gráficos em ambientes de desenvolvimento para ARM Keil e STMStudio ao trabalhar com o SWD. No entanto, eles não sabem como exibir uma matriz de dados da memória MK na forma de um gráfico, que é exatamente o necessário para observar os processos velozes dos sistemas de controle (mas o STMStudio pode exibir gráficos com um tempo de amostragem de cerca de 1 ms usando o cache de dados). Também interessante é a ferramenta NXP FreeMaster - na descrição e no propósito, é muito semelhante ao nosso desenvolvimento UniCON, mas com características próprias. Além disso, o Segger J-Link possui sua própria ferramenta de exibição de forma de onda .

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


All Articles