NRF52832的ADC支持8/10/12/14位ADC采集,具有8个通道,支持差分输入和单路输入。
项目上使用SAADC采集电池电压和温度电阻的阻值,需要用到两路ADC通道;在此项目中,使用NRF52832SAADC多通道采集,通过定时器,间隔500毫秒采集一次数据,放入缓存中,等需要数据时,在处理缓存中的数据,返回数据实现方式如下:
1,定义需要使用到的数据变量。
说明:
(1)#define SAMPLES_IN_BUFFER 2表示有两个SAADC通道采集数据,只有当两个通道都采集了数据,产生中断时间,进入事件回调函数
(2)nrf_saadc_value_t adc_buffer [2] [SAMPLES_IN_BUFFER]定义两个ADC数据转换buff(双缓冲区),这样可以在一边处理数据,一边进行ADC的转换。
2,初始化SAADC
说明;
(1)ADC配置可与配置ADC的采集精度,设置低功耗采集模式,中断优先级等参数。在整体配置SAADC时,我们可以完全使用默认的配置。(我们此时使用采集精度时12位,所以要对其进行修改);使用ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, nrf_drv_saadc_event_handler_t event_handler);进行配置。p_config:配置参数的结构体指针 event_handler:事件回调函数。
(2)配置ADC采集通道,这里我们要使用两个通道分别采集电池电压和温度电阻的电压,所以我们要配置两个通道。
(3)ADC通道配置,使用ret_code_t nrf_drv_saadc_channel_init(uint8_t channel, nrf_saadc_channel_config_t const * const p_config);函数;channel:表示使用的ADC通道 p_config:该通道的配置结构体指针。在通道配置中我们可以配置参考电压,输入增益等,详情参考配置结构体。
(4)ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t size)是用来绑定转换buff,这里我们采用双缓冲机制,所以这里绑定两个缓冲区
(5)ADC转换我们采用定时器触发,所以在此我们创建了一个定时器,在定时器的回调函数中,启动ADC转换。
3、定时器回调函数
说明:
(1)ret_code_t nrf_drv_saadc_sample()启动一次ADC转换,这一次的转换包括配置的所有ADC通道的转换。
4、SAADC回调函数
说明;
(1)在回调函数中,我们首先判断事件类型,如果时缓存区有数据事件类型才开始处理数据。
(2)p_event-> data.done.p_buffer实质就是我们开始定义的ADC数据缓冲区adc_buffer [2] [SAMPLES_IN_BUFFER],通过nrf_drv_saadc_buffer_convert()函数在初始化时绑定。
(3)不同的通道采集的数据,存放在缓存数组的不同下标元素位上存放顺序与我们使用的通道有关,低通道采集的数据存在低下标元素位上例如:。我们使用的channel_7采集电池电压,CHANNEL_1采集温度电阻,p_event-> data.done.p_buffer [0]就时CHANNEL_1转换完成的数据,p_event-> data.done.p_buffer [1]是channel_7转换完成的数据。