温度传感器内部连接到与 VBAT 共用的输入通道 ADC1_IN18
1、配置ADC1的属性
使能ADC1时钟
设置ADC的模式为独立模式
设置时钟频率为2分频
禁止DMA模式
设置采样延迟
设置ADC分辨率为12位
设置单通道转换模式
设置连续转换
禁止外部触发检测,这里采用软件触发检测
外部触发来源定时转换通道
ADC数据右对齐
1个转换数
初始化ADC外围设备
设置常规通道配置功能
使能ADC1
开始ADC1转换,软件触发
使能温度传感器
void ADC1_ADC_Init(void)
{
ADC_CommonInitTypeDef ADC1_Common_InitStructure;
ADC_InitTypeDef ADC1_InitStructure;
// 使能ADC1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//设置独立ADC模式
ADC1_Common_InitStructure.ADC_Mode = ADC_Mode_Independent;
//设置时钟频率为2分频
ADC1_Common_InitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
//禁止DMA模式
ADC1_Common_InitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
//设置采样时间
ADC1_Common_InitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
//设置ADC分辨率为12位
ADC1_InitStructure.ADC_Resolution = ADC_Resolution_12b;
//设置单通道转换模式
ADC1_InitStructure.ADC_ScanConvMode = DISABLE;
//设置连续转换
ADC1_InitStructure.ADC_ContinuousConvMode = ENABLE;
//禁止外部触发检测,这里采用软件触发检测
ADC1_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
//外部触发来源定时转换通道
ADC1_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
//ADC数据右对齐
ADC1_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
//1个转换数
ADC1_InitStructure.ADC_NbrOfConversion = 1;
//初始化ADC外围设备
ADC_CommonInit(&ADC1_Common_InitStructure);
ADC_Init(ADC1, &ADC1_InitStructure);
//常规通道配置功能
ADC_RegularChannelConfig(ADC1, ADC_Channel_18, 1, ADC_SampleTime_56Cycles);
//使能ADC1
ADC_Cmd(ADC1, ENABLE);
//开始ADC1转换,软件触发
ADC_SoftwareStartConv(ADC1);
//使能温度传感器
ADC_TempSensorVrefintCmd(ENABLE);
}
2、配置嵌套向量中断控制器NVIC
设置嵌套向量中断控制器组为组2
设置中断向量源为ADC_IRQn
设置抢占优先级为0
设置子优先级为0
使能ADC的中断
初始化嵌套向量中断控制器NVIC
开启ADC1中断
void ADC1_NVIC_Init(void)
{
NVIC_InitTypeDef ADC_NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
ADC_NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
ADC_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
ADC_NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
ADC_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//初始化ADC的NVIC
NVIC_Init(&ADC_NVIC_InitStructure);
//开启ADC1中断
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
}
3、初始化ADC1
void ADC1_Init(void)
{
ADC1_ADC_Init();
ADC1_NVIC_Init();
}
4、中断服务函数
注:在中断服务函数中读取ADC检测到的值
检查指定的ADC中断是否已发生。
调用系统的库函数,返回常规通道的最后一个ADC1转换结果数据
清除ADC1的中断挂起位
void ADC_IRQHandler(void)
{
if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == 1)
{
//读取ADC的转换值
AdcTempValue = ADC_GetConversionValue(ADC1);
}
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}
5、main函数测试
#define V25 0.76f //0.76V
#define Avg_Slope 0.0025f //2.5mV/C
int main(void)
{
float VoltageTempValue;//电压值
float TrueTempValue;//真实温度值
/* 配置SysTick 为10us中断一次,时间到后触发定时中断,
*进入stm32fxx_it.c文件的SysTick_Handler处理,通过数中断次数计时
*/
SysTick_Init();
//初始化USART1
USART1_Init();
//初始化ADC1
ADC1_Init();
printf("串口打印内部温度传感器检测到的温度!\r\n");
while(1)
{
VoltageTempValue =(float)(AdcTempValue) / 4096 * (float)3.3;
TrueTempValue = (VoltageTempValue - V25) / Avg_Slope + 25;
printf("\r\n");
printf("AdcTempValue = %d D \r\n", AdcTempValue); //十进制
printf("AdcTempValue = 0x%x H \r\n", AdcTempValue); //十六进制
printf("VoltageTempValue = %.1f V \r\n", VoltageTempValue); //电压值
printf("TrueTempValue = %.1f 度 \r\n", TrueTempValue); //真实温度值
Delay_ms(2000);
}
}