nrf52832 adc使用
1:adc输入范围的计算
需要注意点:
(1):选择参考电压,有以下几种
(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;
4举例子
#define FU_SAADC_RESOLUTION 1024 // 10bit
#define FU_SAADC_REFERENCE 3600 // (in the unit of mV)
uint16_t service_bas_voltage_get(void)
{
ret_code_t err_code;
uint16_t bat_mv;
nrf_saadc_value_t adc_value;
err_code = nrfx_saadc_sample_convert(FU_SAADC_CHANNEL_BATTERY, &adc_value);
APP_ERROR_CHECK(err_code);
bat_mv = adc_valueFU_SAADC_REFERENCE2/FU_SAADC_RESOLUTION;
return bat_mv;
}
3:多路通道11
可以加入QQ群:687360507
与大伙沟通交流,技术在于分享而进步