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);
}
}
寄存器状态:
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单次转换;
为什么你启动后不等采样结束就取采样值?? 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);
}
} 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);
}
拷贝给你一个我自己写的代码,你试试看是否可行 wubangmi 发表于 2022-4-15 09:01
///< ADC 内部温度模块初始化
void app_TempAdcInit(void)
{
感谢,是芯片问题,更换一个芯片,您的代码和上面经您指点的代码都可以运行并结果正确,感谢! t9080350 发表于 2022-4-15 10:31
感谢,是芯片问题,更换一个芯片,您的代码和上面经您指点的代码都可以运行并结果正确,感谢! ...
应该是其他引脚影响了这个功能,暂时未查明。 HC32L130J8TA是低功耗的芯片吗 内部测温精度怎么样 这个ADC,是不是就是监测芯片温度用的
页:
[1]