2015-12-09 4 views
0

Я пытаюсь создать автоматическую систему полива растений с использованием ATmega16. Логика заключается в том, что датчик будет давать аналоговый вход на PA0, который будет сравниваться с предустановленным значением для включения/выключения водяного насоса.Неправильный вывод в atmega16

Ниже приведен фрагмент кода, который мы использовали:

#include<avr/io.h> 
int adc(void); 
void pump(void); 
int adc_value; 
int main(void) 
{ 
    DDRC=0x01;       //Defining PC0 as output 
    ADCSRA=0x87;     //Setting the mode of operation 
    ADMUX=0x00;      //Selection of channel and bit alignment 
    while(1) 
    { 
    adc_value=adc();    //reading moisture level 
    pump();        //Pump activator routine 
    } 
    return 0; 
} 

int adc(void) 
{ 
    int lower_bits,higher_bits,result; 
    ADCSRA |= (1 << ADSC)|(1 << ADIF); //Turn on conversion and clear flag 
    while(ADCSRA & (1 << ADIF) == 0); //wait for flag 
    lower_bits=ADCL; 
    higher_bits=ADCH; 
    result=lower_bits|(higher_bits<<8);   //Accessing converted value by shifting 
    return result; 
} 

void pump(void) 
{ 
    if(adc_value>=700)        //Pump ON trigger point 
    { 
    PORTC|=(1<<0); 
    } 
    else if(adc_value<=600)      //Pump Off trigger point 
    { 
    PORTC&=~(1<<0); 
    } 
} 

Существует ничего плохого в коде? Потому что после сжигания, я получаю низкое напряжение ** (0,15 **) для влажной почвы и высокого напряжения (4.84) ​​для сухой почвы с аналогового входа датчика, что нормально ... но проблема в том, что я всегда получение напряжения например 0,7 (а иногда и 0,15) на PC0 в обоих случаях (для измерения используется множитель). Там, где нет изменений в значениях для сухой и влажной почвы при PC0 .. в таком случае, где актуальная проблема? Что-то не так в дизайне схемы или в коде?

ответ

0

У вас есть AREF - 5V? Схема подключения с вашего другого аналогичного сообщения не показывает его.

В качестве примечания стороны вы можете использовать ADLAR, выравнивание влево. Тогда вам нужно только взглянуть на один байт, так как в любом случае вы, похоже, не заботитесь о 10 бит точности.

+0

Я не сделал AREF подключенным к 5V. Это обязательно? И еще одно: я не понял строки «В качестве побочной заметки вы можете рассмотреть использование ADLAR, выравнивание влево. Тогда вам нужно только посмотреть один байт, так как вы, похоже, не беспокоитесь о 10 бит точности в любом случае »- проясните это пожалуйста? @UncleO – user3114849

+0

@ user3114849 Причина, по которой я спрашиваю об AREF, заключается в том, что вы выбрали этот параметр в регистре ADMUX, REFS1 = REFS0 = 0. Если вы хотите использовать AVCC, вам нужно выбрать '01' для этих бит и присоединить конденсатор к AREF. – UncleO

+0

@ user3114849 Установка бит ADLAR в один левый выравнивает результат 10-битного АЦП в ADCH и ADCL. Если вас не волнует точность 8 или 10 бит, вы можете установить ADLAR в ADMUX и читать только ADCH, чтобы получить значение от 0 до 255, где 255 для V достигает AVCC (или AREF или 2,56 В, в зависимости от на каком источнике сравнения вы выбрали в ADMUX). Затем вы можете проверить для 'ADCH> = 175' и' ADCH <= 150', игнорируя 2 младших разряда в ADCL. – UncleO

Смежные вопросы