Stm32_标准库_8_ADC_光敏热敏传感器_测数值

2023-10-14 21:04

本文主要是介绍Stm32_标准库_8_ADC_光敏热敏传感器_测数值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可

在这里插入图片描述
由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数

函数1:

uint16_t AD_Getvailue(uint8_t ADC_Channel){//获取信息/*在规则组列表第一个位置,写入通道0这个通道*/ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成return ADC_GetConversionValue(ADC1);//读取数据
}

在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_0

函数2:

uint8_t Length(uint16_t num){uint8_t length = 0;if(num == 0) return (uint8_t) 1;while(num > 0){num = num / 10;length = length + 1;}return length;
}

求无符号数字的长度函数,方便后续清屏

函数3:

uint8_t SignedNum_Length(int32_t num){uint8_t length = 1;//符号位占1位if(num == 0) return (uint8_t) 1;if(num < 0) num = - num;while(num > 0){num = num / 10;length = length + 1;}return length;
}

求有符号数字的长度重点考虑到符号也要占一位

函数4:

int32_t Reality_Tmperature(uint16_t Vout){//获取实际温度double T = 0;//获取的实际温度T = -0.0423 * Vout + 105 + 0.5;//模拟电压转实际温度公式return (int32_t) T;}

获取实际温度的公式,重点讲输入的模拟电压Vout转换成日常用的摄氏度

除此之外还将库函数输出OLED带符号位的函数也做了修改

在这里插入图片描述
函数:

void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;Length = Length - 1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}

由于此函数在写入带符号数字时是不考虑符号的额外长度的所以为了更好配合SignedNum_Length(int32_t num);函数所以我对其也进行了修改

完整代码如下:

#include "stm32f10x.h"    // Device header
#include "Delay.h"
#include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct;
ADC_InitTypeDef ADC_InitStruct;void AD_Init(void){//初始化ADRCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC模块工作时钟 72 / 6 = 12MHZ/*配置GPIO口*/GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);/*在规则组列表第一个位置,写入通道0这个通道*///ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);/*结构体初始化ADC*/ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发方式,不使用外部触发,即软件触发ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//ADC工作模式为独立模式ADC_InitStruct.ADC_NbrOfChannel = 1;//通道数目ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描ADC_Init(ADC1, &ADC_InitStruct);//开启ADC电源ADC_Cmd(ADC1, ENABLE);/*给ADC校准*/ADC_ResetCalibration(ADC1);//复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回ADC1复位校准状态ADC_StartCalibration(ADC1);//开始校准while(ADC_GetCalibrationStatus(ADC1) == SET);//等待校准完成
}uint16_t AD_Getvailue(uint8_t ADC_Channel){//获取信息/*在规则组列表第一个位置,写入通道0这个通道*/ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发转换while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//等待转换完成return ADC_GetConversionValue(ADC1);//读取数据
}
uint8_t Length(uint16_t num){uint8_t length = 0;if(num == 0) return (uint8_t) 1;while(num > 0){num = num / 10;length = length + 1;}return length;
}uint8_t SignedNum_Length(int32_t num){uint8_t length = 1;//符号位占1位if(num == 0) return (uint8_t) 1;if(num < 0) num = - num;while(num > 0){num = num / 10;length = length + 1;}return length;
}
uint16_t Reality_ADLight(uint16_t ADCnum){//获取光照强度return 100 - ADCnum / 40;
}int32_t Reality_Tmperature(uint16_t Vout){//获取实际温度double T = 0;//获取的实际温度T = -0.0423 * Vout + 105 + 0.5;//模拟电压转实际温度公式return (int32_t) T;}void OLED_Tmperature_Printf(uint8_t line, uint8_t col ,int32_t num, uint8_t length){if(num == 0){OLED_ShowNum(line, col, num, length);}else{OLED_ShowSignedNum(line, col, num, length);}
}int main(void){OLED_Init();//初始化OLEDAD_Init();while(1){uint16_t num  = AD_Getvailue(ADC_Channel_0);uint16_t num1 = Reality_ADLight(num); uint16_t NUM =  AD_Getvailue(ADC_Channel_1);int32_t NUM1 =  Reality_Tmperature(NUM);OLED_ShowString(1, 1, "ADO:");OLED_ClearLocation(1, Length(num) + 3);//"ADO:"长度为3所以要加3OLED_ShowNum(1, 5, num, Length(num));OLED_ShowString(2, 1, "LUX:");OLED_ClearLocation(2, Length(num1) + 3);OLED_ShowNum(2, 5, num1, Length(num1));OLED_ShowString(3, 1, "wendu:");OLED_ShowNum(3, 7, NUM, Length(NUM));OLED_ClearLocation(3, Length(NUM) + 6);OLED_Tmperature_Printf(4, 1, NUM1, SignedNum_Length(NUM1));OLED_ClearLocation(4, SignedNum_Length(NUM1));Delay_ms(300);}
}

效果:

在这里插入图片描述

这篇关于Stm32_标准库_8_ADC_光敏热敏传感器_测数值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/213148

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

C 标准库 - `<float.h>`

C 标准库 - <float.h> 概述 <float.h> 是 C 标准库中的一个头文件,它定义了与浮点数类型相关的宏。这些宏提供了关于浮点数的属性信息,如精度、最小和最大值、以及舍入误差等。这个头文件对于需要精确控制浮点数行为的程序非常有用,尤其是在数值计算和科学计算领域。 主要宏 <float.h> 中定义了许多宏,下面列举了一些主要的宏: FLT_RADIX:定义了浮点数的基数。

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品