这段时间实在是太忙了,又是忙于本科毕业论文,考研的事情也才落下帷幕。
五一期间高中的一位老师联系我商量着设计一款《基于薄膜式应变片的压力测量装置》用于科创大赛,但是大概要做成类似于电子秤一样的装置。
一般来说呢,电子秤的方案是不会用薄膜式压力传感器的作为传感器#压力传感器,大部分会选择悬臂梁式传感器、电阻应变片或者S型传感器,薄膜应变片来测重这个方案显然不是明智之选。可是在赛事方要求下,必须采用薄膜式压力传感器且测量装置应该搭在底部平台,那可谓是挑战颇大。
1、薄膜应变片特性
薄膜压力传感器不像常规金属应变片,其电阻有一个触发力,当压力大于触发力时,电阻值将会骤降继而保持一定规律。
在未触发之前,薄膜压力传感器电阻将近20M,常规的应变片电阻则相对较小,通常为120Ω,在受到形变后电阻发生变化。所以薄膜压力传感器不能像应变片那样使用差分放大电路实现精准测量。
碍于时间紧张,于是采用最简单的电路分压方案先进行测量。
2、主控和软件部分
主控制器打算使用#ESP32 使用蓝牙和手机APP传输,经过测试后发现ESP32能够正常的采集电压和传输,这里不过多赘述,主要是ESP32开启#BLE 如何和手机进行通讯,代码如下:
#include<BLEDevice.h>#include<BLEServer.h>#include<BLEUtils.h>#include<BLE2902.h>#include<driver/adc.h>// BLE 配置#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"constint adc2_pin = 4;BLECharacteristic *pCharacteristic;bool deviceConnected = false;// BLE 连接状态回调classMyServerCallbacks :public BLEServerCallbacks {voidonConnect(BLEServer* pServer){deviceConnected = true;}voidonDisconnect(BLEServer* pServer){deviceConnected = false;pServer->startAdvertising(); // 断开后重新广播}};voidsetup(){Serial.begin(115200);adc2_config_channel_atten(ADC2_CHANNEL_0, ADC_ATTEN_DB_11);// 初始化BLEBLEDevice::init("ESP32-ADC");BLEServer *pServer = BLEDevice::createServer();pServer->setCallbacks(new MyServerCallbacks());BLEService *pService = pServer->createService(SERVICE_UUID);pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID,BLECharacteristic::PROPERTY_READ |BLECharacteristic::PROPERTY_NOTIFY);pCharacteristic->addDescriptor(new BLE2902());pService->start();BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();pAdvertising->addServiceUUID(SERVICE_UUID);pAdvertising->setScanResponse(true);pAdvertising->setMinPreferred(0x06);BLEDevice::startAdvertising();Serial.println("BLE 已启动,等待连接...");}voidloop(){if (deviceConnected) {int sum = 0;int validSamples = 0;// 连续读取10次ADC并求平均for (int i = 0; i < 10; i++) {int raw;esp_err_t result = adc2_get_raw(ADC2_CHANNEL_0, ADC_WIDTH_BIT_12, &raw);if (result == ESP_OK) {sum += raw;validSamples++;}delay(5); // 每次采样之间稍作延迟,避免过快}if (validSamples > 0) {int avgRaw = sum / validSamples;float voltage = (float)avgRaw * 3.3 / 4096;unsignedlong runTimeSec = millis() / 1000;// 发送格式:ADC:平均值 Time:秒char txString[32];sprintf(txString, "ADC:%.2f",voltage);pCharacteristic->setValue(txString);pCharacteristic->notify();Serial.printf("Avg ADC: %d,Time: %lusn", avgRaw, runTimeSec);}delay(100); // 控制发送频率}delay(1);}
APP采用#NETMAUI 框架,也不做过多赘述。
3、技术难点
经过实际的测试,发现要实现精准的压力(承重)测量有几个难点:
首先是受力不均匀的问题,由于薄膜传感器有效区域是一个圆形大小受力面积对它的影响很大。
为了解决受力问题,利用3D打印制作一个受力板,让承重受力能够均匀的施加到传感器的有效工作区中。
其次就是我发现同样的重物下,传感器的电阻值会随着时间而发生变化(这个非常麻烦)。不同时间下传感器的值不统一,这让数据处理造成了很大的麻烦。经过测量,其变化百分比趋势如下:
大小相差6%以上,后来经过细心观察发现,大概是这个传感器在发生本征形变,经过重物受压一段时间后,这种自身数值变化将会趋于稳定,因此可以选择考虑选择经过工作(受压)一段时间后的传感器数据作为拟合源,将承重和传感器数值进行拟合。
4、数据拟合
将工作一段时间后的传感器输出电压值和承重压力进行拟合,我们可以得到下图所示曲线。
它的具体函数是这样子的:
其中x是0~4096也就是ESP32原始的数字电压,我们不难发现,它的函数曲线近似反曲函数,并且它的压力-电阻曲线也是一条近似反曲函数。于是在这个的基础上,我们对其进行数据处理。
利用这个方法,我们就可以近似的得到电压和承重力关系。
1919