AVR Аналого-цифровое преобразование Atmega32

Я делаю некоторую систему, которая измеряет окружающий свет и включает или выключает свет. Для этого я должен использовать микроконтроллер Atmega. Измерение освещенности выполняется с помощью LDR. LDR всегда выводит аналоговое значение, и мне приходится преобразовывать его в цифровое значение с помощью функции АЦП AVR. У меня есть только небольшие познания в программировании микроконтроллеров. Я пишу код, но понятия не имею, как включить релейный переключатель с помощью AVR.

это мой код

#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;
}

Я хочу измерить аналоговые значения с помощью подключенного LDR и преобразовать их в цифровые значения. Затем через какое-то определенное числовое реле должно включиться и

Мне нужно что-то вроде этого

lux = ldr_digital_value

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

Как я могу это сделать ?


person sameera    schedule 16.11.2015    source источник
comment
Вы должны спросить что-то конкретное. Предполагая, что ваш код ADC работает: сохраните результат ADC (из ISR) в глобальную переменную. Затем в while() рассчитайте люкс в зависимости от оборудования и выполните сравнение для переключения порта.   -  person Rev    schedule 16.11.2015
comment
Нет необходимости преобразовывать результат АЦП в строку с itoa. Просто используйте значение напрямую. Вы, вероятно, захотите добавить гистерезис, чтобы предотвратить дребезжание реле, когда уровень освещенности пересекает пороговое значение.   -  person Unimportant    schedule 16.11.2015


Ответы (1)


предполагая ATmega8 (есть некоторые различия между 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;
}
person Ryu    schedule 17.11.2015