[技术问答] HC32L136 使用ADC测量AVCC/3电压时,电流异常

[复制链接]
2601|4
 楼主| Sam131208 发表于 2024-4-10 11:53 | 显示全部楼层 |阅读模式
本帖最后由 Sam131208 于 2024-4-10 12:02 编辑

   HC32L136使用ADC时,测量AVCC电压,选择AdcAVccdiv3Input 通道, 睡眠电流为11uA.  改为AdcExInputCH10 通道测试,睡眠电流为3uA.   请问使用AdcAVccdiv3Input 通道时,如何正确进入睡眠?

  1. void adc_start(void){
  2.         stc_adc_cfg_t        stcAdcCfg;
  3.   
  4.                 ///< 开启ADC/BGR 外设时钟
  5.                 Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
  6.                 Bgr_BgrEnable();        ///< 开启BGR

  7.                 DDL_ZERO_STRUCT(stcAdcCfg);
  8.                 ///< ADC 初始化配置
  9.                 stcAdcCfg.enAdcMode         = AdcSglMode;               ///<采样模式-单次
  10.                 stcAdcCfg.enAdcClkDiv       = AdcMskClkDiv2;            ///<采样分频-1
  11.                 stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk;     ///<采样周期数-12
  12.                 stcAdcCfg.enAdcRefVolSel    = AdcMskRefVolSelInBgr2p5;  ///<参考电压选择-内部2.5V
  13.                 stcAdcCfg.enAdcOpBuf        = AdcMskBufDisable;           ///<OP BUF配置-关
  14.                 stcAdcCfg.enInRef           = AdcMskInRefEnable;        ///<内部参考电压使能-开
  15.                 stcAdcCfg.enAdcAlign        = AdcAlignRight;            ///<转换结果对齐方式-右
  16.                 Adc_Init(&stcAdcCfg);

  17.         ///< ADC 中断使能
  18.         Adc_EnableIrq();
  19.         EnableNvic(ADC_IRQn, IrqLevel3, TRUE);

  20.                 ///< ADC 采样通道配置
  21.                 Adc_CfgSglChannel(AdcAVccdiv3Input);    //AdcExInputCH10, AdcAVccdiv3Input

  22.                 ///< 启动单次转换采样
  23.                 Adc_SGL_Start();
  24. }

  25. void Adc_IRQHandler(void)
  26. {
  27.     if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
  28.     {
  29.         Adc_ClrIrqStatus(AdcMskIrqSgl);       ///< 清除中断标志位
  30.         mSensor.value = Adc_GetSglResult();   ///< 获取采样值
  31.         Adc_SGL_Stop();                       ///< ADC 单次转换停止
  32.                 Adc_Disable();
  33.                 Bgr_BgrDisable();
  34.         Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, FALSE);
  35.     }
  36. }


804879880 发表于 2024-4-10 15:27 | 显示全部楼层
若休眠前没有将adc的部分设置下,会发现休眠功耗非常高。

        M0P_ADC->CR0|=0xFFFFF7FF;
      
或许每个人的情况不同,但我的确实是调用这3个会降低休眠的功耗。

重点是同样是上面部分,其实就是将上面开启的enAdcOpBuf关了,但是往往很多人会忘了,这个若不关的话,休眠功耗会增加个十几ua
 楼主| Sam131208 发表于 2024-4-10 16:41 | 显示全部楼层
  可能是内部的硬件连接问题, 在关闭ADC前,把通道改为其它通道,为了避免未知的麻烦,设置为内部温度传感器通道。睡眠电流掉到3uA.
  ...
  Adc_SGL_Stop();  
  Adc_CfgSglChannel(AdcAiTsInput);
  Adc_Disable();
  ...
xch 发表于 2024-4-10 16:57 | 显示全部楼层
分压电阻漏电
yang377156216 发表于 2024-4-11 11:06 | 显示全部楼层
///< 关闭 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 的正确姿势。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

131

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部