在 PIC 微控制器上使用 ADC 难以理解通道选择?

Struggling to understand channel selection using the ADC on a PIC microcontroller?

我正在尝试为 PIC18F252 微控制器编写一个程序,以使用 ADC 将 3 个模拟信号(在 3 个单独的引脚上)转换​​为数字信号以供程序输出使用。我一直用来帮助我理解 ADC 的指南很有帮助,但我正在努力解决他们将它们放在一起的部分。这是代码:

unsigned int ADC_Read(unsigned char channel)
{
  ADCON0 &= 0x11000101; //Clearing the Channel Selection Bits
  ADCON0 |= channel<<3; //Setting the required Bits
  __delay_ms(2); //Acquisition time to charge hold capacitor
  GO_nDONE = 1; //Initializes A/D Conversion
  while(GO_nDONE); //Wait for A/D Conversion to complete
  return ((ADRESH<<8)+ADRESL); //Returns Result
}

然后你可以调用这个函数并将它赋值给一个变量:

i = (ADC_Read(4)); //store the result of adc in “i”

我的问题是我很难理解代码的位移位部分。我明白为什么以及如何清除通道选择位,但我的努力是理解 'channel<<3',当本例中的通道 = 4 时,如何创建一个二进制值,该值可以与 ADCON0 值进行“或”运算。 有没有人能解释代码有 运行 之后通道的值是什么,如果它以 4 开头,以及在 OR 行之后 ADCON0 的新配置是什么?

我理解每一行我只是在努力弄清楚它们是如何组合在一起的,因为这必须完成 3 次,每次都选择不同的频道,目前我无法分辨这是什么频道设置。

如果参考DataSheet for PIC18F252 第17.0节

给出了ADCON0的定义。这里的第3、4、5位是通道选择位。

代码

  ADCON0 &= 0x11000101; //Clearing the Channel Selection Bits
  ADCON0 |= channel<<3; //Setting the required Bits

将根据功能参数设置从0到7的通道。

在此处引用图片

ADCON0 寄存器如下所示

bit 7-6  A/D Conversion Clock Select bits (ADCON0 bits in bold)
bit 5-3  Analog Channel Select bits
bit 2    GO/DONE
bit 1    Unimplemented
bit 0    ADON

正如您所见,第 5-3 位用作通道 select。位 5-3 被视为 3 位值,因此如果您想要 select 通道 4,即二进制中的 100,您可以将数字 4(100) 向左移动 3 步,将其放置在通道 select 位。

其他答案提供了寄存器的布局。这个答案说明了更改所需位的过程。

首先,我们清除通道位(以及未实现的位 1)。

        7   6   5   4   3   2   1   0
      +---+---+---+---+---+---+---+---+
      | a | b | c | d | e | f | g | h |   Initial state
      +---+---+---+---+---+---+---+---+
      
      +---+---+---+---+---+---+---+---+   (The OP incorrectly
&     | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |   used 0x11000101
      +---+---+---+---+---+---+---+---+   instead of 0b11000101.)
      
      +---+---+---+---+---+---+---+---+
=     | a | b | 0 | 0 | 0 | f | 0 | h |
      +---+---+---+---+---+---+---+---+

接下来,我们需要将频道滑入位 5-3。

      +---+---+---+---+---+---+---+---+
      |(0)|(0)|(0)|(0)|(0)| 1 | 0 | 0 |   4   (Channel in bits 2-0)
      +---+---+---+---+---+---+---+---+

      +---+---+---+---+---+---+---+---+
<< 3  |(0)|(0)| 1 | 0 | 0 |(0)|(0)|(0)|       (Channel in bits 5-3)
      +---+---+---+---+---+---+---+---+

现在,我们可以对它进行 OR 操作。

      +---+---+---+---+---+---+---+---+
      | a | b | 0 | 0 | 0 | f | 0 | h |
      +---+---+---+---+---+---+---+---+

      +---+---+---+---+---+---+---+---+
|     |(0)|(0)| 1 | 0 | 0 |(0)|(0)|(0)|
      +---+---+---+---+---+---+---+---+

      +---+---+---+---+---+---+---+---+
=     | a | b | 1 | 0 | 0 | f | 0 | h |
      +---+---+---+---+---+---+---+---+

我用 (0) 来表示不携带数据的零位。