当前位置: 代码迷 >> 综合 >> 52832 寄存器配置SAADC中断读取数据
  详细解决方案

52832 寄存器配置SAADC中断读取数据

热度:65   发布时间:2023-10-28 02:33:58.0
  • 52832 SAADC简介

1.ADC类型是逐次迫进型;
2.分辨率分别是8/10/12 bit,使用过采样可以达到14 bit(不能使用于多通道扫描);
3.自带两路EasyDMA可用于数据存储;
4.基准电压配置
使用内部的基准电压(0.6 V)或者VDD/4,还要配置电压增益分别为gain,ADC通道输入电压范围0.6/gain;
在这里插入图片描述
5.使用方式
(1)单次使用
(2)连续转换
(3)过采模式
过采样并不能改善积分非线性(INL)或差分非线性(DNL)。
?使用本地计时器或通用计时器和PPI配置固定采样率以触发SAMPLE任务?从软件触发SAMPLE 2 OVERSAMPLE时间?启用BURST模式CH [n] .CONFIG.BURST可以是 启用以避免将SAMPLE任务设置为OVERSAMPLE次。
当BURST = 1时,ADC将以最快的速度对输入进行2 OVERSAMPLE采样(实际时序:<(t ACQ + t CONV)×2 OVERSAMPLE)。
因此,对于用户而言,它看起来就像转换花费了更长的时间,但除此之外,它类似于单次模式。
(4)扫描模式:多通道扫描
6.采样通道
拥有两个采样通道,可以配置差分电路降低噪声提高精度,CH[x].PSELP为正通道,CH[x].PSELN为负通道;
单通道测量只需配置CH[x].PSELP通道,CH[x].PSELN为NC就会自动接到GND;
一共有8组CH[x]通道可以配置,配置多组就会变成扫描模式,如果多个ADC输入,又不使用扫描模式,就只能就同一组CH[x]通道重新映射ADC引脚。

  • 程序配置
    AnalogInput0单通道采集数据,中断接收数据
    1.通道基本配置
//通道组的基础参数设置NRF_SAADC->CH[0].CONFIG = (SAADC_CH_CONFIG_GAIN_Gain1_6 << SAADC_CH_CONFIG_GAIN_Pos) |(SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) |(SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) |(SAADC_CH_CONFIG_RESN_Bypass << SAADC_CH_CONFIG_RESN_Pos) |(SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) |(SAADC_CH_CONFIG_TACQ_3us << SAADC_CH_CONFIG_TACQ_Pos);// 配置通道NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput0<< SAADC_CH_PSELP_PSELP_Pos;NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELN_PSELN_NC << SAADC_CH_PSELN_PSELN_Pos;//设置分辨率NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_12bit << SAADC_RESOLUTION_VAL_Pos;// 转换数据大小和存放数据的内存地址NRF_SAADC->RESULT.MAXCNT = 1;NRF_SAADC->RESULT.PTR = (uint32_t)&result;// 任务触发采集NRF_SAADC->SAMPLERATE = SAADC_SAMPLERATE_MODE_Task << SAADC_SAMPLERATE_MODE_Pos;// 使能SAADCNRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;//使能中断 NVIC_EnableIRQ(SAADC_IRQHandler);NVIC_SetPriority(SAADC_IRQHandler,1);

在这里插入图片描述
2.启动读取函数

    // 使能中断、启动SAADCZ任务NRF_SAADC->ENABLE =SAADC_ENABLE_ENABLE_Enabled;NRF_SAADC->TASKS_START = 1;while (NRF_SAADC->EVENTS_STARTED == 0);NRF_SAADC->EVENTS_STARTED = 0;// 启动采样NRF_SAADC->TASKS_SAMPLE = 1;

3.中断服务函数

	//等待转换完成if (NRF_SAADC->EVENTS_END != 0) {NRF_SAADC->EVENTS_END     = 0;adc_result              = result;  //result设置内存地址NRF_ADC->TASKS_STOP     = 1;app_sched_event_put(&adc_result,4,s_battery_sched);}//停止任务NRF_SAADC->TASKS_STOP = 1;while (NRF_SAADC->EVENTS_STOPPED == 0);NRF_SAADC->EVENTS_STOPPED = 0;//关闭中断NRF_ADC->ENABLE     = SAADC_ENABLE_ENABLE_Disabled;
  • 与NRF51系列的差别

1.分辨率的提高,NRF51是8/9/10 bit;
2.可以使用差分输入,减少噪声,提高精度;
3.ADC通道引脚电压范围不同
(1).NRF51无论是外部电路1/2或者1/3还是内部电压,基本输入电压范围0-1.2V;
(2).NRF51配置0.6V内部基准电压,使用增益为1/6时,基本输入电压范围0-3.6V,能减少外部硬件分压电路,减少电阻精度带来的误差;
4.NRF52在任务触发采集时,需要加程序NRF_SAADC->TASKS_SAMPLE = 1;来采样,NRF51则直接NRF_ADC->TASKS_START = 1;即可;