
PCF8591 é tanto um conversor analógico-digital (ADC) quanto um conversor digital-analógico (DAC).
Possui 3 pinos (A0, A1, A2) responsáveis pelo seu endereçamento no barramento I2C, permitindo conectar até 8 dispositivos.
Pinagem
- AIN0-AIN3: São as entradas analógicas;
- A0-A2: Pinos de endereçamento;
- AOUT: É a saída anlógica;
- VREF: Tensão de referência das entradas e saídas analógicas;
- AGND: Terra das entradas e saídas analógicas.
Características
- Tensão de operação: 2.5V à 6V;
- Comunicação via I2C;
- Entradas analógicas configuráveis;
- Resolução de 8 bits.
- 4 entradas analógicas;
Funcionamento
O primeiro byte enviado para o dispositivo é o byte de endereço.
O segundo byte enviado para o dispositivo é responsável por habilitar a saída analógica, configurar as entrada analógicas e selecionar o canal analógico.
- Bit 0-1: Seleciona os canais analógicos de 0 a 3;
- Bit 2: Se for igual à
1
, o número do canal analógico é incrementado automaticamente após cada conversão AD. Em toda a leitura o canal selecionado será o canal 0; - Bit 4-5: Define o modo de configuração das entradas analógicas. Veja a figura acima;
- Bit 6: Habilita com
1
a saída analógica.
O terceiro byte enviado, quando quiser usar o DAC, é armazenado no registro do conversor digital-analógico (DAC) e é convertido para o valor correspondende de tensão. O DAC nada mais é do que uma série de resistores formando vários divisores de tensão de até 256 níveis.
A fórmula para o cálculo da tensão de saída é AGND + ((VREF - AGND) / 256) * valor armazenado no DAC
.
O Datasheet indica um erro de compensação de 50mv.
Download
Código
/* | |
PCF8591 - Conversor Analógico-Digital e Digital-Analógico de 8 bits. | |
Autor: Tiago Melo | |
Blog: Microcontrolandos | |
Compilador: MikroC PRO PIC | |
Bibliotecas: Soft_I2C | |
*/ | |
#define PCF8591_ADDR(addr, rw) (0x90 | (addr << 1) | rw) | |
//Pinos do PCF8591. | |
sbit Soft_I2C_Scl at RB0_bit; | |
sbit Soft_I2C_Sda at RB1_bit; | |
sbit Soft_I2C_Scl_Direction at TRISB0_bit; | |
sbit Soft_I2C_Sda_Direction at TRISB1_bit; | |
typedef union { | |
char ad_channel_number : 2; | |
char auto_increment : 1; | |
char : 1; | |
char analog_input : 2; | |
char analog_output_enable : 1; | |
} PCF8591_Control_Byte; | |
static PCF8591_Control_Byte ctrlByte; | |
static char device_address = 0; | |
void PCF8591_Set_Address(char addr) { | |
device_address = addr; | |
} | |
void PCF8591_Set_Input(char input) { | |
//Define a configuração das entradas. | |
ctrlByte.analog_input = input; | |
//Inicio da transmissão. | |
Soft_I2C_Start(); | |
//Enviar o primeiro byte: endereço + modo escrita. | |
Soft_I2C_Write(PCF8591_ADDR(device_address, 0)); | |
//Enviar o segundo byte: byte de controle. | |
Soft_I2C_Write(*(char*)&ctrlByte); | |
//Fim da transmissão. | |
Soft_I2C_Stop(); | |
} | |
void PCF8591_Set_Channel(char channel) { | |
//Não queremos usar o auto incremente. | |
ctrlByte.auto_increment = 0; | |
//Define o canal. | |
ctrlByte.ad_channel_number = channel; | |
//Inicio da transmissão. | |
Soft_I2C_Start(); | |
//Enviar o primeiro byte: endereço + modo escrita. | |
Soft_I2C_Write(PCF8591_ADDR(device_address, 0)); | |
//Enviar o segundo byte: byte de controle. | |
Soft_I2C_Write(*(char*)&ctrlByte); | |
//Fim da transmissão. | |
Soft_I2C_Stop(); | |
} | |
char PCF8591_ADC_Read() { | |
char rdata; | |
//Inicio da transmissão. | |
Soft_I2C_Start(); | |
//Enviar o primeiro byte: endereço + modo leitura. | |
Soft_I2C_Write(PCF8591_ADDR(device_address, 1)); | |
//Descartamos o primeiro byte. Leitura anterior. | |
Soft_I2C_Read(1); | |
rdata = Soft_I2C_Read(0); | |
//Fim da transmissão. | |
Soft_I2C_Stop(); | |
return rdata; | |
} | |
void PCF8591_DAC_Write(char value) { | |
//Habilita a saida analógica. | |
ctrlByte.analog_output_enable = 1; | |
//Inicio da transmissão. | |
Soft_I2C_Start(); | |
//Enviar o primeiro byte: endereço + modo escrita. | |
Soft_I2C_Write(PCF8591_ADDR(device_address, 0)); | |
//Enviar o segundo byte: byte de controle. | |
Soft_I2C_Write(*(char*)&ctrlByte); | |
//Envia o terceiro byte: valor do DAC. | |
Soft_I2C_Write(value); | |
//Fim da transmissão. | |
Soft_I2C_Stop(); | |
} | |
void main() { | |
//Inicia o Soft I2C. | |
Soft_I2C_Init(); | |
//Estou utilizando um dispositivo com endereço 0. | |
PCF8591_Set_Address(0); | |
//Four-Single Ended Inputs. | |
PCF8591_Set_Input(0); | |
while(1) { | |
char analogValue; | |
//Selecionamos o canal 1. | |
PCF8591_Set_Channel(1); | |
//Le o canal 1. | |
analogValue = PCF8591_ADC_Read(); | |
//Gera o valor de tensão igual ao valor lido do canal 1. | |
PCF8591_DAC_Write(analogValue); | |
//Faz nada por 1s. | |
Delay_ms(1000); | |
} | |
} |
You made such an interesting piece to read, giving every subject enlightenment for us to gain knowledge. Thanks for sharing the such information with us
ResponderExcluirangularjs-Training in annanagar
angularjs Training in chennai
angularjs Training in chennai
angularjs Training in online
angularjs Training in bangalore
You made such an interesting piece to read, giving every subject enlightenment for us to gain knowledge. Thanks for sharing the such information with us
ResponderExcluirangularjs-Training in annanagar
angularjs Training in chennai
angularjs Training in chennai
angularjs Training in online
angularjs Training in bangalore
keep up the good work. this is an Assam post. this to helpful, i have reading here all post. i am impressed. thank you. this is our digital marketing training center. This is an online certificate course / digital marketing training in Bangalore
ResponderExcluir