搞完了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. HTML5中的Web Notification桌面通知(右下角提示)

    html5桌面通知(Web Notifications)对于需要实现在新消息入线时,有桌面通知效果的情况下非常有用,在此简单介绍一下这个html5的新属性.通过Web Notifications(桌面 ...

  2. 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 ...

  3. Windows-universal-samples学习笔记系列五:Custom user interactions

    Custom user interactions Basic input Complex inking Inking Low latency input Simple inking Touch key ...

  4. rails 数据迁移出问题

    数据migrate重置 rails db:migrate:reset 具体的,,还不清楚,想起来了再去补充

  5. Fiddler建好代理后,能连到手机,但手机不能上网了是什么原因

    依次 tools(工具) >>   fiddler options(fiddler选项)   >>   connections( 连接) >>allow remot ...

  6. 2019.01.02 洛谷P4512 【模板】多项式除法

    传送门 解析 代码: #include<bits/stdc++.h> #define ri register int using namespace std; typedef long l ...

  7. C[a,b]向量空间中的函数的线性相关性

  8. java启动jar包中的指定类

    运行jar文件的方法是:java -jar xxx.jar 希望运行里面的具体某个类,这时可以通过:java -cp xxx.jar xxx.com.xxxx 其中-cp命令是将xxx.jar加入到c ...

  9. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十之铭文升级版

    铭文一级: 第八章:Spark Streaming进阶与案例实战 updateStateByKey算子需求:统计到目前为止累积出现的单词的个数(需要保持住以前的状态) java.lang.Illega ...

  10. Redis的appendfsync参数详解

    redis.conf中的appendfysnc是对redis性能有重要影响的参数之一.可取三种值:always.everysec和no. 设置为always时,会极大消弱Redis的性能,因为这种模式 ...