搞完了ADC的基本配置步骤,下面就是ADC配合一些外设的应用了,首先就是stm32f1内部的温度传感器通过adc采集获得温度;

内部温度传感器在ADC1的通道16上,所以只需要初始化以下ADC1就好了,然后再写两个函数来获得ADC转换之后的值并根据公式将该值转换为温度即可.

温度公式:

公式中的 Avg_Slope 的典型值 4.3 的单位是 mv/C,而通过ADC采集并计算后的电压单位是 V,所以这里 Avg_Slope 应该取 0.0043.这里好像一个坑,不知道正点原子怎么想的,在计算温度的时候来了下面的两行代码:

	result=temperate*=100;					//扩大100倍.
return result;

看不懂他这个扩大100倍,明明返回的值是没有扩大之前的值.不知道是不是bug,唉...现在想想,上学期模电没学好,现在才发现模电的知识还是很有用的,以后还是得把专业课学好.

另外,需要注意,初始化的时候要开启内部温度传感器功能,也可以说是使能内部温度传感器啦,其实也就是调用一个库函数而已:

void ADC_TempSensorVrefintCmd(FunctionalState NewState); //开启内部温度传感器

没错,就是这么简单;


下面贴一下代码,有关温度传感器配置相关的代码都放在了 /HARDWARE/TSensor.c 下.

初始化函数:void TSensor_Init(void)
void TSensor_Init(void)
{
ADC_InitTypeDef adcInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //ADC时钟设置为12MHz
ADC_DeInit(ADC1); adcInitStruct.ADC_ContinuousConvMode = DISABLE;
adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;
adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
adcInitStruct.ADC_Mode = ADC_Mode_Independent;
adcInitStruct.ADC_NbrOfChannel = 1;
adcInitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1,&adcInitStruct); ADC_TempSensorVrefintCmd(ENABLE);
ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));

}

获取指定通道ADC转换的结果:u16 ADC1_GetConvValue(uint8_t channel)
u16 ADC1_GetConvValue(uint8_t channel)
{
ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
获取多次ADC的值求平均值:u16 ADC1_GetAverageConvValue(uint8_t channel,uint8_t times)
u16 ADC1_GetAverageConvValue(uint8_t channel,uint8_t times)
{
u8 i;
u32 temp = 0;
for(i = 0;i < times;i++)
{
temp += ADC1_GetConvValue(channel);
}
return temp/times;
}
将ADC采集到的值转换为电压值:double ACD1_SampleValue2ReadableValue(u16 sampleValue)
	double ACD1_SampleValue2ReadableValue(u16 sampleValue)
{
return (double)sampleValue*((double)ADC_RefVoltoge/4096.0);
}
获得温度值:double TSensor_GetTemperature()
double TSensor_GetTemperature()
{
double VSense = ACD1_SampleValue2ReadableValue(ADC1_GetAverageConvValue(ADC_Channel_16,20));
USART_WriteLine("VSense:%.2f; %.2f",VSense,((1.43 - VSense)/0.0043+25.0));
return (1.43 - VSense)/0.0043+25.0;
}

main.c代码

Init()函数
void Init(void)
{
delay_init();
USART_Debug_Init();
TSensor_Init();
USART_WriteLine("系统初始化完成!");
}
Loop()函数
void Loop(void)
{
double temp = TSensor_GetTemperature();
USART_WriteLine("温度:%.2f",temp);
delay_ms(250);
}

这里面除了用到TSensor.c中的函数,还用到了我自己封装的 Usart.c中的串口函数.有时间会记录一下我是如何封装自己的Usart来进行调试输出的.

  </div>

Stm32ADC-内部温度传感器的使用的更多相关文章

  1. stm32 内部温度传感器的配置

    STM32的内部温度传感器和ADCx—IN16输入通道相连接.且温度传感器推荐采样时间为17.1us,支持的温度范围为:-40~125度,精度比较差,± 5℃左右. 计算温度值:T(℃) ={(V25 ...

  2. EFM32JG系列MCU内部温度传感器使用方法

    在很多电子类应用场合中,我们经常需要采集产品工作的周围环境温度,一般采取的方式有两种: 1)外加温度传感器 2)采用MCU内部温度传感器 外加温度传感器会增加产品的成本以及布板空间,所以在很多场合,我 ...

  3. TPYBoard读取芯片上的温度传感器

    转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 一.STM32内部温度传感器概要 STM32芯片内部一项独特的功能就是内部集成了一个温度传感器,因为是内置,所以测试的是芯片内部的温 ...

  4. 案例 stm32单片机,adc的双通道+dma 内部温度

    可以这样理解 先配置adc :有几个通道就配置几个通道. 然后配置dma,dma是针对adc的,而不是针对通道的. 一开始我以为一个adc通道对应一个dma通道.(这里是错的,其实是我想复杂了) 一个 ...

  5. STM32 DMA使用详解

    DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧.下面用问答的形式表达我的思路. DMA有什么用? 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数 ...

  6. STM32 DMA USART ADC

    转载自:http://www.cnblogs.com/UQYT/articles/2949794.html 这是一个综合的例子,演示了ADC模块.DMA模块和USART模块的基本使用. 我们在这里设置 ...

  7. iOS开发 传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  8. iOS开发——高级篇——传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  9. CC2540开发板学习笔记(六)——AD控制(自带温度计)

    一.实验目的 将采集的内部温度传感器信息通过串口发送到上位机 二.实验过程 1.寄存器配置 ADCCON1(0XB4)ADC控制寄存器1 BIT7:EOC   ADC结束标志位0:AD转换进行中    ...

  10. 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)

    推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...

随机推荐

  1. PHP + Redis 队列实战

    环境 centos6.5 PHP5.3 Redis安装 #yum install redis 1.redis配置认证密码 #vi /etc/redis.conf requirepass mypass ...

  2. Linux学习笔记:Jenkins的使用

    在windows中使用Jenkins(Linux系统下类似),步骤是: 1 从官网下载jenkins项目的war包 2 将jenkins.war放到tomcat的webapps目录中,启动tomcat ...

  3. R语言2版本3版本安装

    ./configure --prefix=/YZpath/public/software/R/R-3.5.0 --with-readline=no --with-x=no make make inst ...

  4. Tomcat新问题 还没有解决:the apr based apache tomcat native librariy which allows optional perf...........

     问题信息详细: 2012-5-18 18:41:54 org.apache.catalina.core.AprLifecycleListener init 信息: The APR based Apa ...

  5. Codeforces 1110 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 众所周知ldxoildxoildxoi这种菜鸡选手是不会写HHH题的,因此该篇博客只有AAA题至GGG题的题解,实在抱歉. A题 传送门 题 ...

  6. JAVA遇上HTML-----JSP 篇基本概念

    Java Web简介 1.什么是WEB应用程序: Web应用程序是一种可以通过Web访问的应用程序.Web应用程序的一个最大好处是用户很容易访问应用程序.用户只需要有浏览器即可,不需要再安装其他软件. ...

  7. Codeforces Round #543 (Div. 2) D 双指针 + 模拟

    https://codeforces.com/contest/1121/problem/D 题意 给你一个m(<=5e5)个数的序列,选择删除某些数,使得剩下的数按每组k个数以此分成n组(n*k ...

  8. latex字体

    强调 方式:声明:\em 或者 命令\emph,后者是latex2e的命令 区别:声明与命令的作用范围不同:\em改变当前字体直到被其他相应的声明取消(也可以是\em本身),或者当前的环境结束为止,当 ...

  9. MySQL/Oracle视图的创建与使用

    1.什么是视图? 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成.   2.视图的特点. 视图中的数据并不属于视图本身,而是属于基本的表,对视 ...

  10. NodeList类型

    NodeList近亲NameNodeMap.HTMLCollection是从整体上透彻理解DOM的关键所在.这三个集合都是'动态的' 换句话说,每当文档结构发生变化时,它们都会更新. 所以它们始终都会 ...