求全志R329 LRADC电压设置、识别精度、识别误差、应用等相关知识
本回答来源全志R329 LRADC电压设置、识别精度、识别误差、应用等相关知识
1、LRADC正常工作需要输入的电压是1.8V。但是,最大不能超过1.8V。
2、LRADC最大能检测的电压值是1.35V。所以即使输入的是1.8V,LRADC读出来的还是1.35V。最小能检测的电压是0V,即直接下拉接地。
(LRADC最大能检测的电压值每款芯片可能不一样,有的芯片是1.2V,详情查看user manual)
3、LRADC的分辨率为6bit,即64个数。当最大检测电压为1.35V时,每一档电压为1350/64=21.1mV,即为LRADC最小能检测电压变化范围。
4、分辨率为6bit,精度是为4bit,理论误差为±84mV。但是经过硬件中的误差纠正后,精度可为5bit,即理论误差为±42mV(这个是理论误差,实际误差要比理论的要小,经过测试最大为±30mV左右的误差)。
5、由于这个误差的存在,在将LRADC用作按键的时候需要注意,尽量把两个按键之间的电压间隔设计大一点,这里推荐最小间隔为“120mV”,并且不超过1.2V。(因为当电压超过1.266V后,可认为1.266V~1.35V之间的电压是不准确的。)因此,最大可以设计120mV/240mV/…1200mV等10个档位。
不过,一般在公版上都是设置5个按键档位,硬件设计可参考下图:
LRADC拓展
LRADC精度比较低,一般不推荐用其作为普通ADC使用的。那么,除了作为按键使用的话,还可以用作什么用途呢?
这里还推荐一种使用方式,许多客户可能需要在同个板子上使用多种方案,不同方案只有可能有些模块是不一样的,但是固件又只能出一种。这时候,就可以使用LRADC达到区分方案,从而加载不同dts适配各个方案的目的。
首先,可以在硬件中,不同的方案设置不同电阻上/下拉连接到LRADC,使得不同方案输入到LRADC的电压值不一样。比如说,方案A直接10k电阻上拉到1.8V,方案B通过10k电阻下拉到0V。那么,只需要在uboot里调用lradc读电压接口,再稍做判断即可知道当前硬件是属于什么方案,然后再加载不同dts。
lradc读电压接口代码,在uboot里的路径为:u-boot-2018/board/sunxi/sunxi_lradc_vol.c
首先是调用lradc_data_init()对LRADC进行一个初始化,然后再调用lradc_read_data(u32 reg_base)读取实际的电压值,详情使用方法可以参考下方的sunxi_read_lradc_vol(void)函数。
需要注意的是:
LRADC默认的采样频率要500Hz,即2ms采样一样,而电压data寄存器需要采样8次才能更新一次电压,所以一共需要至少16ms才能准确读取真实的电压。
因此,在调用LRADC初始化后至少30ms后,才能调用用lradc_read_data去读取电压。