我这次使用的是STM32F103C8T6这款单片机,这款单片机内部也是有温度传感器的,最近我们公司的项目中用到了这种功能,感觉还挺不错的,顺便介绍一下,希望大家批评指导:
其实温度传感器就是STM32的AD采集功能,温度传感器和通道ADCx_IN16相连接,可以按注入或规则通道对这两个内部通道进行转换。 就是对ADC的16通道进行数据采集,此通道把传感器输出的电压转换成数字值,温度传感器模拟输入推荐采样时间是17.1μs。
数据手册的中介绍温度传感器的框图如下:
数据手册中还介绍了,使用温度传感器的步骤:
我们可以根据手册中温度传感器的表格,来选择公式中对应参数的值:
理论上具体的知识就这些,然后就是写程序了,当然开始就是AD初始化:
void Adc_Init(void)
{
RCC->APB2ENR|=1<<2;
GPIOA->CRL&=0XFFFF0000;
RCC->APB2ENR|=1<<9;
RCC->APB2RSTR|=1<<9;
RCC->APB2RSTR&=~(1<<9);
RCC->CFGR&=~(3<<14);
RCC->CFGR|=1<<14;
ADC1->CR1&=0XF0FFFF;
ADC1->CR1|=0<<16;
ADC1->CR1&=~(1<<8);
ADC1->CR2&=~(1<<1);
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17;
ADC1->CR2|=1<<20;
ADC1->CR2&=~(1<<11);
ADC1->CR2|=1<<23;
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1&=0<<20;
ADC1->SMPR1&=~(7<<18);
ADC1->SMPR1|=7<<18;
ADC1->CR2|=1<<0;
ADC1->CR2|=1<<3;
while(ADC1->CR2&1<<3);
ADC1->CR2|=1<<2;
while(ADC1->CR2&1<<2);
}
然后就是获取ADC值,计算温度的程序:
u16 Get_Adc(u8 ch)
{
ADC1->SQR3&=0XFFFFFFE0;
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22;
while(!(ADC1->SR&1<<1));
return ADC1->DR;
}
u16 Get_Temp(void)
{
u16 temp_val=0;
u8 t;
for(t=0;t<10;t++)
{
temp_val+=Get_Adc(TEMP_CH);
Delayms(5);
}
return temp_val/10;
}
由于编译器中文格式跟网页不同,注释的语句复制过来全是乱码,所以就不带注释了,请见谅
通过串口打印采集的电压值和温度值:
这就是我对stm32内部温度传感器的使用,请大家批评指教
|