[技术问答] HC32L130J8TA ADC内部温度传感器

[复制链接]
2729|9
 楼主| t9080350 发表于 2022-4-14 15:19 | 显示全部楼层 |阅读模式
本帖最后由 t9080350 于 2022-4-14 15:22 编辑

请教。HC32L130J8TA ADC内部温度传感器 读取ADC失败。读出来的数值总是4095,试过换通道到1/2 VREF也是一样的结果,不知道是卡在哪里了,请各位高手指点,感谢!!!
代码如下:
  1. void adc_config()
  2. {
  3.         stc_adc_cfg_t stc_adc_cfg;
  4.     DDL_ZERO_STRUCT(stc_adc_cfg);
  5.    
  6.     Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
  7.        
  8.         Bgr_BgrEnable();
  9.         Bgr_TempSensorEnable();
  10.    
  11.     stc_adc_cfg.enAdcMode = AdcSglMode;
  12.     stc_adc_cfg.enAdcClkDiv = AdcMskClkDiv8;
  13.     stc_adc_cfg.enAdcSampCycleSel = AdcMskSampCycle12Clk;
  14.     stc_adc_cfg.enAdcRefVolSel = AdcMskRefVolSelInBgr2p5;
  15.     stc_adc_cfg.enAdcOpBuf = AdcMskBufEnable;
  16.     stc_adc_cfg.enInRef = AdcMskInRefEnable;
  17.     stc_adc_cfg.enAdcAlign = AdcAlignRight;
  18.     Adc_Init(&stc_adc_cfg);
  19.        
  20.     Adc_CfgSglChannel(AdcAiTsInput);
  21. }

  22. uint32_t adc_value;

  23. int32_t main(void)
  24. {
  25.         uart0_config();
  26.        
  27.         adc_config();
  28.        
  29.     while(1)
  30.         {
  31.                
  32.                 M0P_ADC->SGLSTART = 1u; //启动单次转换采样
  33.                
  34.                 adc_value = M0P_ADC->RESULT; // 读取ADC采样电压
  35.                
  36.                 M0P_ADC->SGLSTART = 0u; //ADC 单次转换停止
  37.                
  38.                 delay1ms(1000);
  39.         }
  40. }


寄存器状态:
104696257cb5c03de2.png     53076257cb6edcccf.png
wubangmi 发表于 2022-4-14 16:49 | 显示全部楼层
    M0P_ADC->SGLSTART  =  1u;     ///< 启动ADC单次转换
    while(FALSE == M0P_ADC->IFR_f.SGLIF){;}    ///< 等待ADC转换完成
    pu16AdcRestult       = M0P_ADC->RESULT;
    M0P_ADC->ICR_f.SGLIC = 0;     ///< 清除完成标志位
    M0P_ADC->SGLSTART    = 0u;    ///< 关闭ADC单次转换;

为什么你启动后不等采样结束就取采样值??
 楼主| t9080350 发表于 2022-4-14 22:13 | 显示全部楼层
wubangmi 发表于 2022-4-14 16:49
M0P_ADC->SGLSTART  =  1u;     ///< 启动ADC单次转换
    while(FALSE == M0P_ADC->IFR_f.SGLIF){;}   ...

您好,感谢指教,按流程确实应该加上等待完成后再读取数据。
可是结果还是一样可以再指点一下吗?不用麻烦写程序,见到写得不好的地方大致指出就可以,感谢!

  1. void adc_config()
  2. {
  3.         stc_adc_cfg_t stc_adc_cfg; //定义配置ADC结构体stc_adc_cfg_t
  4.     DDL_ZERO_STRUCT(stc_adc_cfg); //初始化结构体stc_adc_cfg_t为0
  5.    
  6.     Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE); //打开ADC门控、BGR门控(产生基准电压)
  7.        
  8.         Bgr_BgrEnable(); // 开启BGR(产生基准电压)
  9.         Bgr_TempSensorEnable(); //使能温度传感器
  10.    
  11.     stc_adc_cfg.enAdcMode = AdcSglMode; //采样模式:单次采样
  12.     stc_adc_cfg.enAdcClkDiv = AdcMskClkDiv8; //采样分频:不分频
  13.     stc_adc_cfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; //采样周期数:12
  14.     stc_adc_cfg.enAdcRefVolSel = AdcMskRefVolSelInBgr2p5; //<参考电压选择-内部2.5V
  15.     stc_adc_cfg.enAdcOpBuf = AdcMskBufEnable; ///<OP BUF配置:开
  16.     stc_adc_cfg.enInRef = AdcMskInRefEnable; ///<内部参考电压使能:开
  17.     stc_adc_cfg.enAdcAlign = AdcAlignRight; ///<转换结果对齐方式:右对齐
  18.     Adc_Init(&stc_adc_cfg); //初始化ADC模块
  19.        
  20.     Adc_CfgSglChannel(AdcAiTsInput); // ADC 采样通道配置:温度传感器通道
  21. }

  22. uint32_t adc_value;

  23. int32_t main(void)
  24. {
  25.         uart0_config();
  26.        
  27.         adc_config();
  28.        
  29.     while(1)
  30.         {
  31.                
  32.                 M0P_ADC->SGLSTART = 1u; //启动单次转换采样
  33.                 while(FALSE == M0P_ADC->IFR_f.SGLIF);
  34.                
  35.                 adc_value = M0P_ADC->RESULT; // 读取ADC采样电压
  36.                
  37.                 M0P_ADC->ICR_f.SGLIC = 0;
  38.                 M0P_ADC->SGLSTART = 0u; //ADC 单次转换停止
  39.                
  40.                 delay1ms(1000);
  41.         }
  42. }
wubangmi 发表于 2022-4-15 09:01 | 显示全部楼层
t9080350 发表于 2022-4-14 22:13
您好,感谢指教,按流程确实应该加上等待完成后再读取数据。
可是结果还是一样可以再指点一下吗? ...

///< ADC 内部温度模块初始化
void app_TempAdcInit(void)
{
    stc_adc_cfg_t       stcAdcCfg;
    DDL_ZERO_STRUCT(stcAdcCfg);
   
    ///< 开启ADC/BGR外设时钟
    M0P_SYSCTRL->PERI_CLKEN_f.ADC = 1; ///< 使能        ADCBGR模块时钟
    M0P_BGR->CR |= 0x03u;         ///< 使能BGR,使能内部温度传感器
    M0P_ADC->CR0_f.EN = 1u;       ///< ADC模块使能
    delay10us(2);                 ///< 延时20uS,等待模块稳定
    ///< ADC 初始化配置
    M0P_ADC->CR1_f.MODE     = 0;   ///< 单次转换模式
    M0P_ADC->CR0_f.INREFEN  = 1;   ///< 使能ADC内部参考电压
    M0P_ADC->CR0_f.REF      = 0;   ///< 使用内部1.5V参考电压
    M0P_ADC->CR0_f.SAM      = 3;   ///< 12个转换周期
    M0P_ADC->CR0_f.CLKDIV   = 3;   ///< PLCK/8
    M0P_ADC->CR0_f.SGLMUX   = 0x1c;///< 选择待转换的通道为温度传感器
    M0P_ADC->CR0_f.BUF      = 1;   ///< 信号放大器使能
    M0P_ADC->ICR_f.SGLIC    = 0;   ///< 清除标志位
    M0P_ADC->CR0_f.EN       = 0u;  ///< ADC模块关闭
    M0P_BGR->CR            &= 0x2u;///< 关闭BGR  
}
///<  ADC通道28      温度ADC采样值获取
float app_TempAdcAvgCodeGet(void)
{   
    int16_t pu16AdcRestult = 0;
    uint16_t i;
    float Index;
    M0P_SYSCTRL->PERI_CLKEN_f.ADC = 1; ///< 使能        ADCBGR模块时钟
    app_TempAdcInit();            ///< 初始化为ADC温度采样功能
    M0P_BGR->CR        |= 0x03u;  ///< 使能BGR,使能内部温度传感器
    delay10us(2);                 ///< 延时20uS
    M0P_ADC->CR0_f.EN  =  1u;     ///< ADC模块使能
    M0P_ADC->SGLSTART  =  1u;     ///< 启动ADC单次转换
    while(FALSE == M0P_ADC->IFR_f.SGLIF){;}    ///< 等待ADC转换完成
    pu16AdcRestult       = M0P_ADC->RESULT;
    M0P_ADC->ICR_f.SGLIC = 0;     ///< 清除完成标志位
    M0P_ADC->RESULT      = 0;     ///< 清空采样结果寄存器
    M0P_ADC->SGLSTART    = 0u;    ///< 关闭ADC单次转换;
    M0P_ADC->CR0_f.EN    = 0u;    ///< ADC模块关闭
    M0P_BGR->CR         &= 0x2u;  ///< 关闭BGR  
    i = *(uint16_t *)0x00100C34;
    pu16AdcRestult = pu16AdcRestult - i;
    Index = 25.0 + 0.0803*1.5*(float)pu16AdcRestult;
    return (uint16_t)(Index*100);
}

拷贝给你一个我自己写的代码,你试试看是否可行

打赏榜单

t9080350 打赏了 5.00 元 2022-04-15

 楼主| t9080350 发表于 2022-4-15 10:31 | 显示全部楼层
wubangmi 发表于 2022-4-15 09:01
///< ADC 内部温度模块初始化
void app_TempAdcInit(void)
{

感谢,是芯片问题,更换一个芯片,您的代码和上面经您指点的代码都可以运行并结果正确,感谢!
 楼主| t9080350 发表于 2022-4-15 10:35 | 显示全部楼层
t9080350 发表于 2022-4-15 10:31
感谢,是芯片问题,更换一个芯片,您的代码和上面经您指点的代码都可以运行并结果正确,感谢! ...

应该是其他引脚影响了这个功能,暂时未查明。
geraldbetty 发表于 2022-5-28 17:13 | 显示全部楼层
HC32L130J8TA是低功耗的芯片吗
plsbackup 发表于 2022-5-29 10:37 | 显示全部楼层
内部测温精度怎么样
carpsnow 发表于 2022-6-3 15:48 | 显示全部楼层
这个ADC,是不是就是监测芯片温度用的

评论

测温度只是ADC的一种用法,L13x可以选外部管脚也可以选内部TS  发表于 2022-7-20 17:01
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

21

帖子

0

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