在线时间34 小时
UID3165601
注册时间2018-8-8
NXP金币0
TA的每日心情 | 开心 2019-2-18 09:04 |
---|
签到天数: 23 天 [LV.4]偶尔看看III
中级会员
- 积分
- 219
- 最后登录
- 2019-3-5
|
差分输入两个引脚电压分别为DP0=1.07V,DM0=300MV,基准使用的是VREF=3.0V,16位模式,ADC采集到的电压为385MV,按理说ADC采样值不应该1.07V-300MV吗,为什么是385MV?我将ADC改为单端模式,分别测到DP0的确为1.07V,DM0为300MV。以下是我的ADC配置代码,差分和单端模式我只修改了channelNumber及enableDifferentialConversion 这两个参数,其余均未动 :
const adc16_config_t ADC16_0_config = {
.referenceVoltageSource = kADC16_ReferenceVoltageSourceVref,
.clockSource = kADC16_ClockSourceAsynchronousClock,
.enableAsynchronousClock = true,
.clockDivider = kADC16_ClockDivider8,
.resolution = kADC16_Resolution16Bit,
.longSampleMode = kADC16_LongSampleDisabled,
.enableHighSpeed = false,
.enableLowPower = false,
.enableContinuousConversion = false
};
const adc16_hardware_average_mode_t ADC16_0_hardwareAverageMode = kADC16_HardwareAverageCount8;
void ADC16_0_init(void) {
/* Interrupt vector ADC0_IRQn priority settings in the NVIC */
// NVIC_SetPriority(ADC0_IRQn, ADC16_0_IRQ_PRIORITY);
/* Initialize ADC16 converter */
ADC16_Init(ADC16_0_PERIPHERAL, &ADC16_0_config); //初始化ADC
/* Make sure, that software trigger is used */
ADC16_EnableHardwareTrigger(ADC16_0_PERIPHERAL, false); //硬件触发关闭
/* Configure hardware average mode */
ADC16_SetHardwareAverage(ADC16_0_PERIPHERAL, ADC16_0_hardwareAverageMode); //硬件平均
/* Configure channel multiplexing mode */
//ADC16_SetChannelMuxMode(ADC16_0_PERIPHERAL, ADC16_0_muxMode);
/* Perform auto calibration */
ADC16_DoAutoCalibration(ADC16_0_PERIPHERAL);
}ADC配置代码。
void ADC_Differential_DC_Channel_Config(void)
{
adc16ChannelConfigStruct[0].channelNumber = 0;
adc16ChannelConfigStruct[0].enableDifferentialConversion =true;
adc16ChannelConfigStruct[0].enableInterruptOnConversionCompleted = false;
}ADC通道设置
void DifferentialSample_DC(void)
{
uint32_t ADC_Value = 0;
ADC_Differential_DC_Channel_Config();
ADC16_SetChannelConfig(ADC0, 0, &adc16ChannelConfigStruct[0]);
while (0U == (kADC16_ChannelConversionDoneFlag & ADC16_GetChannelStatusFlags(ADC0, 0)))
{
}
ADC_Value = ADC16_GetChannelConversionValue(ADC0, 0);
ADC_Value = ADC_Value*3000/4095;
PRINTF("ADC Value: %d\r\n",ADC_Value );
}ADC转换采集
最佳答案
神的罪名 发表于 2018-9-25 14:42
这是什么原因导致的?
首先,你是用16位模式,后面计算的时候:
ADC_Value = ADC_Value*3000/4095;
又是采样12位模式计算,在16模式里,如果是差分模式,第15位是符号位,后面的15 ...
|
|