t9080350 发表于 2022-4-14 15:19

HC32L130J8TA ADC内部温度传感器

本帖最后由 t9080350 于 2022-4-14 15:22 编辑

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

uint32_t adc_value;

int32_t main(void)
{
        uart0_config();
       
        adc_config();
       
    while(1)
        {
               
                M0P_ADC->SGLSTART = 1u; //启动单次转换采样
               
                adc_value = M0P_ADC->RESULT; // 读取ADC采样电压
               
                M0P_ADC->SGLSTART = 0u; //ADC 单次转换停止
               
                delay1ms(1000);
        }
}

寄存器状态:
   

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){;}   ...

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

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

uint32_t adc_value;

int32_t main(void)
{
        uart0_config();
       
        adc_config();
       
    while(1)
        {
               
                M0P_ADC->SGLSTART = 1u; //启动单次转换采样
                while(FALSE == M0P_ADC->IFR_f.SGLIF);
               
                adc_value = M0P_ADC->RESULT; // 读取ADC采样电压
               
                M0P_ADC->ICR_f.SGLIC = 0;
                M0P_ADC->SGLSTART = 0u; //ADC 单次转换停止
               
                delay1ms(1000);
        }
}

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 发表于 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,是不是就是监测芯片温度用的
页: [1]
查看完整版本: HC32L130J8TA ADC内部温度传感器