【问题标题】:potentiometer adc practice in atmega128atmega128中的电位器ADC练习
【发布时间】:2018-02-21 02:32:51
【问题描述】:

我是这个领域的初学者。我的目标是根据电位器改变 8 个 LED(连接到 PORTA)的输出。我已经将电位器的中间线连接到PF0,也就是ADC0。我还将另外两条线连接到 5V 和接地。

我知道芯片或连接没有问题,因为 LED 工作正常。

但是无论我如何更改下面的代码(我的意思是稍微更改 ADMUX 和 ADCSRA 寄存器)都不会显示任何输出!

我正在使用带有 16MHZ 时钟的 atmega128。下面是我要解决的代码。

#include <asf.h>
#include <avr/io.h>
#define F_CPU 16000000L

int init_board(void)
{
  DDRA=0xff;
  PORTA=0x01;
}

int ADC_init(void)
{
  //ADCSRA
  ADCSRA = 0b10000111;
  //ADMUX
  ADMUX = 0b01100000; // middle line connected to ADC0
}

int main (void)
{   
  init_board();
  ADC_init();

  ADCSRA |= (ADSC >> 1);
  while(1)
  {
    if(ADSC == 0)
    {
      uint8_t disp_value = ADCL;
      PORTA = disp_value; 
      delay_ms(200);
      ADCSRA |= (ADSC >> 1);
    }
  }
}

我不知道为什么代码不起作用。

我想是因为它没有正确设置我的寄存器,但我已经按照 atmega128 数据表上的所有说明进行操作。

【问题讨论】:

标签: c adc


【解决方案1】:

第一个问题是您的位移,应该是ADCSRA |= (1 &lt;&lt; ADSC)

下一期是结果阅读。您将 ADMUX 的第五位设置为 1,因此 ADLAR=1 并且在该模式下,结果会被调整,因此您应该读取 ADCH。

此外,当您切换到 10 位分辨率时,即开始处理多字节结果时,请注意仅读取 ADCL 是不够的,请参阅数据表 23.3 了解说明:“一旦读取 ADCL,ADC 访问到数据寄存器被阻塞。这意味着如果已经读取 ADCL,并且在读取 ADCH 之前完成了转换,则两个寄存器都不会更新并且转换结果会丢失。当读取 ADCH 时,ADC 访问 ADCH 和 ADCL 寄存器已重新启用。”

最后,使用硬编码延迟进行读取并不是一个好习惯,尤其是当您稍后更改代码以尽可能快地读取 ADC 时。在这种情况下,转换开始后,您应该检查是否设置了 ADIF 标志或在设置 ADEN 时对中断做出反应。详情请参阅数据表。

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2020-04-20
    • 2015-05-01
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多