Fork me on GitHub

19/03/14

PIC: MCP3421

PIC: MCP3421



Neste post mostrarei como trabalhar com o conversor A/D MCP3421 da Microchip.

O MCP3421 é um conversor A/D Delta-Sigma de alta precisão com entradas diferenciais e com até 18 bits de resolução. O dispositivo usa interface de comunicação via I2C e opera com tensões que variam de 2.7V a 5.5V. Executa conversões com taxa de 3.75, 15, 60 ou 240 amostras por segundo. É esta taxa de amostra que define a resolução ( 18, 16, 14, 12 bits ). Também possui um ganho programável do sinal de entrada ( PGA ). O usuário pode selecionar um ganho de 1, 2 ,4 ou 8. O dispositivo tem dois modos de conversão: modo Continuo e modo One-Shot. No modo One-Shot, o dispositivo entra em um modo de espera automaticamente depois de uma conversão.







BIBLIOTECA
MikroC PRO PIC
static union
{
  char Gain:2;
  char SampleRate:2;
  char OC:1;
  char:2;
  char NOT_RDY:1;
} MCP3421ConfigReg;

//sr = 0 ->  240 SPS (12 bits)
//sr = 1 ->   60 SPS (14 bits)
//sr = 2 ->   15 SPS (16 bits)
//sr = 3 -> 3.75 SPS (18 bits)

//ganho = 0 -> 1
//ganho = 1 -> 2
//ganho = 2 -> 4
//ganho = 3 -> 8

void MCP3421_Init( const char address, char ganho, char sr )
{
  MCP3421ConfigReg.Gain = ganho;
  MCP3421ConfigReg.SampleRate = sr;
  MCP3421ConfigReg.OC = 1; //Modo Continuo
  MCP3421ConfigReg.NOT_RDY = 0;
  //Configura o dispositivo
  Soft_I2C_Start();
  Soft_I2C_Write( address );
  Soft_I2C_Write( *(char*)&MCP3421ConfigReg );
  Soft_I2C_Stop();
}

long MCP3421_Read( const char address )
{
long valor = 0;

     //inicia a leitura
     Soft_I2C_Start();
     Soft_I2C_Write( address | 1 );
     //Resolucao de 18 bits: receber 3 bytes
     if( MCP3421ConfigReg.SampleRate == 3 )
     {
         Higher(valor) = Soft_I2C_Read(1);
         Hi(valor) = Soft_I2C_Read(1);
         Lo(valor) = Soft_I2C_Read(0);
         
         if( Higher(valor).B7 ) //Valor negativo
         {
             Highest(valor) = 0xFF;
         }
     }
     //Resolucao de 12, 14, 16 bits: receber 2 bytes
     else
     {
         Hi(valor) = Soft_I2C_Read(1);
         Lo(valor) = Soft_I2C_Read(0);
         
         if( Hi(valor).B7 ) //Valor negativo
         {
             Higher(valor) = 0xFF;
             Highest(valor) = 0xFF;
         }
     }

     Soft_I2C_Stop();

     return(valor >> MCP3421ConfigReg.Gain);
}

EXEMPLO
MikroC PRO PIC
#include <built_in.h>

// 1101xxx0 - xxx endereço ( 0 a 7 )
#define MCP3421_ADDR 0xD0

//Pinos do MCP3421
sbit Soft_I2C_Sda at RB6_Bit;
sbit Soft_I2C_Scl at RB7_Bit;
sbit Soft_I2C_Sda_Direction at TRISB6_Bit;
sbit Soft_I2C_Scl_Direction at TRISB7_Bit;

//Pinos do LCD
sbit LCD_RS at RB0_Bit;
sbit LCD_EN at RB1_Bit;
sbit LCD_D4 at RB2_Bit;
sbit LCD_D5 at RB3_Bit;
sbit LCD_D6 at RB4_Bit;
sbit LCD_D7 at RB5_Bit;
sbit LCD_RS_Direction at TRISB0_Bit;
sbit LCD_EN_Direction at TRISB1_Bit;
sbit LCD_D4_Direction at TRISB2_Bit;
sbit LCD_D5_Direction at TRISB3_Bit;
sbit LCD_D6_Direction at TRISB4_Bit;
sbit LCD_D7_Direction at TRISB5_Bit;

//Copie e cole o código da biblioteca aqui!!!

char string[12];

void main()
{
float tensao;
    CMCON = 7;
    
    //Inicializa LCD
    Lcd_Init();
    Lcd_Cmd( _LCD_CURSOR_OFF );
    Lcd_Cmd( _LCD_CLEAR );

    //Inicializa Comunicação I2C
    Soft_I2C_Init();
    //Inicializa o MCP3421
    //Ganho = 1, Resolucao = 18 bits
    MCP3421_Init( MCP3421_ADDR, 0, 3 );
    
    while(1)
    {
         tensao = (float)MCP3421_Read( MCP3421_ADDR );
         
         tensao *= 15.625; //Para uma resolucao de 18 bits
         FloatToStr( tensao, string );
         
         Lcd_Out( 1, 1, "TENSAO:" );
         Lcd_Out( 2, 1, string );
         Lcd_Out_CP( " uV" );
         
         Delay_ms( 500 );
    }
}

3 comentários:

  1. Ola Tiago. Teria algo sobre mcp3550 e TB algo sobre filtro digital.

    ResponderExcluir
  2. Alguem poderia me dizer o que as linhas:
    return(valor >> MCP3421ConfigReg.Gain);
    Soft_I2C_Write( *(char*)&MCP3421ConfigReg );
    Fazem?
    Sou novo nessa de Pic só não entendi essas duas linhas.
    Grato!

    ResponderExcluir
  3. ola, montei este projeto com o pic18f2480,e estou ligando um temopar tipo k,ele fica variando o tempo todo, não tem uma estabilidade na leitura , será que alguém poderia mim dar uma ajuda.

    ResponderExcluir

Postagens Relacionadas!!