void adc_init(void) //ATMEGA328p
{
//Configurando a tensão de referencia do conversor AD sendo VCC e GND (digital);
//Justificativa esquerda (byte menos significativo do resultado em LOW);
//Configura o canal do conversor AD em AN0 (A0 -> Arduino)
ADMUX = (1<<REFS0); //0B00000001 << 6 => 0B01000000
//ADMUX = 0B01000000;
//OR bit a bit;
//0B10000000 | 0B00000100 | 0B00000010 | 0B00000001
//ADCSRA = 0B10000111
//Habilitar o conversor AD ADEN;
//Stop na conversão AD;
//Prescaler do conversor AD configurado na razão de 1:128;
ADCSRA = (1<<ADEN) |(1<<ADPS2) |(1<<ADPS1) |(1<<ADPS0);
}
uint16_t adc_read( uint8_t ch ) //adc_read(1);logo CH = 1
{
ch &= 0B00000111;
//ch = ch & 0B00000111;
//ch = 0B00000001 & 0B00000111;
//ch = 0B00000001;
//Selecionou apenas o canal do convesor AD; Por exemplo: CH=1
//Garantiu que as demais configurações anteriores fossem mantidas;
ADMUX = (ADMUX & 0xF8) | ch;
//ADMUX = (0B01000000 & 0B11111000) | 0B00000001;
//ADMUX = (0B01000000) | 0B00000001;
//ADMUX = 0B01000001;
//Start na conversão AD;
ADCSRA |= (1<<ADSC); //Máscara OR é utilizada para Setar 1 (|=)
//ADCSRA = 0B10000111 | (1<<6);
//ADCSRA = 0B10000111 | (0B0100000);
//ADCSRA = 0B10000111 | (0B0100000);
//ADCSRA = 0B11000111;
//Aguarda o término da conversão AD;
//Iniciamos a conversão setando o bit ADSC em 1;
//O próprio perifério irá setar em zero quando a conversão for finalizada;
// ADCSRA & (1<<ADSC)
// 0B11000111 & (1<<6)
// 0B11000111 & 0B01000000
// 0B01000000 //VERDADEIRA
while(ADCSRA & (1<<ADSC)); //40 ~ 80 us
//return (ADCW);
return ((ADCH<<8)|(ADCL)); //Concatenando dois bytes, formando assim um 16bits;
}
uint16_t media (void){
unsigned long result = 0;
for (int i = 0 ; i < 40; i++){
result += adc_read(1);
}
return result/40;
}
void setup() {
Serial.begin(115200);
adc_init();
//Serial.println(adc_read(0));//ler o canal AN0
}
void loop() {
//Armazenar 40 amostras do conversor AD e calcular a média.
//O valor médio deverá ser enviado pela Serial;
Serial.println(media());
}