Com um bom microcontrolador e o tempo voa rápido ou um osciloscópio de fim de semana

Há algum tempo, o autor dessas linhas se comprometeu a desenvolver um gravador compacto de um sinal analógico unipolar dentro de 3 volts, com a maior velocidade de leitura possível e os menores custos e tamanhos possíveis. Na lista dos custos mais baixos possíveis, também entrei na minha dor de cabeça e escolhi o conhecido STM32F303 para mim. Lembro-me disso, o Cortex-M4 72 megahertz, de uma empresa conhecida, com conversores analógicos-digitais embutidos de 12 bits, bastante ágeis (ADC ou ADC, como desejar) e com uma interface CAN a bordo.


Esses pequenos registradores exigiam várias dezenas. E a presença de um gabinete de microcontrolador com 48 pernas inspirou a esperança de que seria possível chamar esse leitor de compacto. A interface CAN, com a qual eu já tinha um bom relacionamento, me deu a oportunidade de combinar todo esse jazz de uma maneira bastante conveniente.


A velocidade com que, no final, tudo funcionou, mostrou-se bastante adequada para declarar a operacionalidade da abordagem escolhida. Foi possível alcançar uma etapa de amostragem de meio microssegundo. Dor de cabeça e montador não puderam ser evitados, mas quem está se lembrando disso agora?


No entanto, alguns sedimentos permaneceram. Permaneceu o pensamento de que, em termos de velocidade, nem tudo estava espremido.


E agora, a série STM32G4 apareceu recentemente com uma freqüência de clock de até 170 megahertz, com uma opção em um caso pequeno e com quase os mesmos ADCs velozes a bordo, no valor de cinco peças. Era necessário fazer alguma coisa.


Ninguém estava de pé sobre a alma agora e não havia necessidade de se preocupar com prazos e planos.


De fato, se você não pensar sobre isso, poderá aproveitar até o trabalho. Mas, francamente, tive que pensar no tempo. Pensar por muito tempo em pouco tempo (e o que, poeticamente).


O pensamento sugeria que deveríamos começar um pouco do outro lado. Ou seja, devemos prosseguir com o menor tempo de amostragem ADC possível, que, com base na descrição, leva 2,5 ciclos de relógio e atinge 62,5 nanossegundos a 40 MHz (160 MHz / 4). Então, a etapa de amostragem de 100 nanossegundos se sugere. O número é redondo e, mais importante, muito pequeno e bonito, por que não tentar?


Além disso, a placa NUCLEO-G474RE adequada para experimentos apareceu à venda e foi comprada, à qual era razoável adicionar uma placa de ensaio adicional com dois conectores de linha dupla para soldar todos os tipos de fios e peças à placa de ensaio e não estragar a placa principal. Aqui está como parece pronto.



Lá, abaixo, existem vários fios e um resistor com um capacitor, acredite na minha palavra.


Agora você precisa aplicar um sinal elétrico adequado a todos os quatro ADCs de uma só vez e executá-los um após o outro com uma etapa constante (no início, durante a depuração, não muito curto). Por que quatro? De acordo com a descrição, cada ADC gasta 15 ciclos de relógio por conversão, ou 0,025 * 15 = 375 nanossegundos (quase 400). Portanto, na etapa 100, é necessário um transportador de quatro ADCs.


Um circuito RC foi usado como sinal de entrada, ao qual a tensão era simplesmente fornecida a partir do pé do controlador. Eu designei esta perna para controlar o timer TIM5 no modo de pulso único.


O diagrama de fiação mínimo parecia com a imagem abaixo.



ADC1-ADC4 estavam envolvidos. A profundidade de bits pode ser reduzida para um aumento na velocidade, mas 12 bits superam, porque eu não queria perder a precisão das medições. Para iniciar cada ADC na ordem e na etapa necessárias, três temporizadores são usados ​​(TIM2, TIM3, TIM4) e outro temporizador (TIM1) serve para sincronizar os três acima. A Figura 2 abaixo mostra os sinais em torno dos quais tudo é construído.



As setas verdes indicam a borda dos pulsos ao longo dos quais os respectivos conversores ADC1-ADC4 são acionados.


Para obter os 100 nanossegundos planejados, tivemos que diminuir a frequência do relógio para 160 megahertz, para que tudo fosse completamente dividido como deveria. No início, o passo foi definido muito mais lentamente, em 4 microssegundos, para verificar calmamente o funcionamento dos temporizadores, usando interrupções, portas de saída e um osciloscópio. Em seguida, por interrupção, foi depurado e obteve acesso direto à memória. Por fim, apenas uma interrupção é processada - essa é a interrupção do final do trabalho do quarto (último) canal de acesso direto à memória. A figura abaixo mostra as conexões das unidades de hardware envolvidas no processo, bem como quatro buffers de memória de saída.



Dos quatro buffers de memória (na figura à direita), as amostras são coletadas programaticamente em um buffer de resultado.


Nesse controlador, diferentemente do STM32F303, existe uma unidade de comutação de solicitação (DMAMUX), que permite redirecionar um grande número de solicitações de dispositivos periféricos para apenas 16 canais DMA1 e 16 canais DMA2. No manual de referência, as solicitações de saída DMAMUX são contadas a partir de 0 e as entradas dos canais DMA são contadas a partir de 1. Eu não mudei, deixei como na fonte original.


Um timer TIM5 é usado como um gerador de pulso único. Ele fornece um conveniente modo de pulso único. A conveniência reside na possibilidade de definir o tempo antes do início do pulso e definir a duração do próprio pulso. Esse impulso surgiu como mostrado abaixo na imagem, gentilmente fornecido por um osciloscópio alugado.



O oscilograma mostra que o aumento do pulso dura 10 microssegundos, o que significa que ele deve acomodar cerca de 100 amostras.


O projeto foi realizado no IAR 8.4 manualmente (ou seja, sem Cuba e o Baile), mas, espero, será entendido por várias crenças. Você pode vê-lo aqui .


Aqui está uma imagem do conteúdo de um buffer ADC1 separado e do resultado coletado de quatro fontes do buffer na região do início do pulso de entrada.



Mas o conteúdo desses buffers está na região do pico do pulso (onde o valor atinge 2508).



Como você pode ver, 196-95 = 101 contagens foram gastas na seção desde o início do pulso até o pico.


Portanto, a taxa de amostragem é de 10 megahertz. Não funcionou nessa velocidade imediatamente.


Para conseguir isso, tive que parar o processador antes de iniciar o acesso direto à memória (DMA1). É bom que o Cortex-M4 tenha uma instrução WFI de montagem especial (Aguarde interrupções). Se isso não for feito, o processador atrapalhará os pés do DMA e ocupará o barramento com acessos à memória que podem esperar.


Se você aumentar a contagem para 200 nanossegundos, eles pararão de empurrar e curarão pacificamente e felizes.


Se envolvermos o comparador COMP4 em seu trabalho e conectarmos sua entrada positiva (porta PB0) ao sinal de entrada, use o DAC (DAC1) e conectemos sua saída (CH1) à entrada negativa do comparador (dentro do controlador), obteremos um dispositivo de limite com um limite ajustável. As interrupções da operação do comparador permitirão que você inicie o cronômetro geral do relógio TIM1 e obtenha o modo de espera, como em um osciloscópio.

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


All Articles