前言
随着模块在摄像头 汽车行业广泛使用,提高感知精度、实现实时反馈、支持多传感器协同工作以及降低功耗等这些功能越来越重要,ADC功能使用也越来越频繁。
ADC即模拟数字转换器,ADC英文全称(Analog-to-digital converter), ADC能够显著提高感知精度。通过将模拟信号转换为数字信号,ADC能够确保高精度的测量和数据处理。 就比如我们可以将我们生活中的温度、压力、声音这样的模拟信号通过ADC转化为我们可以通过域格模块处理成数字信号。
一、ADC使用的参数
分辨率 :ADC采集模块有8位、10位、12位、16位、24位等。分辨率不同于精度,分辨率相当于最小的刻度。比如参考电压为3.3V,ADC的分辨率为12位,2的12次方为4096,通过计算可得到最小刻度为0.8mV。位数越大,分辨率就越高,得到的采样结果越准确。
域格模块使用的分辨率是12位。
采样率:采样是指在固定的时间间隔内对输入的模拟信号进行读取,获取瞬时的电压值。ADC采样率50K左右
转换速率:将模拟信号转换数字信号所需要的时间,。
通道数:模块支持 2 路 12 位采样 ADC
工作电压:1.8V
二、使用步骤
1.AT 指令查询电压
域格ASR系列模块:
AT+VADC=0 //查询通道0
AT+VADC=1 //查询通道1
域格移芯系列模块:
AT+CADC=0 //查询通道0
AT+CADC=1 //查询通道1
不通过ADC引脚,能读到VBAT的值吗?
是可以的
AT+VBAT
2.ASR系列 opencpu采集电压方法
代码如下(示例):
adcValue = hal_AdcRead(0);
LOG_PRINTF("hal_AdcRead 0 adcValue %d\n", adcValue);
adcValue = hal_AdcRead(1);
LOG_PRINTF("hal_AdcRead 1 adcValue %d\n", adcValue);
// 1602模块支持直接读取电源电压
adcValue = hal_AdcVbatRead();
LOG_PRINTF("hal_AdcVbatRead VbatValue %d\n", adcValue);
UINT16 hal_AdcRead(UINT8 adc_channel);
/*****************************************************************
* Function: hal_AdcRead
*
* Description:
* 该函数用于读取ADC测量电压。
*
* Parameters:
* adc_channel [in] ADC通道。详见引脚说明
*
* Return:
* 0: 未测量到电压或者测量电压为0
* 测量到电压, 单位mv (± 20mv)
*
*****************************************************************/
注:该系列模块只支持0到1.8V采集,误差在± 20mv
3.移芯系列 opencpu采集电压方法
移芯平台支持的电平范围比较广,量程能支持0到3.6V,原理使用两个电阻分压来采集信号是ADC(模数转换器)应用中常见的一种简单且经济的方法,主要用于将较高的输入电压降低到ADC可接受的输入电压范围内。如图:

如代码所示,要保证外部输入最大电压不超过 3.4V,如果输入电压在 3.4V 以内但是超过 1.2V,那就要启用芯片内部分压将电压分到
1.2V 以内。
/量程0-1.2v
ret = yopen_adc_get_volt(YOPEN_ADC0_CHANNEL, &adc_value); //adc_value 0-1200mV
DEMO_ADC_TRACE("========== YOPEN_ADC0_CHANNEL ret %d adc_value %d ==========", ret, adc_value);
yopen_adc_get_volt(YOPEN_ADC1_CHANNEL, &adc_value); //adc_value 0-1200mV
DEMO_ADC_TRACE("========== YOPEN_ADC1_CHANNEL ret %d adc_value %d ==========", ret, adc_value);
/量程0-2.4v
ret = yopen_adc_get_volt_raw(YOPEN_ADC0_CHANNEL, YOPEN_ADC_AIO_RESDIV_RATIO_8OVER16, &adc_value);
DEMO_ADC_TRACE("========== YOPEN_ADC0_CHANNEL RATIO_8OVER16 ret %d adc_value %d ==========", ret, adc_value*16/8);
yopen_adc_get_volt_raw(YOPEN_ADC1_CHANNEL, YOPEN_ADC_AIO_RESDIV_RATIO_8OVER16, &adc_value);
DEMO_ADC_TRACE("========== YOPEN_ADC1_CHANNEL RATIO_8OVER16 ret %d adc_value %d ==========", ret, adc_value*16/8);
/量程0-3.6v //由于aio电气特性, adc输入电压不要超过3.6V,防止芯片损坏
ret = yopen_adc_get_volt_raw(YOPEN_ADC0_CHANNEL, YOPEN_ADC_AIO_RESDIV_RATIO_4OVER16, &adc_value);
DEMO_ADC_TRACE("========== YOPEN_ADC0_CHANNEL RATIO_4OVER16 ret %d adc_value %d ==========", ret, adc_value*16/4);
yopen_adc_get_volt_raw(YOPEN_ADC1_CHANNEL, YOPEN_ADC_AIO_RESDIV_RATIO_4OVER16, &adc_value);
DEMO_ADC_TRACE("========== YOPEN_ADC1_CHANNEL RATIO_4OVER16 ret %d adc_value %d ==========", ret, adc_value*16/4);
当输入电压最大是3V 时,那就启用内部分压选择 YOPEN_ADC_AIO_RESDIV_RATIO_4OVER16参数传递,此时输入电压就被除成 4/16(3V*4/16=0.75V<1.2V,分压系数选择要保证输入电压最大值分压后不能超过 1.2V),分压后给到 ADC 然后以内部参考内部 1.2V 电压进行 ADC 转换得出的结果。最终 ADC 出来的数值要乘上分压系数的倒数进行还原,才是输入电压真实值。
868

被折叠的 条评论
为什么被折叠?



