Algoritmos DSP com a placa STM32F4Discovery - Parte I

Algoritmos DSP
Este post faz parte da série Algoritmos DSP com a placa STM32F4Discovery. Leia também os outros posts da série:

Em sistemas embarcados, existe uma ramificação de sua aplicação que parece um tanto obscura. DSP ou PDS, que remete a processamento digital de sinais, tem sido um campo a parte e ficado mais para estudo teórico de doutorado e de grandes empresas que fazem uso intensivo de algoritmos DSP. Porém qual o sistema embarcado que nunca precisa daquele filtro digital? Aquele equalizador gráfico feitor por software? Ou mesmo um compensador PID digital (já bem desmistificado com vários artigos aqui no embarcados)? O nosso grande objetivo nesta série é prover alguns exemplos de códigos práticos para utilização no dia a dia quando precisamos que o processador execute algum processamento em dado de entrada.

Para artigos sobre PID, leia os artigos já publicados:

Introdução

Nesta primeira parte da série iremos apresentar a você leitor o kit de desenvolvimento onde iremos testar o código desenvolvido. Lembramos que todo projeto desenvolvido aqui poderá ser portado a outras plataformas realizando as devidas alterações no código dependente da CPU. Além disso, iremos desenvolver nosso projeto configurando nosso processador e algumas rotinas quase obrigatórias para processamento de sinais em tempo real. Como sempre os arquivos para uso estarão disponibilizados num repositório do GitHub.

Placa de desenvolvimento STM32F4Discovery

Esse pequeno, porém versátil, kit comporta um poderoso microcontrolador com core ARM Cortex-M4, fabricado pela ST. Essa placa traz alguns periféricos bem interessantes para uso e a foto desse kit é apresentada na figura 1. Atente que alguns circuitos para nossos exemplos serão montados em um circuito fora da placa.

 fig1

 Figura 1 - STM32F4Discovery

Abaixo listamos um resumo das suas principais características. Mais detalhes, como esquema elétrico, podem ser encontrados no link que disponibilizamos no final do artigo:

  • Microcontrolador de 32 bits STM32F407VGT6 - Núcleo ARM Cortex-M4 com unidade de ponto flutuante, 1 MByte de memória Flash, 192KByte de memória RAM,  frequência máxima de clock de 168MHz;
  • Programador e unidade de debug ST Link - V2 on board, com conector SWD para programação de dispositivo externo;
  • Alimentação externa, ou pela porta USB, requer uma simples fonte de +5VCC;
  • Acelerômetro de três eixos;
  • Microfone digital omnidirecional;
  • Conversor D/A com interface série, possui amplificador de áudio classe D integrado ao chip;
  • Até oito leds, e dois push buttons ;
  • Conector USB para aplicação de usuário;
  • Headers para fácil acesso aos terminais de I/O do microcontrolador.

Essa placa em si nos apresenta um conjunto interessante de periféricos a serem explorados, porém para as experiências aqui apresentadas utilizaremos circuitos externos para adequação dos sinais analógicos que serão gerados. Para o leitor mais curioso e experiente, uma sugestão é ir aplicando os algoritmos aqui desenvolvidos nos periféricos da placa. Sem esquecer de comentar, essa placa de desenvolvimento pode ser comprada pelo custo de menos de 15 dólares, o que torna uma plataforma de aprendizado bem em conta até pra o desenvolvedor mais iniciante.   

Os artigos a seguir foram publicados no Embarcados e utilizaram essa placa de desenvolvimento como base:

Série de Henrique Rossi:

O primeiro projeto

Apresentada a placa onde vamos aplicar os exemplos que serão desenvolvidos ao longo desta série, vamos então desenvolver o esqueleto que será usado para os próximos projetos. A saber, existem basicamente duas formas de processar sinais no meio digital: em tempo real amostra a amostra, ou por blocos. A segunda, amplamente aplicada em sistemas de áudio e simuladores, costuma fazer o uso de recursos avançados do microcontrolador, recorrendo a buffers extensos e ao uso do periférico de DMA (Direct Memory Access). Nas experiências aqui apresentadas utilizaremos o processamento em tempo real, de forma que no momento de chegada de uma nova amostra da fonte de sinal, ela é imediatamente processada e o resultado enviado ao conversor D/A.

Partindo desse princípio, e que sinais processados em domínio digital são obtidos de forma discreta, nosso programa esqueleto terá uma interrupção periódica, cujo tempo de ocorrência será o período da taxa de amostragem desejado. Assim precisaremos de um timer do microcontrolador dedicado a essa tarefa. O periférico selecionado será o SysTick Timer pela sua simplicidade de configuração e a não necessidade de configuração do “bizarro” NVIC para acionamento de sua interrupção. No arquivo EmbarcadosDSP.h serão incluídos todos os módulos desenvolvidos ao longo desta série, e ali também existem os parâmetros de taxa de amostragem e clock da CPU, que são usados para cálculo da recarga do Systick. O leitor poderá alterar da forma que bem desejar, apenas respeitando conceitos teóricos que assumo que o mesmo já tenha tido contato (como o teorema de amostragem de Nyquist-Shannon). Caso não o tenha sugiro a leitura do artigo escrito pelo Frank Puhlmann citado acima.

Já temos a base de tempo para o nosso sistema DSP, precisamos agora de entradas e saídas adequadas à aquisição dos sinais vindos do gerador, e o fornecimento da informação processada igualmente analógica. O microcontrolador contido na placa Discovery possui dois recursos perfeitos à nossa aplicação. São eles os conversores A/D e D/A. O primeiro é configurado para modo de conversão continua, de forma que não precisemos nos preocupar com mais nada a não ser retirar o resultado da conversao do registrador de dados. O D/A é configurado sem o uso da memória FIFO interna, de forma que o valor colocado em seu registrador de dados é imediatamente convertido para analógico.

Assim o ciclo de execução periódico é o da figura abaixo. Bem simples, a “mágica” vai ocorrer dentro das funções que iremos desenvolver:

fig2

Figura 2 : Fluxo de software DSP básico

No nosso primeiro projeto, para verificar se tudo funciona, vamos colocar para executar o gerador digital de sinais que foi publicado aqui no Embarcados (caso queira ler o artigo, clique aqui). Um dos canais irá emitir uma senoide, que será enviada ao conversor A/D. Após convertido, esse sinal será enviado ao outro canal de conversão D/A existente no microcontrolador. Com isso, poderemos prever o comportamento esperado do conversor A/D, bem como ver o resultado na saída. Assim, no nosso projeto esqueleto, podemos desde já incluir os arquivos DDS.c e .h no diretorio do projeto e adicionar em EmbarcadosDSP.h, compilar e rodar o debug (Lembrando a você caro leitor que estou utilizando o Eclipse com GCC como ambiente de desenvolvimento, os arquivos são todos portáveis, mas podem precisar de alguma alteração na hora de configurar o projeto).

Ao rodar o nosso primeiro projeto, o comportamento esperado na saída dos dois D/A deve ser similar ao apresentado na figura 3. Observe que devemos ter duas senoides idênticas onde a pequena diferença de fase entre uma e outra é justificada pelo tempo de captura do A/D e processamento da amostra:

fig3

 Figura 3: Discovery gerando duas senoides pelo DAC

Para esse projeto não é obrigatório, mas interessante, já adotar dois dos circuitos que precisaremos para obter melhor qualidade de sinais emitidos e capturados, assim, externo à placa foi concebido um pequeno front-end analógico de forma apenas adequar o sinal do gerador à entrada analógica do microcontrolador. O circuito é composto por um somador, onde adicionamos uma componente contínua ao sinal responsável para que todo o valor negativo do sinal de entrada fique positivo. Em seguida temos um filtro passa baixas, cuja a função é a de anti-aliasing, ou seja, permitir que apenas frequências até a máxima escolhida do sinal de entrada cheguem ao conversor A/D sem atenuação. Um buffer no final do circuito provê uma fonte de sinal de baixa impedância seja “vista” pela entrada analógica do microcontrolador:

fig4

 Figura 4: Circuito de condicionamento do sinal de entrada

Do outro lado, temos um circuito dotado de um filtro passa-baixas, o qual é chamado de filtro de reconstrução (em ambos os casos a frequência de corte para os filtros foi projetada para ficar em 10KHz). Sua função consiste em atenuar a componente de alta frequência que é igual o valor da taxa de amostragem, com isso consegue - se também “suavizar” as transições entre um valor e outro que o D/A coloca no terminal do microcontrolador. Além disso, novamente um seguidor de tensão coloca essa saída como fonte de baixa impedância sem o risco de estourar o “fan-out” da saída analógica, e por fim um capacitor de bloqueio CC permitindo apenas que a componente CA do sinal chegue ao nosso instrumento de medida. Em ambos os circuitos optei pelo uso do OPA350 como amplificador operacional dado fato de operar com fonte simples e possuir um produto ganho por largura de banda de 38MHz, mais que suficiente para a aplicação:

fig5

 Figura 5 : Circuito de condicionamento do sinal de saída

Iremos parar por aqui nessa primeira parte, mas fiquem ligados! Na próxima parte da série vamos apresentar um dos filtros digitais mais simples, porém efetivos quando o objetivo é remover falsos valores de uma transição de sinais, o filtro de média móvel. Então, até lá!

Materiais de apoio

Repositório do GitHub com o projeto exemplo (GCC + Eclipse + OpenOCD)

Processamento digital de sinais, por Henrique Puhlmann

GNU arm cross toolchain eclipse + freertos + gcc, por Henrique Rossi

Manual dos microcontroladores STM32F4

Manual da placa STM32F4Discovery

Datasheet do microcontrolador STM32F407VGT6

 

Outros artigos da série

Algoritmos DSP com a placa STM32F4Discovery - Parte II >>
Este post faz da série Algoritmos DSP com a placa STM32F4Discovery. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Felipe Neves
Desenvolvedor de sistemas embarcados apaixonado pelo que faz, divide seu tempo entre trabalhar no Venturus desenvolvendo firmware de tudo quanto é coisa, na Aeolus Robotics se envolvendo com o que há de mais legal em robótica e na Overlay Tech desenvolvendo algumas coisas bem legais para o campo de motion control. Possui mestrado em engenharia elétrica pela Poli-USP e possui interesse em tópicos como: Software embarcado, sistemas de tempo real, controle, robótica móvel e manipuladores, Linux embedded e quase qualquer coisa por onde passe um elétron.

4
Deixe um comentário

avatar
 
4 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Filipe CalasansSTM32F4 Discovery | PearltreesMétodo de Tustin, transformando circuitos analógicos em equivalentes digitais para uso em sistemas embarcados - Embarcados - Sua fonte de informações sobre Sistemas EmbarcadosAlgoritmos DSP com a placa STM32F4Discovery - Parte II Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
trackback

[…] Algoritmos DSP com a placa STM32F4Discovery - Parte I. STM32 Discovery Development on Linux. […]

trackback

[…] passagem, sugiro iniciar uma leitura na série de algoritmos DSP com a placa Discovery da ST [3]. Para os já acostumados, aí está o nosso filtro trazido do mundo analógico e pronto para ser […]

Filipe Calasans
Visitante
Filipe

Belo tutorial. Os microcontroladores da ST são muito bons.

trackback

[…] um pouco sobre como codificar blocos de código para uso em processamento digital de sinais. No artigo anterior, fizemos uma pequena revisão sobre o kit  e seu processador, bem como a configuração de todo o […]