关于LPC55S6x/LPC55S2x系列ADC通道命名的疑惑与解释
最近在支持客户的时候发现LPC55S6x/LPC55S2x系列,部分型号的ADC通道命名上有点绕,ADC的名称和ADC的通道号并不对应。比如:一个名字叫ADC0_8的ADC通道,软件中应该实际设置的通道号为0。(见:https://blog.csdn.net/k331922164/article/details/103780858)
另外LPC5500系列还存在sideA sideB通道选择的问题,加在一起确实让新上手的用户有点懵。
这篇小文就集中火力解决这个问题。
1、LPC55S6x/LPC55S2x系列ADC
2、LPC5500系列的ADC拥有16位高分辨率,所有LPC55S6x/LPC55S2x系列的ADC都使用相同的ADC模块。 其主要特点有:
·差分模式支持16位或13位分辨率.
·单端模式支持16位或者12位分辨率。
·最多支持10个模拟引脚输入
·可选择的ADC参考源,可以选择VDDA或者VREFP。
每一个ADC通道都拥有16个command buffer, 可以设置选择某几个通道组成一个sequence进行通道转换扫描。
上图是ADC模块的功能框图,这里重点说明下画红框的部分:每个ADC逻辑通道引出了A和B两个复用端口,分别对应差分模式的两个输入端,当使用单端模式时,则可以软件配置到两个不同的引脚,得到两个输入端。这两个复用端口分别称之为A side Mux 或者 B side mux,这样可以大大增强ADC的灵活性,使更多的引脚可以配置为ADC功能。
比如PIO0_16引脚就可以配置为ADC0的CH0B(ADC0模块,ADC逻辑通道0,复用为B side)。这样,在SDK中,想采集PIO0_16引脚上的电压,就可以将PIO0_16引脚设置为模拟输入功能,并且ADC的CH0配置为复用B side, 然后开始转换ADC0的通道0就可以了。
如果这样顺利的话,这篇文章实际上也没有存在的必要了,但是有个小问题的就是手册的命名问题:还是以PIO0_16引脚为例,我们来看看DS(数据手册)和UM(用户手册有关的描述):
看到了吧,这里怎么凭空多出来一个ADC0_8 ?? 是ADC0 通道8么?实际上不是的。
前面提到每个ADC逻辑通道都是双输入端,即A端和B端。在命名上所有通道的A端都是按通道号码编排,即ADC0_0对应通道0的A端,ADC0_1对应通道1的A端;而所有通道的B端,则在A端编号之后再按顺序编排,假定ADC0有8个通道(实际只有5个通道,预留编号空间为后续系列的兼容性),则通道0的B端,就对应ADC0_8,通道1的B端就是ADC0_9,以此类推。
因此,PIO0_16实际上就是复用为ADC0 CH0B(ADC0模块,ADC通道0,复用side B)。大家千万不要以为PIO0_16为ADC0通道8,小编一开始配置的时候就以为是通道8,结果怎么得不到正确的结果。
ADC的其他引脚也可以依照这个例子,主要不要被这个”代号”迷惑就好。这里给出所有DS和UM中有关ADC引脚分配的描述位置,方便大家查阅:
DS: 6. Pinning information 中的Table3: pin assignment 表,列举了每个引脚的复用功能。
UM: Table 704. ADC Inputs Selection &ADC programming: 以ADC通道为第一列列举所有ADC通道对应的复用引脚。
|