HC32L136 使用ADC测量AVCC/3电压时,电流异常
本帖最后由 Sam131208 于 2024-4-10 12:02 编辑HC32L136使用ADC时,测量AVCC电压,选择AdcAVccdiv3Input 通道, 睡眠电流为11uA.改为AdcExInputCH10 通道测试,睡眠电流为3uA. 请问使用AdcAVccdiv3Input 通道时,如何正确进入睡眠?
void adc_start(void){
stc_adc_cfg_t stcAdcCfg;
///< 开启ADC/BGR 外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
Bgr_BgrEnable(); ///< 开启BGR
DDL_ZERO_STRUCT(stcAdcCfg);
///< ADC 初始化配置
stcAdcCfg.enAdcMode = AdcSglMode; ///<采样模式-单次
stcAdcCfg.enAdcClkDiv = AdcMskClkDiv2; ///<采样分频-1
stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; ///<采样周期数-12
stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelInBgr2p5;///<参考电压选择-内部2.5V
stcAdcCfg.enAdcOpBuf = AdcMskBufDisable; ///<OP BUF配置-关
stcAdcCfg.enInRef = AdcMskInRefEnable; ///<内部参考电压使能-开
stcAdcCfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式-右
Adc_Init(&stcAdcCfg);
///< ADC 中断使能
Adc_EnableIrq();
EnableNvic(ADC_IRQn, IrqLevel3, TRUE);
///< ADC 采样通道配置
Adc_CfgSglChannel(AdcAVccdiv3Input); //AdcExInputCH10, AdcAVccdiv3Input
///< 启动单次转换采样
Adc_SGL_Start();
}
void Adc_IRQHandler(void)
{
if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
{
Adc_ClrIrqStatus(AdcMskIrqSgl); ///< 清除中断标志位
mSensor.value = Adc_GetSglResult(); ///< 获取采样值
Adc_SGL_Stop(); ///< ADC 单次转换停止
Adc_Disable();
Bgr_BgrDisable();
Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, FALSE);
}
}
若休眠前没有将adc的部分设置下,会发现休眠功耗非常高。
M0P_ADC->CR0|=0xFFFFF7FF;
或许每个人的情况不同,但我的确实是调用这3个会降低休眠的功耗。
重点是同样是上面部分,其实就是将上面开启的enAdcOpBuf关了,但是往往很多人会忘了,这个若不关的话,休眠功耗会增加个十几ua 可能是内部的硬件连接问题, 在关闭ADC前,把通道改为其它通道,为了避免未知的麻烦,设置为内部温度传感器通道。睡眠电流掉到3uA.
...
Adc_SGL_Stop();
Adc_CfgSglChannel(AdcAiTsInput);
Adc_Disable();
... 分压电阻漏电 ///< 关闭 PLL
M0P_SYSCTRL->SYSCTRL2 = 0x5A5A;
M0P_SYSCTRL->SYSCTRL2 = 0xA5A5;
M0P_SYSCTRL->SYSCTRL0_f.PLL_EN = FALSE;
///< 关闭 BGR
M0P_SYSCTRL->PERI_CLKEN0_f.ADC = TRUE;
M0P_BGR->CR_f.BGR_EN = FALSE;
M0P_SYSCTRL->PERI_CLKEN0_f.ADC = FALSE;
可能需要注意,关闭 PLL/BGR/ADC 的正确姿势。
页:
[1]