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

本文介绍了博主如何在STM32F4微控制器上使用薄膜压力传感器(FSR)并通过ADC获取模拟输出,实现压力值计算,分享了main.c源码和关键函数,如ADC初始化、数据获取与映射过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

源码下载链接:

https://download.csdn.net/download/m0_61712829/89319835icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89319835


main.c

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

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

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

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

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

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

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

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)
{ 	


}				  
//获得ADC值
//返回值:转换结果
u16 Get_Adc(u8 ch)   
{

	
}

//获取通道ch的转换值,取times次,然后平均
//ch:通道编号  times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{
	
} 	 


adc.h

#ifndef __ADC_H
#define __ADC_H	

#include "stm32f4xx.h"                  // Device header

typedef 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 

源码下载:

https://download.csdn.net/download/m0_61712829/89319835icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89319835

 

评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿齐Archie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值