NRF528xx 芯片外设常用函数与事件速查(七)-----SAADC
一、数模转换SA-ADC
常见的 ADC 的类型有积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型等
nRF52840 集成的是逐次逼近型 ADC,称为 SAADC
SAADC 是利用二分法逐步比较,要完成一次 转换,至少要比较 N 次,所以其转换速度较慢,
同时电路结构也比较简单,功耗较低,适 用于便携式、穿戴式等低功耗应用领域。
SAADC 支持单次模式和扫描模式:
- 单次模式一次采样一个通道。
- 扫描模式按照顺序采样一系列通道。通道之间的采样延迟是 tack + tconv,各个通道之间的采
样延迟可能不一样,因为 tack是软件可配置的。
nRF52840 的 ADC 有 3 种工作模式:单次模式、连续模式和扫描模式。
单次模式:一次采样一个通道
连续模式:定时,多次采用一个通道,不能和扫描模式一起使用
扫描模式:多个通道依次采样一次
-
ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config,//saADC结构体配置
---------------------------------nrf_drv_saadc_event_handler_t event_handler)//事件处理回调函数
作用:初始化saadc
示例:nrf_drv_saadc_init(NULL, nrfx_saadc_event_handler_t);//NULL表示默认配置
---------void nrfx_saadc_event_handler_t(nrfx_saadc_evt_t const * p_event) -
nrfx_err_t nrfx_saadc_channel_init(uint8_t channel,//采样通道号
--------------------------------nrf_saadc_channel_config_t const * const p_config)//通道结构体配置
作用:采样通道初始化
示例://定义ADC通道结构体配置,使用单端采样
----------nrf_saadc_channel_config_t channel_config =NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
----------NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(pin)//通道宏定义配置
----------NRF_SAADC_INPUT_AIN0//模拟输入通道0
----------nrfx_saadc_channel_init(0, &channel_config); -
nrfx_err_t nrfx_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_value)
作用:阻塞式saadc简单采样
示例:nrfx_saadc_sample_convert(0,&saadc_val);//通道号,采样值
---------电压值= 采样值 * 3.6 / 1024 = saadc_val * 3.6 / 1024 -
nrfx_err_t nrfx_saadc_sample(void);
作用:触发采样任务 -
uint32_t nrfx_saadc_sample_task_get(void);
作用:获取采样任务寄存器地址 -
nrfx_err_t nrfx_saadc_buffer_convert(nrf_saadc_value_t * buffer, uint16_t size);
作用:非阻塞式采样,将采样值放到缓存中
示例:static nrf_saadc_value_t m_buffer_pool[SAMPLES_BUFFER_LEN]
----------nrfx_saadc_buffer_convert(m_buffer_pool, SAMPLES_BUFFER_LEN); -
void nrf_saadc_task_trigger(nrf_saadc_task_t task);
作用:触发任务
示例:nrf_saadc_task_trigger(NRF_SAADC_TASK_START); -
uint32_t nrf_saadc_task_address_get(nrf_saadc_task_t task);
作用:获取任务寄存器地址
示例:uint32_t address = nrf_saadc_task_address_get(NRF_SAADC_TASK_START); -
void nrf_saadc_event_clear(nrf_saadc_event_t event);
作用:清除事件
示例:nrf_saadc_event_clear(NRF_SAADC_EVENT_STARTED); -
uint32_t nrf_saadc_event_address_get(nrf_saadc_event_t event);
作用:获取事件寄存器地址
示例:nrf_saadc_event_address_get(NRF_SAADC_EVENT_STARTED);
TASK
NRF_SAADC_TASK_START---------------------//开始采样,结果将存放在缓存中
NRF_SAADC_TASK_SAMPLE--------------------//单次采样,如果启用扫描模式,则每个通道依次采样
NRF_SAADC_TASK_STOP ---------------------//停止采样转换
NRF_SAADC_TASK_CALIBRATEOFFSET-----------//开始偏移自动校准
EVENT
NRF_SAADC_EVENT_STARTED----------------------//开始采样事件
NRF_SAADC_EVENT_END--------------------------//ADC已填满结果缓冲区事件
NRF_SAADC_EVENT_DONE-------------------------//转换任务已完成事件
NRF_SAADC_EVENT_RESULTDONE-------------------//结果已准备好传输到RAM事件
NRF_SAADC_EVENT_CALIBRATEDONE----------------//校准完成事件
NRF_SAADC_EVENT_STOPPED ---------------------//ADC已停止事件
NRF_SAADC_EVENT_CH(n)_LIMITH(n=0-7) ---------//最后的结果等于或大于CH(n)_LIMITH寄存器里的值
NRF_SAADC_EVENT_CH(n)_LIMITL(n=0-7) ---------//最后的结果等于或低于CH(n)_LIMITL寄存器里的值