HC32L110C6PA是华大基础的一款MCU,该MCU内置了一个ADC模块,可以实现内部温度的采集。下面是一个基本的温度采集代码:
#include "hc32l110.h"
#include "hc32l110_gpio.h"
#include "hc32l110_clk.h"
#include "hc32l110_adc.h"
void Delay(uint32_t u32Cnt);
void ADC_Init(void);
void ADC_Start(void);
uint16_t ADC_ReadData(uint8_t u8Channel);
int main(void)
{
uint16_t u16AdcData;
float fTemp;
CLK_XtalConfig(CLK_XTALCMD_HIGH);
ADC_Init();
while (1)
{
ADC_Start();
while (ADC_GetFlag(ADC_FLAG_EOCA) == Reset) {}
ADC_ClearFlag(ADC_FLAG_EOCA);
u16AdcData = ADC_ReadData(ADC_CH0);
fTemp = (float)(u16AdcData - 544) * 0.977f + 25.0f; // 转换温度值
Delay(50000);
}
}
void ADC_Init(void)
{
stc_adc_cfg_t stcAdcCfg;
///< 打开ADC外设时钟
CLK_FcgPeriphClockCmd(CLK_FCG_ADC, Enable);
stcAdcCfg.enAdcOpMode = AdcSCanMode; //扫描模式采样
stcAdcCfg.enAdcClkSel = AdcClkSysTDiv1; //采样时钟为系统时钟/1
stcAdcCfg.enAdcSampTimeSel = AdcSampTime4Clk; //采样时间选择为4个采样时钟
stcAdcCfg.enAdcRefVolSel = VoltageRefAvcc; //电压参考源为AVCC
stcAdcCfg.enAdcResultAlign = AdcDataAlignRight; //采样数据右对齐
stcAdcCfg.enAdcSampTimeCfgA = AdcSampTimeCfgDefault;
stcAdcCfg.enAdcSampTimeCfgB = AdcSampTimeCfgDefault;
stcAdcCfg.enAdcSampTimeCfgC = AdcSampTimeCfgDefault;
stcAdcCfg.enAdcSampTimeCfgD = AdcSampTimeCfgDefault;
ADC_Init(&stcAdcCfg);
///< 选择通道0进行采样
ADC_ConfigChannel(ADC_CH0, AdcExInputCH0);
///< 使能DMA传输
ADC_DmaCmd(Enable);
}
void ADC_Start(void)
{
///< 使能ADC转换
ADC_Start();
}
uint16_t ADC_ReadData(uint8_t u8Channel)
{
uint16_t u16AdcData;
u16AdcData = ADC_GetChannelData(u8Channel);
return u16AdcData;
}
void Delay(uint32_t u32Cnt)
{
uint32_t i = 0;
for (i = 0; i < u32Cnt; i++)
{
__NOP();
}
}
其中,关于温度的转换公式为:
温度值 = (ADC采样值 - 544)* 0.977 + 25
这个公式是针对HC32L110C6PA的内部温度传感器的,如果使用其他型号的MCU,需要根据其内部温度传感器的特性来修改转换公式。 |