作为一名小白,上网找资料不齐全,现在摸索明白了,故写下此文章,供大家参考
免费源码:
该篇文章是看了b站博主领悟后写下来的,看不懂我的文章可以看下面链接的视频
特此鸣谢:b站的up主 单片机俱乐部
【mcuclub】水质检测模块-TDS_哔哩哔哩_bilibili
一、接线
如果没有买温度传感器,可以不接温度传感器接口和温度T。但最好加上温度传感器,因为25℃为标准温度,温度每增加1℃,电导率上升2%。
二、原理与公式
1、原理(仅供了解)
TDS(Total Dissolved Solids),中文解释为溶解性总固体,测量单位为毫克/升(1mg/L=1ppm),它表明1升水中溶有多少毫克溶解性总固体,或者说1升水中的离子总量。通俗的说,TDS值代表了水中溶解物杂质含量,TDS值越大,水中溶解物杂质越多,说明水中的可导电物质的杂质含量大。
TDS 测量主要通过给测试电极输入交变的驱动电压(防止探头极化),在被测液体中产生微小电流,从而得到被测液体的电导率。模块采用电极法测定水溶液的电导率,当两电极插入溶液中,可以测出两电极间的电阻,经过转接板转换,最终输出模拟电压值,根据电压值与TDS的线性关系式,最终得到TDS值。
2、公式
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值
串口显示测试的TDS值大概为170
使用市场买的TDS笔测试,显示TDS标准值为166
所以kValue=TDS标准值 / TDS测试=166/170=0.976
修改代码中的kValue值为0.976,最后烧录代码。测试的数据和TDS笔差不多
四、注意事项
1、25℃为标准温度,温度每增加1℃,电导率上升2%。
2、TDS 探头不能用于 55℃以上的水中。
3、TDS 探头放置位置不能太靠近容器边缘,否则会影响示数。
4、TDS 探头头部与导线为防水,可浸入水中,但连线接口处与信号转接板不防水,请注意使用。