TDS传感器+STM32F103C8T6+Keil5

 

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

免费源码:

 

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

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

【mcuclub】水质检测模块-TDS_哔哩哔哩_bilibili

【mcuclub】水质检测模块-TDS - 单片机俱乐部

一、接线

如果没有买温度传感器,可以不接温度传感器接口和温度T。但最好加上温度传感器,因为25℃为标准温度,温度每增加1℃,电导率上升2%。

2460508aed104387990c582679e8762f.png

二、原理与公式

1、原理(仅供了解)

     TDS(Total Dissolved Solids),中文解释为溶解性总固体,测量单位为毫克/升(1mg/L=1ppm),它表明1升水中溶有多少毫克溶解性总固体,或者说1升水中的离子总量。通俗的说,TDS值代表了水中溶解物杂质含量,TDS值越大,水中溶解物杂质越多,说明水中的可导电物质的杂质含量大。

      TDS 测量主要通过给测试电极输入交变的驱动电压(防止探头极化),在被测液体中产生微小电流,从而得到被测液体的电导率。模块采用电极法测定水溶液的电导率,当两电极插入溶液中,可以测出两电极间的电阻,经过转接板转换,最终输出模拟电压值,根据电压值与TDS的线性关系式,最终得到TDS值。

2、公式

TDS 传感器模块标准曲线如下图所示。
 

e87182fa590b47babd9aa0ac1f04e674.png

25℃为标准温度,温度每增加1℃,电导率上升2%,故温度作为补偿因子参与TDS计算,公式为:
V修 = V * (1 + 0.02*(T-25))

上式中V修为修正后的电压值,V为测量的电压值,T为测得溶液温度值。

 

TDS计算公式:

TDS = (66.71*V修³ – 127.93*V修 ² + 428.7*V修 ) * K

K是修正系数,K = TDS标准值 / TDS测量值

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

①需要购买TDS笔,来测量水里的TDS标准值

将 TDS 探针和温度传感器放入 TDS 标 准溶液或已知 TDS 值的待测溶液中,测试传感器模块 AO 口输出电压值,记录 为 V 测试。测量当前测试溶液的温度值为 T 。

V修正 = V测试 * (1 + 0.02*(T-25))

TDS测试 = (66.71*V修正³ – 127.93*V修正 ² + 428.7*V修正 )

K = TDS标准值 / TDS测试

 

三、实操+代码

我这里没有使用ds18b20温度传感器,所以温度值直接给了25摄氏度。如果使用温度传感器的话,直接初始化,给温度赋值即可。

1、代码

/********************(C) COPRIGHT 2019 Crownto electronic **************************
 * 文件名  :main.c
**********************************************************************************/
#include "stm32f10x.h"
#include <string.h>
#include "delay.h"
#include "bsp_SysTick.h"
#include "math.h"
#include "bsp_adc.h"
#include "ds18b20.h"
#include "bsp_usart1.h"


volatile uint32_t time = 0; // ms 计时变量 

定义变量
unsigned char AD_CHANNEL=0;


float TDS=0.0,TDS_voltage;
float TDS_value=0.0,voltage_value;

float kValue=0.976;
float TEMP_Value=250;


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

// 用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal; 


/**************温度采集函数***************/
void TEMP_Value_Conversion()
{
	  TEMP_Value=DS18B20_Get_Temp();
}


/**************TDS值采集函数***************/
void TDS_Value_Conversion()
{
	ADC_ConvertedValueLocal=((float)ADC_ConvertedValue/4096*3.3)*(1.0+0.02*(TEMP_Value/10-25.0)); //AD转换
	
	TDS_value=(66.71*ADC_ConvertedValueLocal*ADC_ConvertedValueLocal*ADC_ConvertedValueLocal - 
	127.93*ADC_ConvertedValueLocal*ADC_ConvertedValueLocal + 428.7*ADC_ConvertedValueLocal)*kValue;
	
	  if((TDS_value<=0)){TDS_value=0;}
		if((TDS_value>1400)){TDS_value=1400;}	
			printf("TDS:%f\n",TDS_value);
	


}


/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{	 
    /* 配置USART1 */
    USART1_Config();
		ADCx_Init();		// ADC 初始化
		//DS18B20_Init();//DS18B20初始化 		

  while(1)
	{	
			//TEMP_Value_Conversion();//温度数据转换
			TDS_Value_Conversion();//TDS
			delay_ms(1000);
	}	
}


/*********************************************END OF FILE**********************/

2、校准,求k值

将代码公式里的kValue去掉,执行代码,求出测试的TDS值

e47c447e3470497288706413bf46e8be.png

串口显示测试的TDS值大概为170

af31c9cf465b4b3a95837a10f0dfe1d5.png

使用市场买的TDS笔测试,显示TDS标准值为166

af05ea17068745789409e62c3b1d990e.jpeg

所以kValue=TDS标准值 / TDS测试=166/170=0.976

修改代码中的kValue值为0.976,最后烧录代码。测试的数据和TDS笔差不多

6dc7604ad8054bfab70b316d54a5b67b.png

 

四、注意事项

1、25℃为标准温度,温度每增加1℃,电导率上升2%。

2、TDS 探头不能用于 55℃以上的水中。

3、TDS 探头放置位置不能太靠近容器边缘,否则会影响示数。

4、TDS 探头头部与导线为防水,可浸入水中,但连线接口处与信号转接板不防水,请注意使用。

 

 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值