NORDIC的打怪之旅(第五篇)

  在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按键采样就配置好了,后面需要在主函数内进行初始化调用和按键扫描中调用。如有错误,麻烦在下方留言,一起讨论学习。

  苦中作乐,欢中犯傻,亦是人生,或亦是生人。

你可能感兴趣的:(Nordic)