TSW-30浊度传感器+STM32F103C8T6+Keil5

作为一名小白,上网找资料不齐全,现在摸索明白了,故写下此文章,供大家参考

免费源码:

【免费】免费:TSW-30浊度传感器+STM32F103C8T6+Keil5资源-CSDN文库

该篇文章是看了b站博主领悟后写下来的,看不懂我的文章可以看下面链接的视频

特此鸣谢:b站的up主 单片机俱乐部

【mcuclub】浑浊度传感器-TSW-30_哔哩哔哩_bilibili

【mcuclub】浑浊度传感器-TSW-30 - 单片机俱乐部

一、接线

下图是我的模块接线图,引脚A我接的是开发板的PA2

二、原理与公式

1、原理(仅供了解)

     这款浊度传感器利用光学原理,通过溶液中的透光率和散射率来综合判断浊度情况。传感器内部是一个红外线对管,当光线穿过一定量 的水时,光线的透过量取决于该水的污浊程度,水越污浊,透过的光就越少。光 接收端把透过的光强度转换为对应的电流大小,透过的光多,电流大,反之透过 的光少,电流小。
      浊度传感器模块将传感器输出的电流信号转换为电压信号,通过单片机进行AD 转换数据处理。具有模拟量和数字量输出接口。模拟量可通过单片 A/D 转换器进行采样处理,以获知当前水的污浊度。数字量可通过模块上的 电位器调节触发阈值,当浊度达到设置好的阈值后, D1 指示灯会被点亮,传感 器模块输出由高电平变成低电平,单片机通过监测电平的变化,判断水的浊度是 否超标,从而预警或者联动其他设备。

2、公式

传感器模块输出电压与浑浊度关系如下图所示。
浊度值与模块输出电压满足如下关系:
TU =-865.68× U+K
上式中 TU 为当前浊度值, U 为当前温度条件下模块的输出电压值, K 为截距值,需通过标定方法得到。
传感器输出电压值大小受温度影响,输出电压与温度曲线关系如下图所示。进行浊度测量时需进行温度补偿以保证测量精度。
温度校正公式:
∆U=- 0.0192×(T-25)
上式中U 为温度变化引起的电压差; T 为当前测量温度值。

3、校准方法,即求出k值

由于浊度传感器的个体差异、环境光或未进行温度补偿等原因。为获得更精确的浊度值,在测量之前,必须进行校准。具体操作方法介绍如下。
      第一步:安装浊度传感器,给传感器模块供电。使用 0NTU 的标准溶液(或
者接近 0NTU 的纯净水或蒸馏水)进行校准;
      第二步:在传感器使用环境状态下(尽量避免光线强弱引起的误差)测量记
录当前校准溶液的温度值并记录为 T 1 ;测量并记录传感器模块的输出电压为
U 1
     第三步:计算温差引起的电压差值∆U 。将测量得到 T1 代入温度修正公式。
∆U=- 0.0192×(T1-25)
     第四步:计算 0NTU 标准液( 25 ℃)标准电压值 U 2
U2=U1-∆U
     第五步:计算 K 值,将计算得到标准电压值 U 2 代入标准曲线公式。
K= -865.68×U2
     第六步:修正标准曲线公式。将计算得到的 K 代入标准曲线公式。
TU =-865.68× U+K

三、实操+代码

1、代码

#include "stm32f10x.h"
#include "bsp_usart1.h"
#include <string.h>
#include "delay.h"
#include "driver_1602.h"
#include "math.h"
#include "bsp_adc.h"
#include "ds18b20.h"
 
float TU=0.0;
float TU_value=0.0;
float TU_calibration=0.0;

float temp_data=250.0;
float K_Value=2856.046553;

u8 ISendByte(unsigned char sla,unsigned char c);
u8 IRcvByte(unsigned char sla);	
u8 SPIx_ReadWriteByte(u8 TxData);


// ADC1转换的电压值通过MDA方式传到SRAM
extern __IO uint16_t ADC_ConvertedValue;

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal;  


/**************TDS值采集函数***************/
void TU_Value_Conversion()
{
	TU =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值
	
	TU_calibration=-0.0192*(temp_data/10-25)+TU;  
	TU_value=-865.68*TU_calibration+ K_Value ;
	
	if(TU_value<=0){TU_value=0;}
	if(TU_value>=3000){TU_value=3000;}
}

void TEMP_Value_Conversion()
{
	  temp_data=DS18B20_Get_Temp();
}


int main(void)
{	
    /*初始化DS18B20模块*/
    //DS18B20_Init();

    /* 配置USART1 */
    USART1_Config();
	// ADC 初始化
	ADCx_Init();  
	
  while(1)
	{	
		//TEMP_Value_Conversion();
		TU_Value_Conversion();	
		
		printf("%.2f\n",TU_value);
		delay_ms(1000);
		
	}	
}

2、校准浑浊度,求k值

因为没有ds18b20模块测水温,所以我直接设定水温temp_data为25℃。

求出k值:TU_value值即为k值。将TU_Value_Conversion函数改动两个地方,如下图

将浊度模块放入清水中,代码烧录到开发板,串口打印出数据。

注意:校准时,模块测的数据一定是清水里的,而不是在空气中

将K_Value设为串口打印的数值。将代码恢复会原状。烧录代码,串口打印为0.00

注意:

刚开始浊度模块的数据有跳动,要等到稳定为止,如果还是有小浮动的跳动,要取数据的最小值求k值。因为根据公式

水越清,电压越高。则TU_value越小(负数),k越小。如果不取最小值作为k值,会导致有点浑浊也会浑浊度为0

将浑浊度模块放到不同浊度的水里,串口打印不同数据

我是将泥土放进杯中检测的,因为泥土会不断下沉,所以浑浊度是不断减小的。

四、注意事项

1、浊度传感器可以测量水中什么物质?
答:浊度传感器测量的是水环境中的颗粒状漂浮物,如:泥沙、黏土、金属颗粒、有机物、浮游生物和微生物等悬浮物质;不太适合测量例如墨汁、颜色色料造成的水质污染环境;用几滴墨水混合纯净水来测量的方式是错误的方案。

2、浊度传感器顶端不防水,使用时禁止将浊度传感器完全抛入水中,水面不能没过顶盖与壳体连接处,传感器进水会造成传感器烧坏。

3、传感器头部壳体需保持清洁,避免污染物遮挡造成测量不准。

4、传感器光敏二极管接收光线的波长范围为(500~1050nm),日光或日光 灯光线波长会影响传感器光敏电阻的接收,影响测量输出。日光或灯光直射会增 大传感器测量误差,传感器使用时应避免日光或灯光直射。

### STW-30 浊度传感器STM32 的连接及编程 #### 1. 硬件连接 对于 TSW-30 浊度探头,通常会提供模拟电压输出信号来表示测量到的浊度值。因此,硬件连接主要涉及将该模拟信号接入 STM32 微控制器上的 ADC 输入通道。 | 探头引脚 | 功能 | 对应 STM32 引脚 | |----------|------------|----------------| | VCC | 电源正极 | +3.3V 或者 +5V (取决于具体型号) | | GND | 地线 | GND | | OUT | 输出信号 | PA0(ADC_IN0)或其他可用的 ADC 引脚 | 表中的 `OUT` 是指从 TSW-30 发出的代表当前水体浑浊程度的模拟电平信号;而 `PA0` 则是 STM32 上用于读取此模拟量的一个典型例子[^1]。 #### 2. 软件配置 为了能够成功获取来自 TSW-30 的数据,在软件层面需要完成如下几项工作: - **初始化 ADC 模块**:确保选择了合适的采样时间和分辨率。 - **启动一次转换请求**:这可以通过调用 HAL 库函数实现,比如 `HAL_ADC_Start()` 来触发单次转换操作。 - **等待转换结束并读回结果**:利用中断服务程序或轮询方式监测状态标志位的变化情况,当检测到转换已完成时就可以安全地访问相应的寄存器得到最终数值了。 下面给出一段简单的 C 语言代码片段作为参考,展示了如何基于标准外设驱动库对上述过程进行编码: ```c #include "stm32f1xx_hal.h" // 假定已经完成了必要的系统初始化... void setup_adc(void){ __HAL_RCC_ADC1_CLK_ENABLE(); // 开启 ADC1 时钟 ADC_ChannelConfTypeDef sConfig = {0}; /* 配置 ADC */ hadc.Instance = ADC1; hadc.Init.ScanConvMode = DISABLE; // 单一模式 hadc.Init.ContinuousConvMode = ENABLE; // 连续转换模式开启 if(HAL_ADC_Init(&hadc)!= HAL_OK){ Error_Handler(); } /** 配置为常规通道 * Channel: ADC_CHANNEL_0, * Rank: 1, * Sampling Time: ADC_SAMPLETIME_3CYCLES */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; if(HAL_ADC_ConfigChannel(&hadc,&sConfig) != HAL_OK){ Error_Handler(); } } uint16_t read_turbidity(){ uint32_t raw_value=0; HAL_ADC_Start(&hadc); // 启动 ADC 转换 HAL_ADC_PollForConversion(&hadc,100);// 等待转换完成 raw_value = HAL_ADC_GetValue(&hadc); // 获取转换后的值 return (uint16_t)(raw_value); } ``` 这段代码实现了基本的 ADC 初始化以及读数流程,并假设使用的是 STM32F1 系列微处理器及其配套的标准外设驱动库[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值