Controlando o SD16A do MSP430F2013 pela I2C

conversor Delta-Sigma
Este post faz parte da série Conversor Delta-Sigma do MSP430. Leia também os outros posts da série:

Caro leitor(a), no último artigo abordei as características e configuração básica do conversor Sigma-Delta SD16A de 16 bits do microcontrolador TI MSP430F2013. Ao final foram apresentados dois exemplos, tornando mais palpável o entendimento dos registradores de configuração do periférico. Entretanto ficou faltando algo um pouco mais prático e a continuação é apresentada neste segundo artigo.

 

Neste artigo apresentarei o microcontrolador MSP430F2013 sendo utilizado da mesma forma que um conversor ADC de 16 bits controlado através da comunicação I2C, podendo ser comparado com o tradicional CI ADS1115 também da TI.

 

Talvez você esteja pensando: “ok, mas o qual o benefício disso?”. Posso listar dois benefícios importantes. Primeiramente aplicar os conceitos em um projeto mais prático. Em segundo lugar, e talvez mais empolgante, é possível configurar nosso dispositivo I2C para desempenhar processos não tão comuns em conversores ADC, principalmente os mais básicos. Tudo dependerá da criatividade do desenvolvedor, mas vai desde adicionar uma rotina para zerar o offset da conversão, até adição de média de N amostras ou mesmo aplicação de filtros digitais no próprio conversor, ou seja, sem sobrecarregar o dispositivo mestre que estiver realizando a leitura das amostras. O céu é o limite, ou melhor, nossos maiores limites são a memória Flash disponível e principalmente a memória RAM, mas com criatividade e bons algoritmos muita coisa é possível.

 

Nesta versão inicial o firmware conta com recursos básicos, que poderão ser expandidos no futuro. Aqui fica o convite para que os interessados(as) contribuam para este projeto através do GitHub.

 

Não irei focar em explicar o código do MSP430 pois tornaria o artigo muito extenso, além disso o código está com comentário em todos os pontos chave.

 

Como dispositivo master irei utilizar o tradicional Arduino Nano/UNO devido à facilidade de lidar com a comunicação serial I2C.

 

Um ponto importante, o Arduino Uno/Nano geralmente é alimentado em 5V, enquanto o MSP430 é alimentado em 3V3. Ou seja, devemos tomar alguns cuidados no interfaceamento para não danificar o MSP430. Como solução decidi utilizar um conversor de nível lógico 5V/3V3.

 

Estes conversores podem ser obtidos com facilidade ou mesmo montados no melhor estilo DIY com alguns transistores MOSFET ou mesmo com BJTs, inclusive abordei esse tipo de condicionamento neste material montado para a SIEEL de 2018. Como abordagem adicional pode-se alimentar os resistores de pull-up do barramento I2C com a menor tensão, neste caso com 3V3, mantendo a compatibilidade entre os dois circuitos. Essa característica é possível devido ao padrão open-drain do protocolo.

 

O esquema de ligação é apresentado a seguir:

 

Esquema de conexão entre os componentes
Figura 01 - Esquema de conexão entre os componentes

 

Tabelas 01 - Pinos/Funções

 

MSP430F2013

Arduino Uno/Nano

SDA (I2C)

P1.7

A4

SCL (I2C)

P1.6

A5

A0+

P1.0

-

A0-

P1.1

-

A1+

P1.2

-

A1-

P1.3

-

A2+

P1.4

-

A2-

P1.5

-

 

O MSP430 foi configurado como um dispositivo slave no endereço 0x0B, mas pode ser modificado de acordo com a preferência ou necessidade. Além do MSP430 e do Arduino Uno/Nano adicionei um conversor ADS1115 para efeito de comparação dos resultados.

 

O protocolo para leitura/configuração do ADC utiliza dois bytes sequenciais, com o primeiro contendo o código/endereço da função/registrador de configuração e o segundo byte contendo o valor que será escrito no registrador.

 

Nem todos os registradores internos do SD16A podem ser totalmente modificados pela I2C já que a mudança de alguns dos bits modifica totalmente a estrutura de funcionamento do dispositivo, por exemplo a interrupção.

 

Até o momento estão implementados os seguintes registradores/endereços:

  • 0xA0 - SD16_CHCTRL_LOW - manipula parte do byte menos significativo do registrador SD16CCTL0 (formato dos dados);
  • 0xA1 - SD16_CHCTRL_HIGH - manipula parte do byte mais significativo do registrador SD16CCTL0 (oversampling, modo de conversão, tipo de entrada);
  • 0xB0 - SD16_IN_CTRL - controla configurações referentes ao canal utilizado (canal, ganho).

 

Um header contém as definições necessárias ao código do MSP430 e também ao dispositivo mestre, no nosso caso o Arduino Uno/Nano.

 

Temos acesso a 3 canais no modo differential ou single-ended, sendo eles o canal 0 (+ P1.0 / - P1.1), 1 (+ P1.2 / - P1.3) e 2 (+ P1.4 / - P1.5). O canal 3 não pode ser utilizado pois compartilha os pinos com a I2C e o canal 4 compartilha pinos com o canal 1. Além disso existem 3 canais internos, sendo o canal 5 útil para medir a tensão Vcc do MSP430, canal 6 conectado ao sensor interno de temperatura e o canal 7 com um curto-circuito permitindo a medição do offset na entrada (interna) do ADC.

 

O pino P1.3 também é utilizado como saída bufferizada da referência de tensão interna caso o canal 1 não esteja sendo utilizado, ou seja, você pode medir qual a real tensão de referência com um multímetro.

 

Nos testes/comparações utilizei uma referência com 4 tensões diferentes, baseada no chip AD584. Para permitir uma comparação justa montei um arranjo de maneira que ambos os ADCs aproveitassem seu range dinâmico de maneira semelhante, ou seja o resultado decimal da conversão de ambos será semelhante. Para isso montei dois divisores de tensão configuráveis com trimpots de 10 kΩ e um capacitor de 100 nF conectado entre o tap central e o terminal negativo da referência. O esquemático deste circuito é apresentado a seguir. É importante lembrar que mesmo no modo diferencial o circuito/tensão que será medido deve estar referenciado ao mesmo GND do dispositivo de medição, caso contrário a medição não retornará o valor correto.

 

Circuito de condicionamento para comparação
Figura 02 - Circuito de condicionamento para comparação
Esquemático do teste comparativo
Figura 03 - Esquemático do teste comparativo

 

Note que neste ponto é mais importante analisar a precisão (estabilidade/variabilidade) do que a exatidão, ou seja, não irei converter os valores decimais (RAW) para a tensão na entrada, nem mesmo tentar “bater” os códigos dos dois conversores, um processo que estaria diretamente relacionado ao processo de calibração.

 

A figura a seguir apresenta o resultado de testes realizados em configurações distintas, no gráfico superior com o MSP430 rodando com o clock de 1 MHz e no gráfico inferior a 16 MHz.

 

Resultado teste Ref 2.5V
Figura 04 - Resultado teste Ref 2.5V

 

Algumas informações que podem ser extraídas deste teste, conforme apresentado a seguir:

 

Dados extraídos do teste usando o SD16A.
Figura 05 - Dados extraídos do teste

 

Através dos gráficos e dos dados extraídos podemos verificar que o comportamento de ambos os ADCs são bastante semelhantes, como esperado. O resultado das conversões realizadas entre os modos Single e Continuous também são consistentes e semelhantes, demonstrando que o processamento adicional do modo Single (pooling do flag de interrupção) não afetou negativamente o ruído de conversão. Além disso nota-se pouca diferença entre a operação em 1 MHz e 16 MHz, deste modo torna-se interessante utilizar a operação em 16 MHz permitindo adicionar novos processamentos sem impactar negativamente no desempenho geral do dispositivo.

 

Para o segundo teste foi conectado um gerador de sinais no lugar da referência de tensão, com o resultado sendo plotado através do Serial Plotter do Arduino IDE, conforme apresentado a seguir.

 

Teste com gerador de sinais
Figura 06 - Teste com gerador de sinais

 

Na porção superior da figura o sinal possui maior amplitude e como os dois sinais são convertidos quase ao mesmo tempo vemos as duas senóides sobrepostas, além da ausência de ruído aparente. Na porção inferior foi utilizado um sinal com pequena amplitude para evidenciar o comportamento de ambos os conversores com relação ao ruído, algo esperado com sinais de pequena amplitude.

 

O código utilizado no Arduino Uno/Nano durante os testes anteriores é apresentado a seguir. Modificando/comentando as definições no início do código é possível selecionar entre os modos single ou continuous.

 

 

Com esses dois artigos foi possível apresentar o SD16A presente em alguns microcontroladores da família MSP430, além de desenvolver uma pequena aplicação prática que pode ajudar em diversas situações.

 

Novamente, encorajo você leitor(a) a contribuir com este projeto através do GitHub, possibilitando que o mesmo ganhe correções ou mesmo novas funcionalidades.

 

Até o próximo artigo.

Outros artigos da série

<< Utilizando o conversor Delta-Sigma do MSP430F2013
Este post faz da série Conversor Delta-Sigma do MSP430. 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.

Deixe um comentário

avatar
 
  Notificações  
Notificar