Search code examples
cmicrocontrolleravradc

AVR Analog to digital conversion Atmega32


I'm making some system that measure the environment light and turn off or on the light switch. To do this I have to use Atmega micro controller. The light measuring is done using LDR. LDR always output an Analog value and I have to convert it to digital value using AVR's ADC feature. I only have small knowledge in micro-controller programming. I write some code but I have no idea how to turn on relay switch using AVR.

this is my code

#ifndef F_CPU
#define F_CPU 8000000UL
#endif

#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>


int main(void)
{

    ADCSRA |= 1<<ADPS2;
    ADMUX |= 1<<ADLAR;
    ADCSRA |= 1<<ADIE;
    ADCSRA |= 1<<ADEN;
    sei();
    ADCSRA |= 1<<ADSC;
    while(1)
    {


    }
}   

ISR(ADC_vect)
{

    char adcres[4];
    itoa (ADCH, adcres, 10);

    PORTC=0x01; // Turn ON relay switch

    ADCSRA |= 1<<ADSC;
}

I want to measure analog values using attached LDR and convert them in to digital values. Then after some per-define number relay should turn on and

I need somethins like this

lux = ldr_digital_value

if (lux > 5 )
   { PORTC=0x00; }
else
   { PORTC=0x01; }

How can I do that ?


Solution

  • assuming an ATmega8 (there are some differences between avrs)

    #ifndef F_CPU
    #define F_CPU 8000000UL
    #endif
    
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    
    volatile unsigned char lux=0; // the trick is the volatile.
    
    int main(void)
    {
    
        ADCSRA = 1<<ADPS2; //slowest clock, ok
        ADMUX  = 1<<ADLAR; // you want 8 bit only? also channel 0 selected and external VREF.
        // I suggest you to use Internal AVCC or internal 2.56V ref at first
        ADCSRA |= 1<<ADIE; // with interrupts wow!
        ADCSRA |= 1<<ADEN; // enable!
        sei();
        ADCSRA |= 1<<ADSC; // start first convertion
        while(1)
        {
             if (lux > 5 ) //please choose an appropiate value.
                { PORTC=0x00; }
             else
                { PORTC=0x01; }
    
        }
    }   
    
    ISR(ADC_vect)
    {    
        lux =ADCH;    
        ADCSRA |= 1<<ADSC;
    }