1.模块简介:
本模块可将PH传感器电极信号经运放放大输出,模块载有8位单片机处理器,通过此单片机的10位ADC对放大后的传感器信号采样,板载电位器调节输出信号的量程,并通过最小二乘法软件算法计算出信号与PH值得线性函数关系式,进而采用线性函数关系式求出信号对应的PH值。另板载TTL串口接口,用户可通过串口设置校准及获取当前PH值,测量分辨率为0.1,串口功能用户可根据是否需要选择购买相应套餐。
2.技术指标:
产品型号 | KM-PH |
检测对象 | PH传感器测量溶液PH值 |
通信方式 | UART(TTL)可选是否需要 |
工作电压 | 5V (DC) |
默认信号输出量程 | 0-5V(电位器可调量程) |
支持PH电极接口输入 | BNC接口 |
输出接口 | PH电极放大信号、2.5V参考电压 |
外形尺寸 | 40*30(mm) |
串口通讯参数 | 波特率9600,停止位1,无校验 |
串口输出PH分辨率 | 0.1 |
模块主控MCU | ST8G(10位AD分辨率)可选是否需要 |
3.使用说明:
用户可通过两种方式来获取PH值,第一种为串口读取法,采用本模块的串口接口直接获取输出的PH值,第二种为AD采集计算法,用户采用外部mcu或其他处理器的ADC来采集模块输出的模拟量信号,通过自行编程计算出PH值。注意用户采用串口读取方法时需要在购买时选择带有串口输出功能的模块。
模块可接入BNC接口的PH复合电极传感器,出厂默认PH电极放大信号输出范围0-5V。另外用户可根据自身需要调节电位器来调节PH电极放大信号的输出范围。
4.测量原理:
pH传感器电极输出的信号为信号电极和参比电极的相对电压,本设计传感器参比电极为中性溶液,即当被测溶液pH值为7时,其输出电压理论为0,而其余情况则根据溶液酸碱性不同,输出电压正负变化。根据运算放大器的工作原理,有负电压的输入与单电源供电矛盾。但因输出信号是相对于参比电极的电压差值,那么给参比电极(pH电极负输入)赋予一个合适的电压值,则可以保证信号电极(pH电极正输入)电压恒为正值, 单电源供电运放即可满足要求。电极输出电压并不符合单片机A/D转换输入要求,经过运放基本的放大功能可使其达到模数转换所需电压范围,即可送入单片机进行数据处理。
本设计中RW1电位器用于量程调节,常见的量程分为:
①量程0-3.3V,将电极放入7.0标准溶液中,调节电位器,使得运放1端输出电压为1.65V(根据溶液PH越大运放1端输出电压越小的关系,(14-7)/14*3.3V=1.65V),则电路采集的PH最小值对应的输出电压为3.3V.
②量程0-5V,将电极放入7.0标准溶液中,调节电位器,使得运放1端输出电压为2.5V(根据溶液PH越大运放1端输出电压越小的关系,(14-7)/14*5V=2.5V),则电路采集的PH最小值对应的输出电压为5V.
由于本模块板载的51单片机AD采集分为是0-5V,故本模块默认设置的量程为0-5V,即PH_Vol的默认输出量程为0-5V。
校准原理:依次将电极放入三种标准溶液中,记录对应输出电压值,并采用excel绘制PH值与电压的标准曲线,例如:
Y=-5.9647x+22.255即为得到的标准曲线表达式,其中Y为溶液PH,x为对应输出电压。这种曲线拟合方式称为最小二乘法,根据三组数据即可求出关系表达式,本模块板载的51单片机中利用C程序实现最小二乘法求出标准曲线表达式,从而即可计算PH值,用户第一次使用模块前,只需对模块进行串口发送相应的校准指令后,方可通过读取指令,获取模块返回的PH值。
如用户购买为非串口输出功能模块,则需自行采用以上绘制excel表格或采用软件算法计算得到标准曲线表达式,然后通过外接mcu的AD读取模块输出的模拟量来转换计算PH值。
关于采用软件实现最小二乘法可参考博客:最小二乘法求拟合曲线函数的C语言实际应用_>行者<的博客-CSDN博客_c语言 拟合函数
5.串口协议:(仅对支持串口输出功能的模块适用)
串口通讯为应答式查询方式。
初次使用模块或更换PH电极传感器后,需对模块进行PH校准,即对与模块连接的PH复合电极进行校准,校准一共分为三个步骤,如下。
第一步:首先将PH电极放入PH值为4.0的溶液中,然后向模块串口发送校准PH值4.0指令,模块会立即返回默认状态为0的响应指令,等待模块mcu检测溶液对应电压稳定后会返回状态为1的校准完毕指令,此时可将PH电极从4.0的溶液中取出,并放入清水中冲洗后,搽拭掉电极探头处的多余水分。
1 | 0x80 | 校准PH值4.0指令 | |||||||
向模块发送 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 地址 | 命令 | -- | -- | -- | -- | -- | 校验值 | |
0xFF | 0x01 | 0x80 | 0 | 0 | 0 | 0 | 0 | 0x7F | |
EXP. | FF 01 80 00 00 00 00 00 7F | ||||||||
模块返回 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 命令 | -- | 状态 | -- | -- | -- | -- | 校验值 | |
0xFF | 0x80 | 0 | 0 | 0 | 0 | 0 | 0 | 0x80 | |
EXP. | FF 80 00 00 00 00 00 00 80 //指令响应回复 | ||||||||
EXP. | FF 80 00 01 00 00 00 00 7F //校准完毕回复 |
第二步:将PH电极放入PH值为7.0的溶液中,然后向模块串口发送校准PH值7.0指令,模块会立即返回默认状态为0的响应指令,等待模块mcu检测溶液对应电压稳定后会返回状态为1的校准完毕指令,此时可将PH电极从7.0的溶液中取出,并放入清水中冲洗后,搽拭掉电极探头处的多余水分。
1 | 0x81 | 校准PH值7.0指令 | |||||||
向模块发送 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 地址 | 命令 | -- | -- | -- | -- | -- | 校验值 | |
0xFF | 0x01 | 0x81 | 0 | 0 | 0 | 0 | 0 | 0x7E | |
EXP. | FF 01 81 00 00 00 00 00 7E | ||||||||
模块返回 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 命令 | -- | 状态 | -- | -- | -- | -- | 校验值 | |
0xFF | 0x81 | 0 | 0 | 0 | 0 | 0 | 0 | 0x7F | |
EXP. | FF 81 00 00 00 00 00 00 7F //指令响应回复 | ||||||||
EXP. | FF 81 00 01 00 00 00 00 7E //校准完毕回复 |
第三步:将PH电极放入PH值为10.0的溶液中,然后向模块串口发送校准PH值10.0指令,模块会立即返回默认状态为0的响应指令,等待模块mcu检测溶液对应电压稳定后会返回状态为1的校准完毕指令,此时可将PH电极从10.0的溶液中取出,并放入清水中冲洗后,搽拭掉电极探头处的多余水分后即可开始正常测量读取PH值,此时板载mcu已经根据三点校准数据采用最小二乘法计算出标准曲线函数式,并将函数关系保存至单片机内部Flash中,掉电不丢失,重新上电使用则不必执行校准步骤。
1 | 0x82 | 校准PH值10.0指令 | |||||||
向模块发送 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 地址 | 命令 | -- | -- | -- | -- | -- | 校验值 | |
0xFF | 0x01 | 0x82 | 0 | 0 | 0 | 0 | 0 | 0x7D | |
EXP. | FF 01 82 00 00 00 00 00 7D | ||||||||
模块返回 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 命令 | -- | -- | -- | -- | -- | -- | 校验值 | |
0xFF | 0x82 | 0 | 0 | 0 | 0 | 0 | 0 | 0x7E | |
EXP. | FF 82 00 00 00 00 00 00 7E //指令响应回复 | ||||||||
EXP. | FF 82 00 01 00 00 00 00 7D //校准完毕回复 |
串口读取PH值指令
1 | 0x86 | 读模块PH返回值 | |||||||
向模块发送 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 地址 | 命令 | -- | -- | -- | -- | -- | 校验值 | |
0xFF | 0x01 | 0x86 | 0 | 0 | 0 | 0 | 0 | 0x79 | |
EXP. | FF 01 86 00 00 00 00 00 79 | ||||||||
模块返回 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
起始位 | 命令 | -- | PH值 | -- | -- | -- | -- | 校验值 | |
0xFF | 0x86 | 0 | 1字节 | 0 | 0 | 0 | 0 | -- | |
EXP. | FF 86 00 44 00 00 00 00 36 |
PH:0x44对应十进制为68,则PH值为6.8 (注:返回的PH值扩大了10倍,需要缩小10倍后保留一位小数)
校验值算法:
起始位后 86 00 44 00 00 00 00 到校验值前相加求和取低八位,再取反加一。
uint8_t getCheck(uint8_t *data,uint8_t iLength)
{
uint8_t sum=0; uint8_t iFor=0;
for(iFor=0;iFor<iLength;iFor++)
{
sum+=data[iFor];
}
return (0xff-sum+1);
}
6.模块展示及接线图:
7.模块尺寸:
8.模块完整电路原理图:
模块链接: https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debyZ88SJ&ft=t&id=677880984132