应用芯片内置运放放大,单端信号0.2-1V输入AIN0.请问应该怎么配置ADC寄存器。PGA1增益1,PGA2增益1?
AINP:AIN0, AINN: Vrefp/2.
在例程上改,输入电压没有线性,一会儿高,一会低,请问怎么回事?
// #define FILTER_LOW_LATENCY_ENABLE
#define FILTER_SINC2_ENABLE
// #define FILTER_SINC3_ENABLE
adc_config_t adc_config;
pga_config_t pga_config;
vref_config_t vref_config;
/*****************************************************************************
-
[url=home.php?mod=space&uid=2666770]@Brief[/url] 初始化ADC24
-
[url=home.php?mod=space&uid=3142012]@param[/url] 无
-
[url=home.php?mod=space&uid=1141835]@Return[/url] 无
****************************************************************************/
void csadc24_init(void)
{
/ Clock enable /
// __RCU_AHB_CLK_ENABLE(RCU_AHB_PERI_GPIOA);
__RCU_APB1_CLK_ENABLE(RCU_APB1_PERI_ADADC);
__RCU_FUNC_ENABLE(LRC2_CLK);
/ adc clock = LRC2(1.024MHz) */
rcu_adcclk_config(RCU_ADCLK_CFG_LRC2);
if(rcu_lrc2_stabilization_wait() == ERROR)
{
printf("LRC2 not ready\r\n");
/* Stop here */
while(1);
}
else
{
printf("LRC2 ready\r\n");
}
// 初始化ADC24
adc_def_init(ADC1);
// - Inner-vref must soft start
adc_vref_soft_start(ADC1);
// - Config SDADC
adc_config_struct_init(&adc_config);
adc_config.abandont_num = ADC_ABANDONT_DATA_4;
adc_config.average_num = ADC_AVERAGE_NUM_16;
adc_config.convert_mode = ADC_SINGLE_CONVERT_MODE;
adc_config.data_rate = ADC_DATARATE_MODE_4;
adc_config.gain_select = ADC_GAIN_1;
adc_config.ovrwr_mode = ADC_DATA_OVER_WRITE;
adc_config.power_mode = ADC_HIGH_POWER_MODE;
adc_config.rst_num = ADC_RST_CYCLE_2048;
adc_config.setup_time = ADC_SETUP_TIME_CYCLE_2048;
adc_init(ADC1, &adc_config);
// - Config PGA
pga_config.din_select = PGA_BOTH_PMOS_NMOS;
pga_config.pga1_enable = ENABLE;
pga_config.pga_chop = PGA_CHOP_DISABLE;
pga_config.pga_gain = ADC_PGA_GAIN_1;
adc_pga_init(&pga_config);
// - Config VREF
vref_config.buffer_enable = ENABLE;
vref_config.driver = ADC_VREF_DRV_MAX_5MA;
vref_config.ref_select = ADC_REF_SELECT_INNER_2P048V;
vref_config.vref_enable = ENABLE;
adc_vref_init(&vref_config);
// - Filter selected
adc_digital_filter_select(ADC1, ADC_FILTER_LOW_LATENCY);
// - trigger config -- software start
adc_trigger_config(ADC1, ADC_TRIGGER_MODE_SOFT, ADC_TRIGGER_SRC_RTC);
adc_chop_freq_set(ADC1,ADC_CHOP_DIV_256);
// - Swicth filter and Inner channel for calibrate.
// - Get adc convertion value.
}
static float adc_data_convert_low_latency(uint32_t adc_data)
{
double convt_data = 0;
if(adc_data & 0x800000)
{
adc_data = (~(adc_data & 0xFFFFFF))+1;
adc_data &= 0x00FFFFFF;
convt_data = (double)adc_data * 1.0235074 * 2.048 / 0x7FFFFF;
// printf("adc_data %x, adc convert value -%fV \r\n", adc_data,convt_data);
}
else
{
adc_data &= 0x00FFFFFF;
convt_data = (double)adc_data * 1.0235074 * 2.048 / 0x7FFFFF;
// printf("adc_data %x, adc convert value +%fV \r\n", adc_data,convt_data);
}
return (float)convt_data;
}
static float adc_data_convert_sinc2(uint32_t adc_data)
{
double convt_data = 0;
if(adc_data & 0x800000)
{
adc_data = (~(adc_data & 0xFFFFFF))+1;
adc_data &= 0x00FFFFFF;
convt_data = (double)adc_data * 0.8192 * 2.048 / 0x7FFFFF;
}
else
{
adc_data &= 0x00FFFFFF;
convt_data = (double)adc_data * 0.8192 * 2.048 / 0x7FFFFF;
}
return (float)convt_data;
}
static float adc_data_convert_sinc3(uint32_t adc_data)
{
double convt_data = 0;
if(adc_data & 0x800000)
{
adc_data = (~(adc_data & 0xFFFFFF))+1;
adc_data &= 0x00FFFFFF;
convt_data = (double)adc_data * 1.0485755 * 2.048 / 0x7FFFFF;
// printf("adc_data %x, adc convert value -%fV \r\n", adc_data,convt_data);
}
else
{
adc_data &= 0x00FFFFFF;
convt_data = (double)adc_data * 1.0485755 * 2.048 / 0x7FFFFF;
// printf("adc_data %x, adc convert value +%fV \r\n", adc_data,convt_data);
}
return (float)convt_data;
}
/*****************************************************************************
- @brief 获取ADC24转换数据
- @param 无
- @return 转换数据float类型
****************************************************************************/
float get_adc_data(void)
{
float adc_data = 0.0f;
#ifdef FILTER_LOW_LATENCY_ENABLE
/ ADC_FILTER_LOW_LATENCY Outer channel P:ADCIN1 N:ADCIN0 */
printf("ADC_FILTER_LOW_LATENCY Outer channel P:ADCIN1 N:ADCIN0: \r\n");
adc_channel_config(ADC1, ADC_INPUT_CHANNEL_0, ADC_INPUT_CHANNEL_14);
adc_conversion_start(ADC1);
while(!__ADC_FLAG_STATUS_GET(ADC1, ADC_FLAG_DATA_EOCH));
adc_data = adc_data_convert_low_latency(__ADC_CONV_VALUE_GET(ADC1));
#endif
#ifdef FILTER_SINC2_ENABLE
/* ADC_FILTER_SINC2 Outer channel P:ADCIN1 N:ADCIN0 */
adc_channel_config(ADC1, ADC_INPUT_CHANNEL_0, ADC_INPUT_CHANNEL_14);
adc_conversion_start(ADC1);
while(!__ADC_FLAG_STATUS_GET(ADC1, ADC_FLAG_DATA_EOCH));
adc_data = adc_data_convert_sinc2(__ADC_CONV_VALUE_GET(ADC1));
#endif
#ifdef FILTER_SINC3_ENABLE
/* ADC_FILTER_SINC3 Outer channel P:ADCIN1 N:ADCIN0 */
adc_channel_config(ADC1, ADC_INPUT_CHANNEL_1, ADC_INPUT_CHANNEL_0);
adc_conversion_start(ADC1);
while(!__ADC_FLAG_STATUS_GET(ADC1, ADC_FLAG_DATA_EOCH));
adc_data = adc_data_convert_sinc3(__ADC_CONV_VALUE_GET(ADC1));
#endif
return adc_data;
}