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

  • 52832 SAADC简介

1.ADC类型是逐次迫进型;
2.分辨率分别是8/10/12 bit,使用过采样可以达到14 bit(不能使用于多通道扫描);
3.自带两路EasyDMA可用于数据存储;
4.基准电压配置
使用内部的基准电压(0.6 V)或者VDD/4,还要配置电压增益分别为gain,ADC通道输入电压范围0.6/gain;
52832 寄存器配置SAADC中断读取数据_第1张图片
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;
  // 使能SAADC
  NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;
 //使能中断 
	NVIC_EnableIRQ(SAADC_IRQHandler);
	NVIC_SetPriority(SAADC_IRQHandler,1);
  

52832 寄存器配置SAADC中断读取数据_第2张图片
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;即可;

你可能感兴趣的:(NRF5x)