多种传感器输出的模拟量转换

news2024/11/15 21:50:42

目录

内部温度传感器与参照电压

传感器

光敏电阻

热敏电阻

反射式红外

对射式红外

驱动代码

Sensor.h

Sensor.c

AD.h 

AD.c

main.c


内部温度传感器与参照电压

STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度。

该温度传感器在内部和ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。

支持的温度范围为:-40~125度。精度比较差,为±1.5℃左右。    

内部温度传感器更适合于检测温度的变化,而不是测量绝对温度。如果需要测量绝对温度,应该使用一个外部温度传感器。

 我们要使用STM32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CR2的TSVREFE位(bit23)设置。设置该位为1则启用内部温度传感器和参照电压。

ADC_TempSensorVrefintCmd(ENABLE);

温度传感器输出电压随温度线性变化,计算公式如下:   

 T(℃)={(V25-Vsense)/Avg_Slope}+25

上式中:  

V25=Vsense在25度时的数值(典型值为:1.43V)。     

Avg_Slope=温度与Vsense曲线的平均斜率(单位为mv/℃或uv/℃)(典型值为4.3mv/℃) 

              内部温度传感器温度和电压关系图

获取温度步骤

传感器

电位器

蓝白电位器是一种可调电阻器,通过旋转它的旋钮,可以调节电阻器的阻值,从而改变输出电压。

传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

从左到右依次为:光敏传感器,热敏传感器,对射式红外传感器,反射式红外传感器

对射式红外传感器模拟引脚输出无效,而且没有电位器

工作电压:DC3.3-5V,GND与单片机共地

本节将电位器,光敏传感器,热敏传感器,反射式红外传感器接入ADC对应的通道,传感器的数字输出比较简单就不写代码了

 硬件电路

 

 这个电压比较器LM393,其实就是是运算放大器

光敏电阻

产品特性

光敏传感器是利用光敏元件将光信号转换为电信号的传感器,一般用来检测周围环境的光线的亮度,触发单片机或继电器模块等。使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。配可调电位器可调节检测光线亮度。设有固定螺栓孔M3,方便安装

控制方法

当环境光线亮度达不到设定值时,DO端输出高电平,当外界环境光线亮度超过设定阈值时,DO端输出低电平。检测亮度可以通过电位器进行调节,顺时针调电位器,检测亮度增加;逆时针调电位器,检测亮度减少。

光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。

简而言之:照射光敏二极管的光强不同,通过光敏二极管的电流大小就不同,所以可以通过检测电流大小,达到检测光强的目的。 利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱。

光线越强,电压越低,光线越暗,电压越高。 

热敏电阻

产品特性
热敏电阻模块对环境温度很敏感,一般用来检测周围环境的温度,采用NTC热敏电阻传感器,温度检测范围为20-80摄氏度。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA,配可调精密电位器调节灵敏度。

控制方法

通过对电位器的调节,可以改变温度检测的阀值(即控制温度值),如需要控制环境温度为50度时:模块则在相应环境温度调到其绿灯亮,DO则输出低电平,低于此设定温度值时,输出高电平,绿灯不亮

模块数字量输出DO可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的温度改变;小板数字量输出DO可以直接驱动继电器模块,由此可以组成一个温控开关,控制相关设备的工作温度,也可以接风扇用来散热等;小板模拟量输出 AO 可以和 AD 模块相连,通过 AD 转换,可以获得环境温度更精准的数值。

反射式红外

采用TCRT5000红外反射传感器,一种集发射与接收于一体的光电传感器,它由一个红外发光二极管和个NPN红外光电三极管组成。检测反射距离1-25mm适用,传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。

控制方法

接好VCC和GND,模块电源指示灯会亮,TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。DO输出接口可以与单片机IO口直接相连,一般接外部中断。模拟输出AO当发射管的红外信号经反射被接收管接收后,接收管的电阻会发生变化,在电路上一般以电压的变化形式体现出来,而经过ADC转换或LM324等电路整形后得到处理后的输出结果。电阻的变化起取于接收管所接收的红外信号强度,常表现在反射面的颜色(反射率)、形状和反射面接收管的距离等方面。

应用案例

可以应用于机器人避障、机器人进行白线或者黑线的跟踪,可以检测白底中的黑线,也可以检测黑底中的白线,是寻线机器的必备传感器。流水线计件、电度表脉冲数据采样、传真机碎纸机纸张检测等众多场合。

对射式红外

产品特性

使用ITR9606高灵敏度槽型光耦器件,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。

应用案例

广泛用于电机转速检测,脉冲计数,位置限位等。

控制方法

接好VCC和GND,模块电源指示灯会亮,模块槽中无遮挡时,接收管导通,模块DO输出低电平,开关指示灯亮;遮挡时,DO输出高电平,开关指示灯灭。模块DO可与继电器相连,组成限位开关等功能,也可以与有源蜂鸣器模块相连,组成报警器。DO输出接口可以与单片机IO口直接相连,一般接外部中断,检测传感器是否有遮档,如用电机码盘则可检测电机的转速。

数字开关量DO输出(0和1),模拟输出A0引脚无效

驱动代码

Sensor.h

#ifndef       _SENSOR_H_
#define		  _SENSOR_H_

void Sensor_Init(void);
#endif

Sensor.c

#include "stm32f10x.h"                  // Device header

void Sensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}

AD.h 

#ifndef __AD_H
#define __AD_H
 
void AD_Init(void);
uint16_t AD_GetValue(uint8_t ADC_Channel);
 
#endif

AD.c

#include "stm32f10x.h"                  // Device header
 
void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz
	
	
	ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器和参照电压ADC通道
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//模式,选择独立模式,即单独使用ADC1
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不用硬件触发,软件触发
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//连续转换,失能,每转换一次规则组序列后停止
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描模式,失能,只转换规则组的序列1这一个位置
	ADC_InitStructure.ADC_NbrOfChannel = 1; //通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE);//使能ADC1,ADC开始运行
	
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}
 
 
/**
  * 函    数:获取AD转换的值
  * 参    数:ADC_Channel 指定AD转换的通道,范围:ADC_Channel_x,其中x可以是0/1/2
  * 返 回 值:AD转换的值,范围:0~4095
  */
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
	ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_239Cycles5);//在每次转换前,根据函数形参灵活更改规则组的通道1
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);//读数据寄存器,得到AD转换的结果
}

main.c

根据需要将模拟量映射到你指定的范围。比如0~3.3,0~100.

数据抖动比较大可以多次测量求平均数滤波。相邻两次测量可加少许延时如:5ms

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "AD.h"
#include "Sensor.h"
#include "Serial.h"

uint16_t Value;
float Voltage;
float temp;

int main(void)
{
	Serial_Init();
	AD_Init();
	Sensor_Init();

	while (1)
	{
		printf("\r\n******************START*****************\r\n");
		
		Value = AD_GetValue(ADC_Channel_0);
		printf("ADValue0=%d Voltage=%.2fV\r\n", Value,(float)Value * 3.3 / 4096);
		Delay_ms(1000);
		
		Value = AD_GetValue(ADC_Channel_1);
		printf("ADValue1=%d Voltage=%.2fV\r\n", Value,(float)Value * 3.3 / 4096);
		Delay_ms(1000);
		
		Value = AD_GetValue(ADC_Channel_2);
		printf("ADValue2=%d Voltage=%.2fV\r\n", Value,(float)Value * 3.3 / 4096);
		Delay_ms(1000);
		
		Value = AD_GetValue(ADC_Channel_3);
		printf("ADValue3=%d Voltage=%.2fV\r\n", Value,(float)Value * 3.3 / 4096);
		Delay_ms(1000);
		
		Value = AD_GetValue(ADC_Channel_16);	//内部温度摄氏度
		temp = (1.43-Voltage)/0.0043+25;	
		printf("ADValue16=%d Voltage=%.2fV\r\n", Value,(float)Value * 3.3 / 4096);
		printf("temp=%.2f\r\n", temp);
		Delay_ms(1000);
		
		Value = AD_GetValue(ADC_Channel_17);	//内部参照电压
		printf("ADValue17=%d Voltage=%.2fV\r\n\r\n\r\n", Value,(float)Value * 3.3 / 4096);
		Delay_ms(1000);
		
		printf("\r\n******************END*****************\r\n");
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IBM中国研发中心撤出:挑战与机遇并存

IBM中国研发中心撤出:挑战与机遇并存 引言 近日,IBM宣布撤出在中国的两大研发中心的消息,引起了广泛关注。这一举动不仅对IBM自身的全球布局产生了影响,也在一定程度上反映了跨国公司在中国市场策略的调整。本文将探讨这一事件背…

5.9 使用LBA 的模式来读取磁盘

注意: 如果再 cmake 中想要 make clean 的话, 直接 删除 build 目录就可以了。 1 也是说 是 MBR还是 LBA 硬盘是可以控制的。 LBA 没有 磁盘, 柱面的概念。 2 对于寄存器的说明。 什么是 CHS呢? 就是机械磁盘。 这里只找到了 LB…

【计算机组成原理】详细解读带符号整数在计算机中的运算

有符号整数的运算 导读一、补码的优势二、补码的加法运算三、补码的减法运算四、原码、反码、补码的特性结语 导读 大家好,很高兴又和大家见面啦!!! 经过前面的介绍,我们已经初步认识了有符号整数的三种表示形式&…

使用ShardingSphere实现MySql的分库分表

目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候&#xf…

Servlet入门学习笔记-Servlet技术

为什么需要Servlet ? 使用JSP技术如何编写服务器动态网页? 流程图:JSP使用Java生成动态内容 在JSP技术出现之前如何编写服务器动态网页? 流程图:Java代码就是Servlet程序 什么是Servlet ? Servlet 是一个…

sqli-labs靶场自动化利用工具——第10关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生,或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢?可能有些人会说不是有sqlmap&#…

YoloV10改进策略:Block改进|PromptIR(NIPS‘2023)|轻量高效,即插即用|(适用于分类、分割、检测等多种场景)

文章目录 摘要代码详解如何在自己的论文中描述摘要 本文使用PromptIR框架中的PGM模块来改进YoloV10。PGM(Prompt Generation Module)模块是PromptIR框架中的一个重要组成部分,主要负责生成输入条件化的提示(prompts)。这些提示是一组可学习的参数,它们与输入特征相互作用…

【Java】方法的重载

文章目录 前言一、方法重载是什么?二、方法重载的注意事项 1、一个类中,只要一些方法的名称相同,形参列表不同,那么它们就是方法重载了,其他的不管(如:修饰符,返回值类型是否一样都无…

彻底学会防抖和节流

目录 防抖(Debounce) 节流(Throttle) 如何选择使用防抖和节流? 总结 Vue 3 中使用防抖(Debounce)和节流(Throttle) 防抖(Debounce)示例 节…

普发Pfeiffer TCP600TCP5000手侧

普发Pfeiffer TCP600TCP5000手侧

unity3d入门教程三

unity3d入门教程三 8.1游戏脚本8.2脚本的使用8.3认识脚本组件8.4帧率9.1游戏脚本9.2获取节点和组件9.3MonoBehaviour9.4父节点与子节点9.5组件的属性9.6脚本的单步调试 8.1游戏脚本 通过程序控制对象属性(如运动,修改transform的位置属性) …

【STM32】VOFA+上位机 PID调参

【STM32】VOFA上位机 PID调参 前言VOFA简介 VOFA配置VOFA动态调节PID参数VOFA控件STM32解析数据包 PID参数整定一般调节法临界比例法试凑法 前言 参考文章如下:VOFA使用说明 使用VOFA上位机进行PID调参 PID参数整定 VOFA VOFA是一款简单易上手的上位机调试软件&a…

vue之我不会

计算属性 例子&#xff1a; 注意&#xff1a;调用计算属性时&#xff0c;不可以带括号&#xff0c;那样调用的就是方法&#xff0c;如&#xff1a;以下调用fullName时不可funnName() <div id"root">姓&#xff1a;<input type"text" v-model"…

Go语言练习——语法实践

目录 一、数组 1.多维数组的声明和使用 2.数组与切片的转换 3.数组在函数中的使用 二、切片 1.切片的动态扩容机制 2.切片的复制与修改 3.切片在排序算法中的应用 三、结构体 1.结构体的嵌套与方法 2.结构体与JSON的序列化 3.结构体的工厂模式 四、映射 1.映射的并发访问 2.映射…

erlang学习: Mnesia Erlang数据库4

表的类型和位置 内存表 它们的速度非常快&#xff0c;但是里面的数据是易失的&#xff0c;所以如果机器崩溃或者你停止了DBMS&#xff0c;数据就会丢失。 磁盘表 磁盘表应该不会受到系统崩溃的影响&#xff08;前提是磁盘没有物理损坏&#xff09;。 当Mnesia事务写入一个表并…

Qt如何链接和使用第三方库详解

在开发Qt应用程序时&#xff0c;我们经常会遇到需要使用第三方库的情况。无论是为了实现特定的功能&#xff0c;还是为了提高开发效率&#xff0c;使用第三方库都是一个非常常见的做法。本文将详细介绍如何在Qt项目中链接和使用第三方库。 基本步骤 配置Qt项目 在Qt项目中使…

Java | Leetcode Java题解之第402题移掉K位数字

题目&#xff1a; 题解&#xff1a; class Solution {public String removeKdigits(String num, int k) {Deque<Character> deque new LinkedList<Character>();int length num.length();for (int i 0; i < length; i) {char digit num.charAt(i);while (!…

最新免费云服务器,有需要的自行领取

目前云服务器市场竞争很激烈&#xff0c;为了吸引用户上云&#xff0c;很多云服务器提供商都提供了相应的免费试用活动&#xff0c;这些活动旨在帮助用户体验其服务和产品。 以下是一些值得关注的最新免费云服务器资源及其特点&#xff1a; 一、雨云 活动地址&#xff1a;点此…

MBD_入门篇_24_SimulinkSources

24.SimulinkSources 24.1 概述 Source库里面是Simulink的产生或输入信号数据的模块&#xff0c;要么用于产生信号要么用于传递上层的信号进来要么接地。用来生成代码的模块并不是很多&#xff0c;大部分都是用来仿真的。 Source库里面的模块都只有输出&#xff0c;没有输入。…

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:下(人物动画)

上个博客我们做出了人物的动画机和人物移动跳跃&#xff0c;接下来我们要做出人物展现出来的动画了 我们接下来就要用到动画机了&#xff0c;双击我们的动画机&#xff0c;进入到这样的页面&#xff0c;我这是已经做好的页面&#xff0c;你们是没有这些箭头的 依次像我一样连接…