Я пытаюсь создать автоматическую систему полива растений с использованием 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 .. в таком случае, где актуальная проблема? Что-то не так в дизайне схемы или в коде?
Я не сделал AREF подключенным к 5V. Это обязательно? И еще одно: я не понял строки «В качестве побочной заметки вы можете рассмотреть использование ADLAR, выравнивание влево. Тогда вам нужно только посмотреть один байт, так как вы, похоже, не беспокоитесь о 10 бит точности в любом случае »- проясните это пожалуйста? @UncleO – user3114849
@ user3114849 Причина, по которой я спрашиваю об AREF, заключается в том, что вы выбрали этот параметр в регистре ADMUX, REFS1 = REFS0 = 0. Если вы хотите использовать AVCC, вам нужно выбрать '01' для этих бит и присоединить конденсатор к AREF. – UncleO
@ 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