发新帖本帖赏金 5.00元(功能说明)我要提问
返回列表
打印
[技术问答]

HC32L130J8TA ADC内部温度传感器

[复制链接]
2050|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 打赏了 5.00 元 2022-04-15

5
t9080350|  楼主 | 2022-4-15 10:31 | 只看该作者
wubangmi 发表于 2022-4-15 09:01
///< ADC 内部温度模块初始化
void app_TempAdcInit(void)
{

感谢,是芯片问题,更换一个芯片,您的代码和上面经您指点的代码都可以运行并结果正确,感谢!

使用特权

评论回复
6
t9080350|  楼主 | 2022-4-15 10:35 | 只看该作者
t9080350 发表于 2022-4-15 10:31
感谢,是芯片问题,更换一个芯片,您的代码和上面经您指点的代码都可以运行并结果正确,感谢! ...

应该是其他引脚影响了这个功能,暂时未查明。

使用特权

评论回复
7
geraldbetty| | 2022-5-28 17:13 | 只看该作者
HC32L130J8TA是低功耗的芯片吗

使用特权

评论回复
8
plsbackup| | 2022-5-29 10:37 | 只看该作者
内部测温精度怎么样

使用特权

评论回复
9
carpsnow| | 2022-6-3 15:48 | 只看该作者
这个ADC,是不是就是监测芯片温度用的

使用特权

评论回复
评论
Ineedanid 2022-7-20 17:01 回复TA
测温度只是ADC的一种用法,L13x可以选外部管脚也可以选内部TS 
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

21

帖子

0

粉丝