STM32F4+薄膜压力传感器(FSR)AO模拟输出程序ADC模数转换器详解

前言:博主在使用STM32F4加薄膜压力传感器用来测量压力时,发现给的例程只有STM32F1系列的,而STM32F4系列库函数程序不太一致,博主实战解决了该问题,用STM32F4标准库开发。有关ADC模数转换器的详细知识点详情点击我的博文 (ADC模数转换器详解链接):https://archie.blog.csdn.net/article/details/136723340?spm=1001.2014.3001.5502

STM32F4+薄膜压力传感器(FSR)AO模拟输出程序:

main.c

main.c是用于读取薄膜压力传感器(FSR)的模拟输出,并将其映射到实际压力值范围内。主要功能是读取薄膜压力传感器的模拟输出,并将其转换为相应的压力值。

  1. 首先包含了一些必要的头文件,包括STM32的相关头文件以及自定义的延迟、串口、ADC和FSR的头文件。

  2. 定义了一些常量,如最小和最大量程、最小和最大电压范围等。

  3. main()函数中,初始化延迟、中断和串口,并进行ADC的初始化。

  4. 进入主循环后,通过Get_Adc_Average()函数获取ADC的10次平均值,并将其映射到电压值范围内。然后根据电压值的情况,计算相应的压力值。

  5. 使用printf()函数输出ADC值、电压值和压力值。

  6. 最后通过延迟一段时间,实现数据的周期性读取。

#include "stm32f4xx.h"                  // Device header
#include <stdint.h>
#include <stdbool.h>  
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "usart1.h"
#include "adc.h"//最小量程
#define PRESS_MIN	20
//最大量程 
#define PRESS_MAX	6000
#define VOLTAGE_MIN 100
#define VOLTAGE_MAX 3300
u8 state = 0;
u16 val = 0;
u16 value_AD = 0;long PRESS_AO = 0;
int VOLTAGE_AO = 0;long map(long x, long in_min, long in_max, long out_min, long out_max);int main(void)
{I2C_Configuration();//配置CPU的硬件I2C	OLED_Init();Adc_Init();OLED_CLS();//清屏while(1){value_AD = Get_Adc_Average(13,10);	//10次平均值VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300);if(VOLTAGE_AO < VOLTAGE_MIN){PRESS_AO = 0;}else if(VOLTAGE_AO > VOLTAGE_MAX){PRESS_AO = PRESS_MAX;}else{PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);}//printf("AD值 = %d,电压 = %d mv,压力 = %ld g\r\n",value_AD,VOLTAGE_AO,PRESS_AO);OLED_ShowNum(1,1,value_AD,5);OLED_ShowNum(2,1,VOLTAGE_AO,5);OLED_ShowNum(3,1,PRESS_AO,5);Delay_ms(500);}	
}
long map(long x, long in_min, long in_max, long out_min, long out_max) {return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;}

adc.c

博主使用的adc通道是PC3-ADC123_IN13(adc1和adc2和adc3的通道13)

首先Adc_Init初始化adc

  1. 定义了需要用到的结构体:GPIO_InitTypeDef、ADC_InitTypeDef和ADC_CommonInitTypeDef。
  2. 使能了ADC1通道的时钟和GPIOC端口的时钟。
  3. 配置PC3引脚作为模拟通道输入引脚,设置为模拟输入引脚并且不使用上拉或下拉。
  4. 对ADC1进行复位操作。
  5. 初始化ADC Common 结构体参数,包括禁止DMA直接访问模式、独立ADC模式、时钟分频等。
  6. 初始化ADC Init 结构体参数,包括单通道模式、数据右对齐、外部触发通道、ADC分辨率等。
  7. 根据ADC_Init结构体中的参数初始化ADC1外设寄存器。
  8. 使能ADC1。

然后是获取ADC转换结果的函数。函数名称为Get_Adc(u8 ch)

  1. 使用ADC_RegularChannelConfig函数设置ADC规则组通道和采样时间。
  2. 使用ADC_SoftwareStartConv函数启动ADC转换。
  3. 使用while循环等待ADC转换结束,通过检查ADC_FLAG_EOC标志位来判断转换是否完成。
  4. 使用ADC_GetConversionValue函数获取最近一次ADC转换的结果,并将其返回。

最后是获取指定通道(ch参数)的ADC转换结果,并对转换结果进行多次采样(times次),然后计算这些采样值的平均值。

  1. 使用for循环对指定通道进行多次采样,每次采样后将转换值累加到temp_val变量中。
  2. 在每次采样之间通过Delay_ms函数添加延时,这有助于确保每次转换之间有足够的间隔。
  3. 最后,将temp_val除以采样次数times,得到平均值,并将其返回。
 #include "adc.h"#include "Delay.h"/*
Ao:接ADC模拟电压信号输出--PC3-ADC123_IN13(adc1和adc2和adc3的通道13)
*/	  //初始化ADC
//规则通道																   
void  Adc_Init(void)
{ 	//定义结构体GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure;//使能ADC1通道时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//PC3 作为模拟通道输入引脚 不上拉不下拉                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	//不上拉不下拉GPIO_Init(GPIOC, &GPIO_InitStructure);	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);   //ADC1复位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);    //复位结束//ADC Common 结构体 参数 初始化ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; // 禁止DMA直接访问模式	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;// 独立ADC模式ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;// 时钟为fpclk x分频	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;// 采样时间间隔	ADC_CommonInit(&ADC_CommonInitStructure);//ADC Init 结构体 参数 初始化ADC_StructInit(&ADC_InitStructure);ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//模数转换工作在单通道模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC数据右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;//外部触发通道,本例子使用软件触发,此值随便赋值即可ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止外部边沿触发ADC_InitStructure.ADC_NbrOfConversion = 1;//顺序进行规则转换的ADC通道的数目ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;// ADC 分辨率ADC_InitStructure.ADC_ScanConvMode = DISABLE;//模数转换工作在单次转换模式ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1}				  
//获得ADC值
//返回值:转换结果
u16 Get_Adc(u8 ch)   
{ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_56Cycles);//设置ADC规则组通道,一个序列,采样时间480ADC_SoftwareStartConv(ADC1);//使能指定的ADC1的软件转换启动功能while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//读取状态寄存器的状态位EOC,等待转换结束return ADC_GetConversionValue(ADC1);//返回最近一次的ADC1规则组的转换结果}//获取通道ch的转换值,取times次,然后平均
//ch:通道编号  times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);//取times次通道值进行求和Delay_ms(5);}return temp_val/times; //返回平均值
} 	 

adc.h

#ifndef __ADC_H
#define __ADC_H	#include "stm32f4xx.h"                  // Device headertypedef uint16_t u16;
typedef uint8_t u8;void Adc_Init(void);
u16  Get_Adc(u8 ch); 
u16 Get_Adc_Average(u8 ch,u8 times); #endif 

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

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

相关文章

ChatGPT是什么,怎么使用,需要注意些什么?

一、ChatGPT 是什么&#xff1f; ChatGPT&#xff0c;全称聊天生成预训练转换器&#xff08;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是 OpenAI 开发的人工智能(AI)聊天机器人程序&#xff0c;于2022年11月推出。该程序使用基于GPT-3.5、GPT-4架构的…

基于java+springboot+vue实现的旅游信息管理系统(文末源码+Lw+ppt)23-464

摘 要 本系统为用户而设计制作旅游信息管理系统&#xff0c;旨在实现旅游信息智能化、现代化管理。本旅游信息管理自动化系统的开发和研制的最终目的是将旅游信息的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件…

【C语言】空心正方形图案

思路&#xff1a; 1&#xff0c;两行两列打印* &#xff1a;第一行和最后一行&#xff0c;第一列和最后一列。 2&#xff0c;其他地方打印空格。 代码如下&#xff1a; #include<stdio.h> int main() { int n 0; int i 0; int j 0; while (scanf("…

centos创建并运行一个redis容器 并支持数据持久化

步骤 : 创建redis容器命令 docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes 进入容器 : docker exec -it mr bash 链接redis : redis-cli 查看数据 : keys * 存入一个数据 : set num 666 获取数据 : get num 退出客户端 : exit 再退…

GaussDB分区表自动新增分区

前言 GaussDB是华为自主研发的企业级分布式关系型数据库&#xff0c;支持集中式和分布式两种部署方式。为企业提供了高可用&#xff0c;高可靠&#xff0c;高安全等能力&#xff0c;其产品全栈自研&#xff0c;并且具有完善生态工具和开源社区。在实际去O的项目过程&#xff0…

自己录的视频怎么配上字幕?推荐几种方法

自己录的视频怎么配上字幕&#xff1f;在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐消遣的重要形式。而对于许多内容创作者来说&#xff0c;为自己的视频添加字幕不仅能提升观众的观看体验&#xff0c;还能增加视频的专业度和吸引力。那么&#xff0c;如何为自己的…

MM1: Methods, Analysis Insights from Multimodal LLM Pre-training

MM1: Methods, Analysis & Insights from Multimodal LLM Pre-training 相关链接&#xff1a;arxiv 关键字&#xff1a;多模态学习、大型语言模型、预训练、视觉语言连接、混合专家模型 摘要 本文讨论了构建高性能的多模态大型语言模型&#xff08;MLLMs&#xff09;。特别…

【鸿蒙HarmonyOS开发笔记】动画过渡效果之布局更新动画

概述 动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#x…

云原生(四)、Docker-Compose

Docker-Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个简单的 YAML 文件来配置应用程序的服务、网络和卷&#xff0c;从而使得在不同环境中轻松部署应用程序变得更加简单和可靠。 Docker Compose 主要由以下几个核心组件组成&#xf…

HTML静态网页成品作业(HTML+CSS)——世博园介绍(2个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有2个页面。 二、作品演示 三、代…

BUUCTF-Ezsql1

1.打开靶机 打开第一个链接 2.万能密码 使用万能密码&#xff1a;a or 1 # 密码为随意 第二个用kali打开 3.ssh连接靶机 ssh ctf284490d0-7600-4c65-9160-5ced02f45633.node5.buuoj.cn -p 28191 由题可知密码为123456 4.找到并修改index.php文件 找到index.php文件 #内容如…

Springboot整合支付宝沙箱支付

2.配置说明 要记住这几个重要的配置 appId 这个是appIdprivateKey 商户私钥publicKey 支付宝公钥, 即对应APPID下的支付宝公钥notifyUrl 支付成功后异步回调地址(注意是必须是公网地址)returnUrl #支付后回调地址signType 签名类型 一般写 RSA2charset utf-8format json #网关…

数据结构奇妙旅程之红黑树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

印染厂区污水怎么处理

印染厂污水处理是一项十分重要且紧迫的环境问题。随着工业化的快速发展&#xff0c;印染厂所排放的大量废水不仅对环境造成了严重影响&#xff0c;也对人们的生活和健康带来了潜在的威胁。因此&#xff0c;寻找有效的印染厂污水处理方法显得尤为重要。 针对印染厂污水的特点&am…

通过Arthas修改并热发布代码

通过Arthas修改并热发布代码 主要使用jad、mc、retransform三个命令&#xff1a; jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.javamc /tmp/UserController.java -d /tmpretransform /tmp/com/example/demo/arthas/user/UserCo…

tp8 mpdf 导出pdf

1. 安装mpdf composer require mpdf/mpdf 2. 然后 使用 use mpdf\Mpdf; 或者 require_once __DIR__ . /vendor/autoload.php; 官方文档 mPDF – mPDF 手册 文档里有很多东西 可以自己去研究 3. 编写代码 下载 (支持中文) $mpdf new Mpdf([mode > utf-8,"autoS…

实在智能与中国信通院联合牵头智能体(Agent)标准编制

近日&#xff0c;中国信息通信研究院&#xff08;以下简称“信通院”&#xff09;启动国内首个《智能体&#xff08;Agent&#xff09;技术要求与评估方法》系列标准编制&#xff0c;实在智能作为参编单位并牵头编制技术能力部分&#xff0c;深度参与该标准对智能体技术要求和评…

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码&#xff1a;dqph 为什么要使用阿里云服务器&#xff1f; 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…

续上篇 qiankun 微前端配置

上篇文章地址&#xff1a;微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用&#xff1a; src/main.js 配置&#xff1a; import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …