主题中讨论的其他器件:MSPM0L1306
尊敬的先生或女士!
我有这样一个问题、即当两次测量之间存在延迟时、内部温度传感器的噪声非常大。 如果不存在任何延迟、测量噪声根本不会。 ADC 使用外部基准监控4个通道、其余3个通道 正常、但温度通道不正常。 我尝试了 ADC 的许多设置。 但问题是存在的。
我尝试了以下步骤:
-不同的时钟源/分频值/f 范围值和不同的采样时间(大于6.1us)
-通过为该转换存储器选择另一个通道来禁用温度传感器,并通过选择通道11再次启用
-使用重复模式导致更多的浮点结果
-relocation DL_ADC12_enableConversions 函数和使用 DL_ADC12_disableConversions (ADC0);
我附加了一个更易于理解的示例代码。
示例1:当温度传感器没有噪声时:
int main(){
initSystem();
initAdc();
while (true){
makemometimage();
}
}
示例2:当温度传感器有噪声时(通常 ADC 测量值过低或为零)
int main(){
initSystem();
initAdc();
while (true){
makemometimage();
someDelay();
}
}
someDelay 可以是 delay_cycles ()或 for (int I=0;I<10000;I++),或任何计时器轮询布尔值(while (! value );)
initAdc(){
DL_GPIO_RESET (GPIOA);
DL_ADC12_RESET (ADC12_0_INST);
DL_VREF_RESET (VREF);
DL_GPIO_enablePower (GPIOA);
DL_ADC12_enablePower (ADC12_0_INST);
DL_VREF_enablePower (VREF);
DL_ADC12_ClockConfig gADC12_0ClockConfig ={
.clockSel = DL_ADC12_CLOCK_ULPCLK、
.diveRatio = DL_ADC12_CLOCK_Divid_1、
.freqRange = DL_ADC12_CLOCK_FREQ_RANGE_24_TO_32
};
静态 const DL_VREF_Config gVREFConfig ={
.vrefEnable = DL_VREF_ENABLE_DISABLE、
.bufConfig = DL_VREF_BUFCONFIG_OUTPUT_2_5V、
.shModeEnable = DL_VREF_SHMODE_DISABLE、
.holdCycleCount = DL_VREF_HOLD_MIN、
.shCycleCount = DL_VREF_SH_MIN、
};
静态 const DL_VREF_ClockConfig gVREFClockConfig ={
.clockSel = DL_VREF_CLOCK_BUSCLK、
divideRatio = DL_VREF_Cock_Divid_8、
};
DL_ADC12_initSeqSample (ADC0、
DL_ADC12_REPEATE_MODE_DISABLED、
DL_ADC12_SAMPLING_SOURCE_AUTO、
DL_ADC12_TRIG_SRC_SOFTWARE、
DL_ADC12_SEQ_START_ADDR_00、DL_ADC12_SEQ_END_ADDR_03
DL_ADC12_SAMP_CONV_RES_12_BIT、
DL_ADC12_SAMP_CONV_DATA_FORMAT_UNsigned);
DL_ADC12_configConversionMem (ADC0、
DL_ADC12_MEM_IDX_0、
DL_ADC12_INPUT_CHAN_11、
DL_ADC12_REFERY_VOLTAGE_EXTREF、//3.3V
DL_ADC12_SAMPLE_TIMER_SOURCE_SCOMP0、
DL_ADC12_ev平均 值计算_mode_enabled、
DL_ADC12_BURIN_OUT_SOURCE_DISABLED、
DL_ADC12_TRIGGER_MODE_AUTO_NEXT、
DL_ADC12_WINDOWS_COMP_MODE_DISABLED);
DL_ADC12_setPowerDownMode (ADC0、DL_ADC12_POWER_DOWN_MODE_AUTO);
DL_ADC12_configHwAverage (ADC0、DL_ADC12_HW_AVG_NUM_ACC_8、DL_ADC12_HW_AVG_DEN_DIV_BY_8);
DL_ADC12_setSampleTime0 (ADC0、240);//尝试更长的 SAMP 时间
DL_ADC12_clearInterruptStatus (ADC0、DL_ADC12_INTERRUPT_MEM3_RESULT_LOADED);
DL_ADC12_enableInterrupt (ADC0、DL_ADC12_INTERRUPT_MEM3_RESULT_LOADED);
DL_VREF_setClockConfig (VREF、
(DL_VREF_ClockConfig *)&gVREFClockConfig);
DL_VREF_configReference (VREF、
(DL_VREF_Config *)&gVREFConfig);
while (DL_VREF_CTL1_READY_NOTRDY = DL_VREF_getStatus (VREF));
NVIC_EnableIRQ (ADC0_INT_IRQn);
DL_ADC12_enableConversions (ADC0);
}
initSystem(){
DL_SYSCTL_setSYSOSCFreq (DL_SYSCTL_SYSOSC_FREQ_BASE);
DL_SYSCTL_setMCLKDivider (DL_SYSCTL_MCLK_DIVIDER_DISABLE);
DL_SYSCTL_setPowerPolicyRUN0SLEEP0//我还尝试了 DL_SYSCTL_setPowerPolicyRUN1SLEEP1 ();
DL_SYSCTL_setBORThreshold (DL_SYSCTL_BOR_THR_THR_LEVEL_0);
}
makemometimees(){
DL_ADC12_startConversion (ADC0);
while (!adcready);
adcready=false;
filteredAdcValue =filteredAdcValue*0.99+0.01*DL_ADC12_getMemResult (ADC0、DL_ADC12_MEM_IDX_0);
浮点 V_Sample =(filteredAdcValue - 0.5)* 3.3 / 4096.0;
Float V_Trim =(factoryTrimValue - 0.5)* 3.3 / 4096.0;
浮点 T_Sample =((1.0 /-0.002044)*(V_Sample - V_Trim)+ 30.0);
DL_ADC12_enableConversions (ADC0);
}
ADC0_IRQHandler ()
{
开关(DL_ADC12_getPendingInterrupt (ADC0))
{
案例 DL_ADC12_IIDX_MEM3_RESULT_LOADED:
{
adcready=true;
中断;
}
默认值:
中断;
}
}
提前感谢您的帮助!