在 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)
来表示不携带数据的零位。
我正在尝试为 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)
来表示不携带数据的零位。