luanpcs

Relatório 12

Jul 24th, 2021 (edited)
969
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Valor de THRESHOLD
  2. #define THRES 500
  3. void ADC_init(void)
  4. {
  5.   // Configurando Vref para VCC = 5V
  6.   ADMUX = (1 << REFS0);
  7.   /*
  8.     ADC ativado e preescaler de 128
  9.     16MHz / 128 = 125kHz
  10.     ADEN = ADC Enable, ativa o ADC
  11.     ADPSx = ADC Prescaler Select Bits
  12.     1 1 1 = clock / 128
  13.   */
  14.   ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
  15. }
  16. int ADC_read(u8 ch)
  17. {
  18.   char i;
  19.   int ADC_temp = 0; // ADC temporário, para manipular leitura
  20.   int ADC_read = 0; // ADC_read
  21.   ch &= 0x07;
  22.   // Zerar os 3 primeiros bits e manter o resto
  23.   ADMUX = (ADMUX & 0xF8) | ch;
  24.   // ADSC (ADC Start Conversion)
  25.   ADCSRA |= (1 << ADSC); // Faça uma conversão
  26.   // ADIF (ADC Interrupt Flag) é setada quando o ADC pede interrupção
  27.   // e resetada quando o vetor de interrupção
  28.   // é tratado.
  29.   while (!(ADCSRA & (1 << ADIF)));    // Aguarde a conversão do sinal
  30.   for (i = 0; i < 8; i++) // Fazendo a conversão 8 vezes para maior precisão
  31.   {
  32.     ADCSRA |= (1 << ADSC); // Faça uma conversão
  33.     while (!(ADCSRA & (1 << ADIF)));        // Aguarde a conversão do sinal
  34.     ADC_temp = ADCL;         // lê o registro ADCL
  35.     ADC_temp += (ADCH << 8); // lê o registro ADCH
  36.     ADC_read += ADC_temp;    // Acumula o resultado (8 amostras) para média
  37.   }
  38.   ADC_read = ADC_read >> 3; // média das 8 amostras
  39.   return ADC_read;
  40. }
  41. int main()
  42. {
  43.   u16 adc_result0, adc_result1;
  44.   unsigned long int aux;
  45.   unsigned int tensao;
  46.   DDRB = (1 << PB5); // PB5 como saída
  47.   Serial.begin(9600);
  48.   ADC_init(); // Inicializa ADC
  49.   while (1)
  50.   {
  51.     adc_result0 = ADC_read(ADC0D); // lê o valor do ADC0 = PC0
  52.     _delay_ms(50);                 // Tempo para troca de canal
  53.     adc_result1 = ADC_read(ADC1D); // lê o valor do ADC1 = PC1
  54.     // condição do led
  55.     if (adc_result0 < THRES && adc_result1 < THRES)
  56.       PORTB |= (1 << PB5);
  57.     else
  58.       PORTB &= ~(1 << PB5);
  59.     // Mostra o valor na serial
  60.     Serial.print("ADC0: ");
  61.     Serial.println(adc_result0);
  62.     Serial.print("ADC1: ");
  63.     Serial.println(adc_result1);
  64.  
  65.     /*
  66.         CÁLCULO TENSÃO
  67.         aux = (long)adc_result0 * 5000;
  68.         aux /= 1023;
  69.         tensao = (unsigned int)aux;
  70.         Serial.print("TENSAO0: ");
  71.         Serial.println(tensao);
  72.     */
  73.     _delay_ms(50);
  74.   }
  75. }
RAW Paste Data