【问题标题】:getting wrong output in atmega16在 atmega16 中得到错误的输出
【发布时间】: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


    【解决方案1】:

    您是否已将 AREF 连接到 5V?您其他类似帖子中的接线图未显示。

    作为旁注,您可以考虑使用 ADLAR,左对齐。然后你只需要查看一个字节,因为你似乎并不关心 10 位的精度。

    【讨论】:

    • 我还没有将 AREF 连接到 5V。它是强制性的吗?还有一件事,我不明白“作为旁注,您可能会考虑使用 ADLAR,左对齐。然后您只需要查看一个字节,因为您似乎并不关心 10 位精度无论如何”-请您澄清一下吗? @UncleO
    • @user3114849 我询问 AREF 的原因是您在 ADMUX 寄存器中选择了该选项,REFS1=REFS0=0。如果要使用 AVCC,则需要为这些位选择01,并在 AREF 上连接一个电容。
    • @user3114849 将 ADLAR 位设置为左对齐 ADCH 和 ADCL 中的 10 位 ADC 结果。如果您不关心您的精度是 8 位还是 10 位,那么您可以在 ADMUX 中设置 ADLAR 并只读 ADCH 以获得 0 到 255 之间的值,其中 255 表示 V 达到 AVCC(或 AREF 或 2.56 V,具体取决于您在 ADMUX 中选择了哪个比较源)。然后你可以测试 ADCH&gt;=175ADCH&lt;=150,忽略 ADCL 中的 2 个 LSB。
    • 我选择了 ADMUX=0x00。在这种情况下,我必须将 AREF 连接到 5V 吗?或者是其他东西? @UncleO
    • @user3114849 也许您想要的选项是将 ADMUX 设置为 0x40(或使用 ADLAR 为 0x60)并在 AREF 和 GND 之间连接一个电容器(或者不连接它并接受一点噪音)。传感器的输出范围是多少? 0 至 5V = AVCC?那么 AVCC 是一个很好的参考选择。 AREF 引脚主要用于您似乎没有在应用程序中使用的情况。
    最近更新 更多