搞完了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. wifi功能模块

    1. API 10 Android2.3.3 不支持wifi代理设置. 2017-09-29 原来addOrUpdateNetwork之前,wifi配置并不会立即生效,要想立即生效,就要 wifiMa ...

  2. Linux下进行程序设计时,关于库的使用:

    一.gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库: -fPIC:表示编译为位置独立(地址无关)的代码,不用此选项的话,编译后的代码是位置相关的,所以动态载入时,是通过 ...

  3. 使用tensorflow下的GPU加速神经网络训练过程

    下载CUDA8.0,安装 下载cuDNN v5.1安装.放置环境变量等. 其他版本就不装了.不用找其他版本的关系. 使用tensorflow-gpu1.0版本. 使用keras2.0版本. 有提示的. ...

  4. python学习 day2 (3月2日)

    .if if else 和 if elif else 的区别是: 前者 判断第一个 判断完第二个 之后还会执行else: 后者是只有满足条件(即都不符合if.elif里的条件时才会进入else) 不清 ...

  5. Codeforces Round #538 (Div. 2) F 欧拉函数 + 区间修改线段树

    https://codeforces.com/contest/1114/problem/F 欧拉函数 + 区间更新线段树 题意 对一个序列(n<=4e5,a[i]<=300)两种操作: 1 ...

  6. zk可视化工具

    也是无意中接触到zk,搞得有点头大,之前都是通过crt连通服务后,在服务上通过命令去查看节点下的数据的,十分的不方便,后来发现了可视化工具这玩意儿还真的是好用,看节啊点下的数据啥的一目了然,我用过的有 ...

  7. 总结一下《vue的使用》

    1.用vue创建项目的时候, 1.安装axios,对axios进行处理,创建axios.js文件,设置基础请求地址, 设置前置守卫和独享守卫,对请求数据进行设置,(特别实在进行token验证的时候特别 ...

  8. java学习路线图(2018年最新版)

    最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从 ...

  9. Node简单的控制台读取和文件操作

    const fs = require('fs'); const readline = require('readline'); const rl = readline.createInterface( ...

  10. 安卓 build/core/Makefile 以及main.mk

    android make 系统总共分为四层 arch board device product 在各个字android.mk文件中引用的定义都存放在./build/core/下!比如android.m ...