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;