STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

您所在的位置:网站首页 单片机加传感器 STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

2024-07-16 19:30| 来源: 网络整理| 查看: 265

单片机型号及压力传感器:

STM32F103C8T6 最小系统板

压力传感器选用的是薄膜压力传感器

生活中经常遇到需要测量压力值,因此,考虑到这样的需求从网上买了一个薄膜压力传感器,实物图如下:

柔性薄膜压力传感器的产品特点:

超薄,厚度小于0.3mm响应速度快寿命长,通过100万次以上按压测试检测电路简单,易于集成应用可定制传感器外形可定制传感器量程参数

产品描述:

        柔性压力传感器再柔韧轻薄材料上印刷附着力强、耐弯折、灵敏度高的柔性纳米功能材料,使其实现对压力的高灵敏度检测。

        柔性薄膜压力传感器是一种电阻式传感器,输出电阻随施加再传感器表面压力的增大而减小,通过特定的压力-电阻关系,可测量出压力大小。适用于柔性面的压力测量场景,可广泛应用于智能家居、消费电子、汽车电子、医疗设备、工业控制、智能机器人等领域。

        其它一些特性,大家可以网上查询,网上资料很多。

        测量压力的电路有两种形式:

        方法一、相对简单,只需要测量传感器的电压变化即可分析出压力的变化。

该电路采用分压方式测量。将压力变化再传感器上产生的电阻值的变化,转换为电压的变化,Vout为输出电压,可接到后端电路。

根据实际情况选择R1,通常可取47KΩ-1MΩ无压力时,传感器阻值在10MΩ以上,等效与断路

        方法二、相对复杂,通过运放实现电压和电流的变化。

 在分压测量的基础上,增加运算放大器电路,可提高电压测量分辨率;增大驱动电流。

根据实际情况选择电路参数无压力时,传感器阻值在10MΩ以上,近似断路

使用注意事项:

传感器使用时尽量使所受负载均匀,避免尖锐物体直接接触传感器;超量程使用会降低传感器性能甚至破坏传感器;传感器端子为铜镀锡材质,可根据需求自行焊接引线。要注意焊接温度不宜太高,建议不超过300℃,接触时间不超过1秒,以免高温使薄膜衬低融化变形。

文章中,使用方法一来实现压力信息的采集,材料的选择:

电阻这里使用的时R = 200KΩ供电电源选用的是3.3V选择一个适中的薄膜压力传感器单片机选用STM32F103C8T6将采集的信息通过串口1输出显示

接下来先看电路连接图:

 加了热熔胶,极丑,将就看吧,接下来先用标准库完成压力值采集。

本课题涉及的技能点有如下几点:

1.ADC转换——采集压力传感器数据

2.串口——显示压力传感器数据

与STM32连接表:

STM32压力传感器PA1输出引脚PA9串口1TXPA10串口1RX

标准库实现:

ADC实现

#include "stm32f10x.h" #include "delay.h" /**************************************** 函数名称:void ADC_Config(void) 函数参数:无参 函数返回值:无 函数功能:ADC基本配置,选择PA5口 创建作者:王艇 创建时间:2021.5.26 联系方式: 修改作者: 修改时间: 修改说明: ****************************************/ void ADC_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // ADC1 工作模式配置 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_13Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); } /**************************************** 函数名称:u16 Read_ADC(void) 函数参数:无参 函数返回值:u16 表示ADC的返回值 函数功能:获取ADC的值,并返回 创建作者:王艇 创建时间:2021.5.26 联系方式: 修改作者: 修改时间: 修改说明: ****************************************/ u16 Read_ADC(void) { u16 ADC_VALUE = 0; ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); ADC_VALUE = ADC_GetConversionValue(ADC1); ADC_ClearFlag(ADC1, ADC_FLAG_EOC); return ADC_VALUE; } void adc_1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //禁止扫面,单通道不需要扫描 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不用外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //转换通道数 1 ADC_Init(ADC1, &ADC_InitStructure); /* 配置ADC时钟为8分频,即9M */ RCC_ADCCLKConfig(RCC_PCLK2_Div8); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); //初始化ADC校准器 while(ADC_GetResetCalibrationStatus(ADC1)); //等待ADC校准寄存器初始化完成 ADC_StartCalibration(ADC1); //开始校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成 } u16 get_adc(void) { u16 value; /*读取ADC的值一定要调用此函数,因为前面配置为软件触发*/ ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); value = ADC_GetConversionValue(ADC1); return value; } //为了AD的转换值更加准确,我们采用多次采集求平均的方式 u16 Get_Adc_Average(u8 times) { u32 temp_val=0; u8 t; for(t=0;t


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3