本帖最后由 akenonline 于 2021-4-6 11:18 编辑
在测试005AD时有个问题请教
1 用分压方法测量12V电池电压,分压电阻30k/3k,ad口外接104电容
2 AD采样用单次采样模式,采样次数15次,去头去尾然后取3数据中值平均
3 MCU主频设为24M,AD工频为1/4主频,采样时钟设为最大12
仿真结果:最大值12.98v 最小值 10.56v,最大误差2.42v
代码如下:
void ADC_ini(void)
{
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE); //ADCBGR 外设时钟使能
//ADC配置
M0P_ADC->CR0_f.ADCEN = 1u; //Adc_Enable();
M0P_BGR->CR |= 1u; //Bgr_BgrEnable();
stcAdcCfg.enAdcOpMode = AdcNormalMode; //单次采样模式
stcAdcCfg.enAdcClkSel = AdcClkSysTDiv4; //PCLK
stcAdcCfg.enAdcSampTimeSel = AdcSampTime12Clk; //4个采样时钟
stcAdcCfg.enAdcRefVolSel = RefVolSelAVDD; //参考电压:内部vdd,SPS<=200kHz) SPS速率 = ADC时钟 / (采样时钟 + 16CLK)
stcAdcCfg.bAdcInBufEn = FALSE; //电压跟随器如果使能,SPS采样速率 <=200K
stcAdcCfg.u32AdcRegHighThd = 0u; //比较阈值上门限
stcAdcCfg.u32AdcRegLowThd = 0u; //比较阈值下门限
stcAdcCfg.enAdcTrig0Sel = AdcTrigDisable; //ADC转换自动触发设置
stcAdcCfg.enAdcTrig1Sel = AdcTrigDisable;
Adc_Init(&stcAdcCfg);
}
void Get_AD(u8 CH)
{
u8 i;
for(i=0;i<sample;i++)
{
stcAdcNormCfg.enAdcNormModeCh = CH;
stcAdcNormCfg.bAdcResultAccEn = FALSE;
Adc_ConfigNormMode(&stcAdcCfg, &stcAdcNormCfg);
Adc_Start();
while(FALSE != Adc_PollBusyState());
AD_VAL=M0P_ADC->RESULT_f.RESULT;
}
Adc_Stop();
} |