域格模块使用ADC功能


前言

随着模块在摄像头 汽车行业广泛使用,提高感知精度、实现实时反馈、支持多传感器协同工作以及降低功耗等这些功能越来越重要,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)
*
*****************************************************************/

注:该系列模块只支持01.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 出来的数值要乘上分压系数的倒数进行还原,才是输入电压真实值。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值