【发布时间】:2023-05-07 00:13:01
【问题描述】:
我正在尝试使用 ATmega16 构建一个自动植物浇水系统。逻辑是,传感器将在 PA0 提供一个模拟输入,该输入将与预设值进行比较以打开/关闭水泵。
以下是我们使用的代码片段:
#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),这没问题……但问题是,我总是 在这两种情况下,PC0 处的电压都像 0.7(有时像 0.15)(我使用万用表测量)。 PC0 处的干土和湿土的值没有变化。在这种情况下,实际问题在哪里?电路设计或代码有什么问题吗?
【问题讨论】:
标签: microcontroller avr atmega atmel