NRF52832 ADC使用

nrf52832 adc使用

1:adc输入范围的计算
需要注意点:
(1):选择参考电压,有以下几种
NRF52832 ADC使用_第1张图片
(2):增益大小,增益范围有以下几种
NRF52832 ADC使用_第2张图片
2:对输入电压的计算
计算公式如下:输入电压范围=参考电压/增益
Input range = (± 0.6 V or ±VDD/4)/Gain
Input range = (VDD/4)/(1/4) = VDD
Input range = (0.6 V)/(1/6) = 3.6 V

举例:
如果需要测量输入的电压最大只有1.2v,而选择输入的参考电压是0.6v,则需要选择的增益GAIN可为NRF_SAADC_GAIN1_2,这就得到输入电压的大小为1.2v

3:程序配置过程
3.1 adc 初始化驱动

void InitAdc(nrf_saadc_input_t adc_chann)
{
    ret_code_t err_code;

    err_code=nrf_drv_saadc_init(0,saadc_callback);  // ²Î¿¼µçѹÊÇ1.2v
    APP_ERROR_CHECK(err_code);
	nrf_saadc_channel_config_t channel_cfg = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(adc_chann);
   
	err_code=nrf_drv_saadc_channel_init(0,&channel_cfg);
    APP_ERROR_CHECK(err_code);
}

3.2 开始初始化和转化

void StartAdc(nrf_saadc_input_t input,uint8_t times)
{
    static uint8_t first=1; 
	
	if(first)
	{
		first=0;
		InitAdc(input);
	}
	nrf_drv_saadc_buffer_convert(m_buffer_pool, 1);
	nrf_drv_saadc_sample();
  
    busy_ms=0;
	while(true==nrf_drv_saadc_is_busy())
	{
		busy_ms++;
		nrf_delay_ms(1);
	}
}

3.3 adc返回事件

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
    {
		avg_sample = p_event->data.done.p_buffer[0];
		battery_adc_valu = (ADC_valu(avg_sample) + 0);// realy adc src + calibration value.
    }
}

3.4 :计算实际电压值
#define ADC_REF 600 (0.6v的参考电压)
#define ADC_10BIT 1024 (10位ADC)
#define ADC_gain 3 (增益为1/3)

1: 计算实际的电压值

方法1:
#define ADC_valu(ADC_VALUE) ((((ADC_VALUE) *ADC_REF) / ADC_10BIT) * ADC_gain)
其中输入 ADC_VALUE = avg_sample

方法 2:
voltage = (float)avg_sample*3.6/1024;

你可能感兴趣的:(nRF52832_ble)