NRF528xx 芯片外设常用函数与事件速查(七)-----SAADC

一、数模转换SA-ADC
常见的 ADC 的类型有积分型逐次逼近型并行比较型/串并行型Σ-Δ调制型
nRF52840 集成的是逐次逼近型 ADC,称为 SAADC
SAADC 是利用二分法逐步比较,要完成一次 转换,至少要比较 N 次,所以其转换速度较慢,
同时电路结构也比较简单,功耗较低,适 用于便携式、穿戴式等低功耗应用领域。
SAADC 支持单次模式扫描模式:

  • 单次模式一次采样一个通道。
  • 扫描模式按照顺序采样一系列通道。通道之间的采样延迟是 tack + tconv,各个通道之间的采
    样延迟可能不一样,因为 tack是软件可配置的。
    nRF52840 的 ADC 有 3 种工作模式:单次模式连续模式扫描模式
    单次模式:一次采样一个通道
    连续模式:定时,多次采用一个通道,不能和扫描模式一起使用
    扫描模式:多个通道依次采样一次

  1. 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)

  2. 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);

  3. 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

  4. nrfx_err_t nrfx_saadc_sample(void);
    作用:触发采样任务

  5. uint32_t nrfx_saadc_sample_task_get(void);
    作用:获取采样任务寄存器地址

  6. 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);

  7. void nrf_saadc_task_trigger(nrf_saadc_task_t task);
    作用:触发任务
    示例:nrf_saadc_task_trigger(NRF_SAADC_TASK_START);

  8. uint32_t nrf_saadc_task_address_get(nrf_saadc_task_t task);
    作用:获取任务寄存器地址
    示例:uint32_t address = nrf_saadc_task_address_get(NRF_SAADC_TASK_START);

  9. void nrf_saadc_event_clear(nrf_saadc_event_t event);
    作用:清除事件
    示例:nrf_saadc_event_clear(NRF_SAADC_EVENT_STARTED);

  10. 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寄存器里的值

posted @ 2025-05-15 11:36  感兴趣就学  阅读(111)  评论(0)    收藏  举报