在52832中的adc应该怎么去应用呢?Nordic的芯片中,使用更多的是SAADC(Successive approximation analog-to-digital converter)。nRF52832的ADC支持
(1)8/10/12/14位的ADC采集,而14位是过采样;
(2)具有多达8个通道,支持差分输入和单路输入;
(3)全量程输入范围;
(4)通过软件或PPI通道的任务触发采样,以使低功耗32.768khz RTC或更精确的1/16 MHz定时器在采样频率源上具有充分的灵活性 ;
(5)单通道采样的一次转换模式 ;
(6)扫描模式按顺序采样一系列通道;通道之间的采样延迟是Tack+Tconv,该Tconv可以根据用户的Tack配置而在不同的信道之间变化;
(7)支持使用EasyDMA将样本直接传输到RAM;
(8) 能对单个示例和完整缓冲区事件的中断 ;
比较重要的特点就如上面所列出来的一样。在此次的项目中,我主要使用adc去采集按键的触发和按键值的获取。使用NRF52832SAADC多通道采集,不断通过扫描按键来判断按键是否有事件触发,然后把所获取到的值放入缓冲区,一个一个进行处理。当然了在使用ADC之前需要进行相应的初始化,目的主要是配置ADC和初始化采样通道。
ret_code_t err_code;
nrf_drv_saadc_config_t adc_config; /**< 对ADC进行相应需求的配置*/
adc_config.resolution = NRF_SAADC_RESOLUTION_8BIT; /**< 8位采集*/
adc_config.oversample = NRF_SAADC_OVERSAMPLE_DISABLED; /**< 禁用过采样*/
adc_config.interrupt_priority = SAADC_CONFIG_IRQ_PRIORITY; /**< ADC的中断优先级*/
adc_config.low_power_mode = SAADC_CONFIG_LP_MODE; /**< 低功耗模式*/
err_code = nrf_drv_saadc_init(&adc_config, saadc_callback); /**< 初始化ADC配置*/
APP_ERROR_CHECK(err_code);
nrf_saadc_channel_config_t channel_config = CHN_CONFIG(ADC_P_Chn); /**< 配置采样通道*/
channel_config.pin_p = ADC_P_Chn; /**< 采样引脚*/
err_code = nrf_drv_saadc_channel_init(ADC_P, &channel_config); /**< 通道初始化*/
APP_ERROR_CHECK(err_code);
上述过程就是ADC基本参数的配置和通道的配置。看到我使用了一个saadc的回调函数,在这里函数不做任何的处理,因为我知道采集到的数据是什么,并在其他的函数进行相应的处理。
在采集到数据后,一般会进行ADC转换,那么在nordic中会使用到一个转换函数nrf_drv_saadc_sample_convert();那么进行数据采样后的一般转换处理为:
while(nrf_drv_saadc_is_busy()); /**< 判断ADC是否空闲*/
nrf_drv_saadc_sample_convert(ADC_P,(nrf_saadc_value_t*)&Key_P); /**< 进行ad转换*/
Key_Buffer[ADC_P]=0xff; /**<存进缓冲区内,等待处理*/
当然,ADC对按键采样会通过按键扫描函数来进行,也相当于对其设置了定时器,每当有按键触发时,便对其进行采样。
需要注意的是,不管对哪个引脚进行采样,都需要在.h文件中对其进行配置,并且采样引脚一定要对应于52832中的模拟数字引脚,最后来说一下怎么来配置:
#define CHN_CONFIG(PIN_P) /**< 参数配置*/
{
.resistor_p = NRF_SAADC_RESISTOR_DISABLED,
.resistor_n = NRF_SAADC_RESISTOR_DISABLED,
.gain = NRF_SAADC_GAIN1_6, /**< 1/6采样频率*/
.reference = NRF_SAADC_REFERENCE_VDD4, /**< 参照VDD/4*/
.acq_time = NRF_SAADC_ACQTIME_5US, /**< 响应时间5us*/
.mode = NRF_SAADC_MODE_SINGLE_ENDED, /**< 单端模式*/
.burst = NRF_SAADC_BURST_DISABLED,
.pin_p = (nrf_saadc_input_t)(PIN_P), /**< ADC输入引脚设置*/
.pin_n = NRF_SAADC_INPUT_DISABLED
}
至此,最基本的ADC按键采样就配置好了,后面需要在主函数内进行初始化调用和按键扫描中调用。如有错误,麻烦在下方留言,一起讨论学习。
苦中作乐,欢中犯傻,亦是人生,或亦是生人。