![](https://img-blog.csdnimg.cn/img_convert/0f902546c32548fcddeda03faa80c034.png)
本章所要实现的功能是:通过芯片内部温度传感器读取温度,并将读取的温 度数据打印出去,DS0 指示灯闪烁提示系统正常运行。程序框架如下: (1)初始化内部温度传感器(初始化 ADC1_IN16,开启温度传感器) (2)编写温度读取函数
(3)编写主函数
开发步骤
(1)初始化 ADC1_IN16 相关参数,开启内度温度传感器 ADC1_IN16 的初始化步骤与上一章介绍 AD 模数转换实验一样,这里我们只 需要开启内部温度传感器即可,调用的库函数为: ADC_TempSensorVrefintCmd(ENABLE);//打开 ADC 内部温度传感器 (2)读取 ADC1_IN16 AD 值,将其转换为对应温度 上一步配置好后,我们就可以读取温度传感器的电压值,根据温度计算公式, 可以求出对应电压值的温度,具体方法与上一章一样
adc_temp.h+adc_temp.c
#ifndef _adc_temp_H
#define _adc_temp_H
#include "system.h"
void ADC_Temp_Init();
u16 Get_ADC_Temp_Value(u8 ch, u8 times);
float Get_Temperture();
#endif
#include "adc_temp.h"
#include "SysTick.h"
void ADC_Temp_Init()
{
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_TempSensorVrefintCmd(ENABLE);
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;// ADC 单次转换disable或者连续转换选择enable
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;// ADC 数据寄存器对齐格式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;// ADC 转换触发信号选择,未使用外部触发
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent ;// ADC 工作模式选择
ADC_InitStructure.ADC_NbrOfChannel=1;// ADC 采集通道0x1-0x10
ADC_InitStructure.ADC_ScanConvMode=DISABLE;; /* ADC 扫描enable(多通道)或者单次disable(单通道)模
式选择 */
ADC_Init( ADC1, &ADC_InitStructure);
ADC_Cmd( ADC1, ENABLE);
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//检测到复位校准状态完成之后退出循环
ADC_StartCalibration(ADC1);//开始指定adc1的校准状态
while(ADC_GetCalibrationStatus( ADC1));//原理同上
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启ad转换,软件触发模式
}
u16 Get_ADC_Temp_Value(u8 ch, u8 times)//得到ADC的值,ch通道值,times循环多次取平均值得次数
{
ADC_RegularChannelConfig( ADC1, ch,1, ADC_SampleTime_239Cycles5 );
u8 i=0;
u32 temp_val=0;
for(i=0;i<times;i++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//因为选择的是单次转换
//每采集一次就结束,采集关闭,所以要开启转换,从而多次开启取平均值
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);//转换完成返回1
temp_val+=ADC_GetConversionValue(ADC1);
delay_ms(5);
}
return temp_val/times;
}
float Get_Temperture()
{
u32 val=0;
float V;
float temperture=0;
val=Get_ADC_Temp_Value(ADC_Channel_16,20);
V=(float)val*(3.3)/4096;//电压转换公式,AD值*3.3/2的12次方(4096)
temperture=((V-1.43)/0.0043)+25;//温度计算公式,具体看开发手册
return temperture;
}
main.c
#include "stm32f10x.h"
#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
#include "time.h"
#include "pwm.h"
#include "usart.h"
#include "stdio.h"
#include "iwdg.h"
#include "wwdg.h"
#include "input.h"
#include "touch_key.h"
#include "wkup.h"
#include "adc.h"
#include "adc_temp.h"
int main()
{
u16 i=0;
float tempture_val=0;
float V;//将AD值转换为电压值
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置优先级分组
SysTick_Init(72);
LED_Init();
USART1_Init(115200);//波特率115200
ADC_Temp_Init();
while(1)
{
i++;
if(i%20==0)LED1=!LED1;
delay_ms(10);
if(i%100==0)
{
tempture_val=Get_Temperture();
if(tempture_val>0)
{
printf("内部温度是:%.2f ℃\r\n",tempture_val);
}
else
printf("内部温度是:-%.2f ℃\r\n",tempture_val);
}
}
}