打印
[KungFu8位 MCU]

【连载】ChipON 水位监测开发指南

[复制链接]
2081|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jermy_z|  楼主 | 2017-11-26 10:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1 触摸芯片选型
目前 ChipON 推荐的水位监测芯片使用 KF8S1025。该款触摸芯片具有 4kFlase 存贮,256 的 BEE 存贮,具有以下优点:
电容触摸通道多,最多可达 8 个,其中 1 个作用参考通道;
灵敏度高;
抗干扰能力强,具有防电磁等功能;
电容触摸通道可调范围大,用户可根据需要更改外挂电容、分频比和参考电压;
资源丰富,还可实现控制,比如开关信号,温度采样, PWM 控制实现等。


沙发
jermy_z|  楼主 | 2017-11-26 10:26 | 只看该作者
2 条件说明
ChipON 触摸芯片需添加外挂电容,使用 P12 脚,外挂电容的大小影响对采样值有一定影响,可选择 2.2nf 到 44nf 的电容,一般可使用标称 472/103 的电容,具体参数根据产品的实际情况进行更改,可以借助 TS TOOL 软件采集采样值和变化率数据,建议系统采样值调整在 1000-8000 的范围内。细节触摸设计请参考另一文档《Chipon 电容触摸设计指南》。水位监测不同于普通按键的识别,普通按键一般存在最初按键按下时间,但不同产品的水位监测, 可能水到来后会保持很长一段时间, 处于这个时刻的通道自身缺少更随环境能力。因此通用的触摸按键识别算法设计并不是适合水位监测,即使水快速消耗,也不行,因为无水的停留时间不确定,一点水和完全无水的区分界限不明确。另外还存在带水开机的情况,普通的算法更无法适用。我公司的算法实现可完全解决这种问题。

使用特权

评论回复
板凳
jermy_z|  楼主 | 2017-11-26 10:28 | 只看该作者
3 产品开发设计约束(一)
1、触摸通道的走线应该设计的尽可能细,如 0.254mm。
2、触摸走线最好同其他线隔离,尤其信号线,应避免平行走势。
3、触摸芯片的工作电源应避免频繁波动,瞬态波动算法实现保护。
4、为了更好的实现抗干扰能力,芯片电源供应端应设低通滤波器,至少 1级。
5、参考通道应避免通过板子和水形成分布电容。一般措施为弹簧接触面隔离、芯片焊接的对面参考通道附近实现敷地,进而隔离水带入分布电容。也可以将检测板设计到水位以上或以下不接触的结构位置。
6、针对水箱存在一定高度的情况下,可以采用端口输出接口,触盘单独版通过引线接入触摸芯片。
7、要求触摸通道上的 1k 电阻靠近芯片引脚。
8、产品的通道参数只有整定后才最适合自身产品。
9、下载完程序的首次上电是参考数据的存入阶段,因此要求下载完程序后,检测板要同产品一起按照设计完成组装,在没有水的情况下上电,上电环境要求无干扰。
10、基于第 9 点可以采用芯片空闲引脚(编程脚除外,方便程序维护,参数整定)。接外部按键或做协议支持在线存入校准参数。

使用特权

评论回复
地板
jermy_z|  楼主 | 2017-11-26 10:29 | 只看该作者
3 产品开发设计约束(二)
11、检测板芯片端滤波电容应仅可能靠近单片机。
12、板子预留或焊接下载端口或下载端点,便于调试维护和在线升级功能。
13、P12 脚的外接电容建议采用容值偏差小,温度波动范围小的电容。电容值容值范围可选择 1nF~10nF 之间,要求使用 10%或以上精度的涤纶电容、X7R 材质电容或 NPO 材质贴片电容。
14、整定阀值参数使还要还要考虑如上图所示水膜在水箱壁上附着的情况,一般应该将水箱壁打湿,水膜符合左侧的凹陷平面。
15、如果使用弹簧,建议采用接触面大的弹簧按键,如果使用 PCB 上焊盘直接紧贴水箱壁要求最好用粘着性材料使可靠接触,检测通道接触间不能能有空气间隙,否则直接验证影响水带来的变化率,造成无法识别,除非变化率还很大。即仅允许很小的空气间隙,产品一致性考虑建议避免空隙。针对结构限制的只能增加触盘的接触面积,来提供变化率,对存在间隙的,应该考虑间隙下的参数整定。一般触盘大小因水位测试一般设计较窄,建议高度不小于 3mm,长度根据产品实际尽量加宽。建议接触面积不小于 90mm2,实际衡量看水能带来的变量率,越大越好,建议不低于 40。
16、要检测的液体应该单一,主要原因在于电容触摸考虑的是电介常数,相对电容量。液体不确定下容值变化波动不一定适合整定过的参数,无法保证产品的可靠运行。
17、产品出厂应该完成常规和老化实验,针对老化过程中出现的偏差需要重新存入校准值并重新老化观察。

使用特权

评论回复
5
jermy_z|  楼主 | 2017-11-26 10:30 | 只看该作者
4 软件库使用说明(一)
开发触摸按键系统需要通过以下 6 个步骤完成软件平台的搭建(或者直接使用 ChipON提供的范例程序进行修改):
① 创建触摸库头文件
需要在 main.h 中声明相应芯片的头文件和触摸库的头文件,触摸库头文件如下:头文件 kf8spsw_lib_touch.h
② 定义触摸库变量
在项目中创建触摸库参数源文件,文件中的参数值需要用户根据产品的特性进行修改,具体见 3.3 节。文件如下:
源文件 kf8spsw_lib_touch.c

使用特权

评论回复
6
jermy_z|  楼主 | 2017-11-26 10:31 | 只看该作者
4 软件库使用说明(二)
③ 配置芯片寄存器
在 main.c 中需要对 MCU 进行初始化,初始化 IO 口和芯片功能。
④ 配置 CMCTL1 寄存器
可在 main.c 的初始化部分进行配置,根据芯片手册此寄存器用于设置电容触摸时钟分频比和电容触摸基准电压,时钟分频比越大,通道采样值越大,基准电压越大,通道采样值越大。根据不同产品,用户需对此做不同配置,具体参数含义可阅读相应芯片手册,具体见3.5 节,一般参数设定为 0x50 即可。

使用特权

评论回复
7
jermy_z|  楼主 | 2017-11-26 10:32 | 只看该作者
4 软件库使用说明(三)
⑤ 调用触摸模块初始化函数
调用触摸初始化函数对触摸参数进行初始化, 用户只需在主函数中直接调用下面的函数即可,无需修改其内容参数。
水位库触摸初始化函数: _KF8spsw_LIBf_init_touch_ ()
除此之外,你可以选择函数_KF8spsw_lib_SET_MCU_Parameter(A)完成计时器的选择,默认不需要调用,但如果产品需要实现
PWM 控制时必须切换计时器。
⑥ 调用触摸库函数
在 mian.c 中调用触摸库处理函数。此函数用于实现触摸按键识别功能。
水位库函数名称为_KF8spsw_LIBf_touch_process_ ()
以及触摸中断进行函数调用完成数据处理和按键识别即可。针对该类应用一般用软件查询即可。但该芯片的中断入口根据版本存在 2 种情况,即中断标志 T1IF(E00)或 CTIF,需要更加芯片版本确定触摸中断的代码处理, demo 中已提供对应的实现代码。

使用特权

评论回复
8
jermy_z|  楼主 | 2017-11-26 10:35 | 只看该作者
4.2 创建触摸库头文件说明
水位通用库 kf8spsw_lib_touch.h 文件如下
/*******************************************************************
* 文件名: kf8sptsw_lib_touch.h
* 版 本: V2.0
* 日 期: 2015-6-28
* 作 者: 上海芯旺微电子技术有限公司
* 说明: 电容触摸库函数头文件
********************************************************************/
#ifndef KF8_LIB_TOUCH_H_
#define KF8_LIB_TOUCH_H_
#include "main.h"
#define MX_CH 4 //开启的触摸通道数量
/*******************************************************************/
//声明给触摸库使用
/*******************************************************************/
extern unsigned char const CHS_AMOUNT; //最大通道数量
extern unsigned int const TCS_AMOUNT;//识别延时滤波计数
//量化参考通道变化率多于x属于异常波动
extern signed int const
_KF8_Inside_Reference_Channel_Disturb_Threshold_Set_; //仅用于参考通道
extern unsigned int _KF8_Disturb_Protect_Circle_; // 抖动结束
延迟计数
extern unsigned int const _KF8_Disturb_Protect_Circle_Define;// 抖动
保护延时上限设定
extern unsigned int _KF8_Up_BaseLine_Circle_; // 参考稳定补偿基
准线计数
extern unsigned int const _KF8_Up_BaseLine_Circle_Define;// 基准线非
异常抖动n循环后更新基准线
extern volatile unsigned int _KF8_LIBi_channel_flag_;// 通道识别结果
extern unsigned char const _KF8_Inside_Reference_Channel_Order; // 基
准通道对应的数组下标
extern signed int const _KF8_Config_Finger_Threshold[MX_CH];//水位阀
extern signed int const CONFIG_NO_FINGER_THRESHOLD[MX_CH];//无水阀
extern unsigned char const _KF8_TOUCH_CH_EN[MX_CH]; //逻辑化顺序通道
extern signed int _KF8_LIBi_Date_Change_[MX_CH];//通道变化量
extern volatile unsigned char _KF8_LIBc_channel_; //当前处理通道数组下标
extern unsigned int _KF8_LIBi_buff_hit_[MX_CH]; //保存采样值
extern unsigned int _KF8_LIBi_buff_baseline_[MX_CH];//保存基准线
extern unsigned int _KF8_LIBi_buff_refline_[MX_CH]; //出厂参考值
extern unsigned int _KF8_LIBc_touch_count_[MX_CH]; //按键滤波计数
extern volatile unsigned char Arr_erom_SW_[24]; //BEE 缓存,在线校准用
/*******************************************************************/
//声明给触摸库使用结束
/*******************************************************************/
void _KF8spsw_LIBf_init_touch_();//初始化电容触摸
void _KF8spsw_LIBf_touch_process_();//电容触摸通道处理
// 参数更换 0:选用 T1H T1L PWM不可用 ; 1:选用T1U, T3L但仅适合E03版本芯片 ;
2:选用T1U, T3L,满足E05及以后版本芯片。
void _KF8spsw_Lib_SET_MCU_Parameter(unsigned char parameterin);
void read_data_eep_tsw_();// 读通道出厂参考值到 Arr_erom_SW_
void write_eep_tsw_(); // 将Arr_erom_SW_作为出厂参考值写入,在线重校。
#endif /* KF8_LIB_TOUCH_H_ */

使用特权

评论回复
9
jermy_z|  楼主 | 2017-11-26 10:36 | 只看该作者
4.3 定义触摸库变量
定义如下变量,变量含义及参数设定原则详见第五节说明。
水位库 kf8spsw_lib_touch.c, 文件的参数需与头文件一致,如下所示:
///*****************************************************************
// * 文件名: kf8spsw_lib_touch.c
// * 版 本: V2.0
// * 日 期: 2015-6-28
// * 作 者: 上海芯旺微电子技术有限公司
// * 说明: 电容触摸库函数文件
********************************************************************/
#include "kf8spsw_lib_touch.h" //引入触摸库函数头文件
/*******************************************************************/
//触摸库使用
/*******************************************************************/
unsigned char const CHS_AMOUNT = MX_CH; //传递系统最大通道数量,固定
//满足阀值的次数滤波识别一个状态的转换,速度与模型相关和需求相关。
unsigned int const TCS_AMOUNT = 200;
//量化参考通道变化率多于x属于异常波动
signed int const
_KF8_Inside_Reference_Channel_Disturb_Threshold_Set_=15; //参考通
道抖动识 阀
unsigned int _KF8_Disturb_Protect_Circle_; // 抖动保护计时
unsigned int const _KF8_Disturb_Protect_Circle_Define=20; // 抖动保护
时长设定
unsigned int _KF8_Up_BaseLine_Circle_;// 参考更新计时
unsigned int const _KF8_Up_BaseLine_Circle_Define=200; // 参考更新时长
//使用的通道数据及通道号,这里需和芯片对应,如CT3写3
unsigned char const _KF8_TOUCH_CH_EN[MX_CH]={
10,
9,
8,
11,
2,
4,
5, // 需满足设定的通道个数,多余的会优化掉
};
// 算法中比引入参考通道数组位置
unsigned char const _KF8_Inside_Reference_Channel_Order=3;//即CT11参考
// 有水阀值 阀值设定 有水大于无水阀值,中间为识别死区
signed int const _KF8_Config_Finger_Threshold[MX_CH]={
38,
30,
20,
1000,// 参考通道不参与判断
// . . . 须满足设定的通道个数
};
// 无水阀值
signed int const CONFIG_NO_FINGER_THRESHOLD[MX_CH]={
20,
20,
17,
800, 参考通道不参与判断
// . . . 须满足设定的通道个数
};
volatile unsigned char _KF8_LIBc_channel_; //当前处理通道位置
volatile unsigned int _KF8_LIBi_channel_flag_; //对外提供按键信息
/*以下为触摸算法所用到的通用变量数据,数组的元素个数必须与所开通的通道数一致****/
unsigned int _KF8_LIBi_buff_hit_[MX_CH]; //记录当前通道的采样值
unsigned int _KF8_LIBi_buff_baseline_[MX_CH]; //当前通道的基准值
unsigned int _KF8_LIBi_buff_refline_[MX_CH]; //当前设备的出厂参考值
unsigned int _KF8_LIBc_touch_count_[MX_CH]; //按键识别次数滤波
signed int _KF8_LIBi_Date_Change_[MX_CH]; //通道变化量
/*******************************************************************/
//触摸库使用资源结束
/*******************************************************************/

使用特权

评论回复
10
jermy_z|  楼主 | 2017-11-26 10:37 | 只看该作者
4.4 配置芯片寄存器说明
1、 参考晶振初始化,如 OSCCTL = 0x60; 根据芯片手册可知为 8M 晶振,晶振频率不能太
低,否则会影响触摸反应速度。
2、 端口初始化
◎ 将电容触摸通道对应的 I/O 口设置为输入,即给 TRx 方向寄存器的对应位置 1。
◎ 芯片内部参考通道必须设置为输入态,这里使用外部通道作为参考,必须设置为输
入态。
◎ 外接电容端口需设置成模拟口, P1.2 口为外接电容引脚,需 ANSEL |= 1<<6;
◎ 触摸用到的寄存器以及 bit 位有 T1H(T1U)(定时计数器高八位)、 T1L(T3L)(定时计数器低八位,)、 T1ON(T1 启动控制位)、 T1IE(CTIE)(触摸中断使能位)、 T1IF(CTIF)(触摸中断标志位)、 PUIE(在初始化触摸内部参数函数会打开,不需要额外设置)、AIE(全局中断使能位,调用初始化触摸内部参数函数时也会打开总中断,无需额外开启)。

使用特权

评论回复
11
jermy_z|  楼主 | 2017-11-26 10:38 | 只看该作者
芯片程序范例如下:
void init_mcu()
{
OSCCTL = 0x70; //MAX16M 0x70 0x60 0x50 。。。
//端口初始化
TR0 = 0x08;// P03 只能输入
TR1 = 0x04;// P12 外部电容
TR2 = 0x00;//
TR3 = 0x0F;// P30 P31 P32 P33 前3个按键通道以及参考通道
P0 = 0x00; P1 = 0x00;
P2 = 0x00; P3 = 0x00;
ANSEL = 0x40; //设置AN6为模拟口,外挂电容脚设置为模拟口
(ANSEL |= 1<<6; //设置AN6为模拟口,外挂电容脚设置为模拟口)
T1CTL = 0x00; //1: x分频 如果使用T1H, T1L时可以设置计数分频
}

使用特权

评论回复
12
jermy_z|  楼主 | 2017-11-26 10:40 | 只看该作者
4.5 配置 CMCTL1 说明
寄存器“CMCTL1”是 KF8S 系列设置触摸分频比和基准电压的寄存器,用户通过设置CMCTL1 的值调节对外挂电容充电的频率和电压阀值。分频比越大,则频率越低,通道采样值则越大。电压阈值越大,通道采样值也越大。
KF8S 系列芯片的 CMCTL1 寄存器引用数据手册说明如下:

如 CMCTL1 = 0x50; 则 设置触摸时钟为 2 分频,基准电压为 0.5VDD,这里分频源为系统时钟,如选择 16M 时,触摸时钟为 8M,一般频率需设定为 1M 或 2M 时最佳。

使用特权

评论回复
13
jermy_z|  楼主 | 2017-11-26 10:41 | 只看该作者
4.6 调用触摸初始化内部参数函数
触摸初始化函数主要是对触摸算法的内部参数以及部分寄存器进行初始化, 如配置触摸使能、 定时器工作设定等。 因开机时采样并计算参数数据。 在进行初始化前建议作适当延时,避免上电波动使基准线数据不准确而带来异常,参考 200ms。示例如下:

init_mcu();
delay_ms(200); //随后开始功能的运行

使用特权

评论回复
14
jermy_z|  楼主 | 2017-11-26 10:43 | 只看该作者
4.7 调用电容触摸通道处理函数
电容触摸按键处理函数能够对触摸按键进行手指按下与否的判断,可以在中断内、外中执行,返回值为_KF8_LIBi_channel_flag_。它的每个 bit 位对应相应的通道,对应关系见附录 1。当有通道被触摸时, _KF8_LIBi_channel_flag_的对应 bit 位被置 1,无触摸时对应 bit位置 0。电容触摸中断标志位 S 系列芯片为 T1IF,或 CTIF,具体和版本有关。每次进中断时判断,如果 T1IF/CTIF 为 1 时调用电容触摸通道处理函数,还可以在不影响中断内部处理时间的条件下,设置一个标志位,然后再在主程序中调用电容触摸通道处理函数。
void INT_FUN() __interrupt (0)
{
if(T1IF||CTIF)
{
T1IF=0; CTIF=0; // E00 板芯片使用T1IF,其他版本使用CTIF
_KF8spsw_LIBf_touch_process_ (); // 在中断中执行触摸函数
}
/*如果使用PWM, E00版本不可以,触摸中断标志为CTIF, T1IF为PWM使用*/
}

也可以在中断中做一个标志后退出,然后在 main.c 中如下处理
if(touch_process_flag) // 判断标志位
{
touch_process_flag = 0; // 清标志位
_KF8spsw_LIBf_touch_process_ (); // 在主函数中执行触摸函数
}

使用特权

评论回复
15
jermy_z|  楼主 | 2017-11-26 11:07 | 只看该作者
4.8 在线校准的支持等
        在线校准的方法可通过端口高低电平或协议指令下进行,进行方法为在稳定的环境中,无水的情况下,按照逻辑顺序将开启的通道的采样值_KF8_LIBi_buff_hit_送入到数组_KF8_LIBi_buff_baseline_和_KF8_LIBi_buff_refline_以及 Arr_erom_SW_中,然后调用写函数 write_eep_tsw_()执行写入。操作函数自动校验功能,校验失败会重试,直到成功为止。一般不需要使用读函数 read_data_eep_tsw_(),但程序加密下,代码增加命令和协议可以实现将参数读取并送出实现产品分析。
        如果时间要求不是特别,可以触摸处理函数前保留 TOUCH_DEBUG_TRS_DEAL()。该函数在 debug_touch.c 中实现,可随时在线观察产品的运行情况,采用该函数会拉长扫描一周的时间,但可以通过所需参数实现同一现实时间内的识别工作,一般来说不开启主机情况下消耗时间较少。

使用特权

评论回复
16
jermy_z|  楼主 | 2017-11-26 11:11 | 只看该作者
4.9 专用水位监测程序实现
    可以采用该型号芯片的固化程序进行产品的开发,仅需要调试参数写到对应的 hex 文件中进行批量编程即可,支持 BCD 和 I2C 方式输出,能够加快产品开发周期,减少开发工作量。也可以采用在线模式实现通信完成数据的交互,包括在线校准,手动设定参数,功能配置等。

使用特权

评论回复
17
jermy_z|  楼主 | 2017-11-26 11:12 | 只看该作者
5 触摸库参数及设置说明
    通过上一章节的前七个步骤,触摸按键产品的整体代码完成。但在当前产品上能否运行正确还需要对相应的参数进行调试。
名词解释:
1、 扫描周期时间:即程序对所有按键扫描并处理一遍所使用的时间。文档的关于时间的概念设定值均为周期数。如设置为100,可以想象如果每个按键占用1ms时间, 7个按键就是7ms, 100个周期则代表着700ms,具体每个通道通道的处理时间与电压选择、电容大小相关。
2、 通道变化率:通道变化率是有符号数,正数表示采样值在基准线下方,负数表示采样值在基准线上方。关于此参数的说明和计算方式详见参考附录二。

使用特权

评论回复
18
jermy_z|  楼主 | 2017-11-26 11:13 | 只看该作者
5.1 MX_CH/ CHS_AMOUNT
    MX_CH参数设定产品触摸通道数,在程序上采用宏定义的方法,可在kf8spsw_lib_touch.h中修改。 CHS_AMOUNT参数同样为使用的通道数据,该数值应用于通道循环扫描判断,赋值为MX_CH。

使用特权

评论回复
19
jermy_z|  楼主 | 2017-11-26 11:14 | 只看该作者
5.2 TCS_AMOUNT
        按键识别周期参数,即当通道变化率大于手指阀值时每一周期计数加一,当计数值与该参数相等时,在无保护发生的情况下,认为按键有效,电容触摸处理函数返回有效的按键键值,数值越大,判断一个结果用的时间约长。

使用特权

评论回复
20
jermy_z|  楼主 | 2017-11-26 11:15 | 只看该作者
5.3 _KF8_Disturb_Protect_Circle_ |
_KF8_Disturb_Protect_Circle_Define
        此参数实现异常状态的保护周期,可以设定异常状态的保护时长,在保护期间内,不识别按键判断。值设置为 200 时,即为 200 个扫描周期,该参数有效范围为 0-65535,根据实际情况设置保护周期的大小。时间与扫描周期关系:首先假定单个按键的执行时间为 1ms。根据按键(包括基准通道)的数量计数出一个扫描周期使用的时间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

100

帖子

0

粉丝