调制数据表 - 赛普拉斯

双 CapSense® Sigma-Delta 调制数据表
CSD2x V 2.20
001-66172 Rev. **
Dual CapSense Sigma-Delta
Copyright © 2009-2010 Cypress Semiconductor Corporation. All Rights Reserved.
PSoC® 模块
资源
CapSense
I2C/SPI
API 存储器 (字节)
定时器
比较器
闪存
RAM
引脚 (除传
感器之外)
CY8C21x45, CY8C22x45
单通道,带 IDAC*
1
-
-
1
1006
29
1
启用自动校准
1
-
-
1
1198
35
1
双通道,带 IDAC*
2
-
-
2
1390
30
2
启用自动校准
2
-
-
2
1576
36
2
单通道,带 Rb 电阻 *
1
-
-
1
1000
28
2
双通道,带 Rb 电阻 *
2
-
-
2
1400
30
4
每个附加 CapSense 按钮
-
-
-
-
8
12
1
使用带 5 个元件的电容式
滑条时的静态代码和 RAM
增加量
-
-
-
-
613
90
5
每个附加滑条元件
-
-
-
-
8
12
1
使用滑条复用设置时的静态 代码和 RAM 增加量 (5 个
传感器)
-
-
-
10
-
-
* 根据 1 个按钮的配置计算
特性与概述
„
„
„
„
„
„
„
„
„
„
„
能够扫描 1 到 37 个电容传感器
可感应高达 15 mm 厚的玻璃外覆层
使用有线传感器的接近检测范围可达 20 cm
对交流电源噪音、EMC 噪音和电源电压变动有较强的抗干扰能力
支持独立和滑条电容式传感器的不同组合
可使用复用法将滑条传感器的物理分辨率翻倍
可使用插值方法增加滑条传感器的分辨率
可通过两个滑条传感器提供触摸板支持
可通过高阻抗导电材料 (如 ITO 薄膜)提供感应支持
具有屏蔽电极支持,可在存在水膜或水斑的情况下可靠工作
使用 CSD2x 向导在指导下分配传感器和引脚
Cypress Semiconductor Corporation
Document Number: 001-66172 Rev. **
•
198 Champion Court
•
San Jose, CA 95134-1709
•
408-943-2600
Revised December 22, 2010
[+] Feedback
Dual CapSense Sigma-Delta
„ 集成了用于处理温度、湿度和静电释放 (ESD) 事件的基线更新算法
„ 具有可轻松调整的运行参数
„ 具有 PC GUI 应用程序支持,用于实时原始数据监控和参数优化
CSD2x 用户模块 (使用 Sigma-Delta 调制器的电容式感应)使用开关电容技术实现电容感应,其中使用
一个 Sigma-Delta 调制器将感应开关电容电流转换为数字代码。 CSD2x 用户模块可支持单通道 CapSense
扫描和双通道 CapSense 扫描。
Figure 1. CSD2X 典型应用电路
快速入门
1.
2.
3.
如果用到,请选择和布置需要专用引脚 (如 I2C 或 LCD)的用户模块。 根据需要分配端口和引脚。
选择和布置 CSD2x 用户模块。
在 “ 工作空间资源管理器 ”(Workspace Explorer) 中右键单击 CSD2x 用户模块以访问 CSD2x 向导
(该向导将在数据表的后面予以说明)。
4. 设置所需的传感器、滑条或旋转滑条的数目。
5. 为每个传感器设定传感器设置。
6. 设置引脚和全局参数。 阅读所有参数说明并遵循各项要求和指导原则。
7. 生成应用并切换到应用编辑器。
8. 根据需要改编样本代码以实现独立传感器、滑动传感器或触摸板。
9. 将 I2C-USB 桥连接到目标板,并观察信号。
10. 更改 CSD2x 参数以优化您的设置并重建应用。
11. 为 PSoC 设备编程并验证模块操作。调整 CSD2x 参数以满足 5:1 的 SNR 要求,如 “CapSense 应
用的信噪比要求 ”– 中所述。 AN2403.
如果遇到任何问题,请参见 “ 附录 ” 中的 “ 故障排除 ” 部分。
Document Number: 001-66172 Rev. **
Page 2 of 47
[+] Feedback
Dual CapSense Sigma-Delta
功能说明
电容传感器由物理、电气和软件组件组成:
„ 物理: 物理传感器本身通常是一个在连接到 PSoC 的 PCB 上制作的导电图形,其显示屏带有绝缘封
面、柔性薄膜或透明外覆层。
„ 电气: 一种将传感器电容转换为数字格式的方法。 转换系统由一个感应开关电容、一个 Sigma-Delta
调制器和一个基于计数器的数字滤波器组成,可将调制器输出位流转换为可读的数字格式。
„ 软件:
–
检测和补偿软件算法可将计数值转换为传感器检测决策。
–
对于连续的相关传感器 (如滑条和触摸板),所提供的 API 可通过插值算法以高于传感器物理
分辨率的更高分辨率进行定位。 例如,您可以创建一个包含 10 个传感器的音量滑条,并使用
给定的固件将音量级别数扩展为 100。 或者,使用相同的 API,您可以使用两个彼此交叠的电
容传感器并确定导体 (如手指)在它们之间的位置。
测量电容的方法有许多种,本用户模块中使用的方法是将开关电容与一个 Delta-Sigma 调制器组合在一
起。
传感器阵列可以包含独立传感器、滑动传感器和作为一对正交滑动传感器实现的触摸板的各种组合。 高层
决策逻辑可为环境因素 (如温度、湿度和电源电压变动等)提供补偿。 可以使用一个独立的屏蔽电极屏蔽
传感器阵列,以减少杂散电容,进而在有水膜或水斑存在的情况下提供更可靠的工作。
高层软件功能可实现滑条复用,这样单个电气传感器可用于两个物理位置以增强分辨率。 这些功能还可以
在物理传感器位置之间对所求解的传感器位置进行进一步插值。
在首次使用 CSD2x 用户模块之前,建议您先阅读以下文档:
CY8C22X45 和 CY8C21345 PSoC 可编程片上系统技术参考手册,章节: CapSense 系统
建议在了解 CSD2x 用户模块文档之后进一步阅读以下应用笔记。 这些应用笔记可在赛普拉斯半导体公司
的网站 (www.cypress.com) 上找到:
„
„
„
„
„
„
„
„
CapSense 最佳实践 – AN2394
CapSense 应用的信噪比要求 – AN2403
用于调试 CapSense 应用的绘图工具 – AN2397
PSoC CapSense 应用的 EMC 设计考虑事项 – AN2318
电容式感应应用中的能耗和睡眠考虑事项 – AN2360
PSoC CapSense 布局指南 – AN2292
通用异步发送器的软件实现 – AN2399
电容式感应的防水 – AN2398
电容测量操作
决策逻辑在固件中实现。 固件会分析电容的测量值,跟踪因环境因素引起的缓慢电容变化,并运行决策逻
辑以检测按钮触摸,同时计算滑条位置。
扫描传感器阵列
CY8C22x45 系列设备具有一个内置模拟总线。 它允许电容传感器连接到任何 PSoC 引脚。 CSD2x 用户模块
使用内部预充电开关在时钟信号相位 Ph1 为活动传感器充电,并在相位 Ph2 将模拟总线连接到传感器。
Sigma-Delta 调制器调制电容和比较器输入一直连接到模拟总线。
Document Number: 001-66172 Rev. **
Page 3 of 47
[+] Feedback
Dual CapSense Sigma-Delta
固件通过在 MUX_CRx 寄存器中设置相应位逐次执行传感器扫描。
Figure 2. 带预充电开关的模拟总线
Document Number: 001-66172 Rev. **
Page 4 of 47
[+] Feedback
Dual CapSense Sigma-Delta
滑条
滑条用于实现要求逐级调节的控制。 例如,照明控制 (调光器)、音量控制、图形均衡器和速度控制等。
这些传感器的机械位置相邻。 一个传感器的动作会导致物理上相邻的传感器的部分动作。 滑条中的实际位
置可通过计算所激活传感器组的中心确定。 滑条可在 CSD2x 向导中设置,即建立多个分组,每组滑条都
有一个特定的顺序。 实践中,传感器滑条的下限数量为五个,上限数量完全取决于所选 PSoC 设备上的可
用传感器位置数。
Figure 3. 确定物理传感器位置的顺序
下半部分滑条中强烈信号的接近会导致相同的电平混叠到上半部,但结果是离散的。 感应算法将搜索信号
的强烈邻近集合以确定所求解的滑条位置。
放射形滑条
Figure 4. 手指触摸放射形滑条
Document Number: 001-66172 Rev. **
Page 5 of 47
[+] Feedback
Dual CapSense Sigma-Delta
对于 CSD2X UM,有两种滑条类型:线形和放射形。 放射形滑条与线形滑条类似。 线形滑条有开始和结束,
放射形滑条则没有。 当发生触摸时,中心计算算法会考虑当前开关左、右侧开关的传感器计数。 放射形滑
条无法实现复用。
CSD2X UM 有两个支持放射形滑条的 API 函数。 第一个函数 CSD2X_wGetRadiaPos() 可返回中心位置,第
二个函数 CSD2X_wGetRadialInc() 可返回以分辨率单位表示的手指偏移。 当手指顺时针移动时,为正偏
移。
复用
滑条中的每个 PSoC 传感器连接将映射到滑条传感器阵列中的两个物理位置。 物理位置的前半 (数字上较
低的)部分顺序映射到基本分配的传感器,并采用由设计者使用 CSD2x 向导分配的端口引脚。 物理传感
器的第二 (或上半)部分自动通过向导中的一个算法进行映射并列在包含文件中。 所建立的顺序应确保某
一半的相邻传感器的动作不会导致另一半的相邻传感器的动作。 请小心确定此顺序并将其映射到印刷电路
板中。
有多种方法可以确定下半部分的物理传感器位置的顺序。 最简单的方法是为上半部分中的传感器建立索
引,然后所有奇数号传感器跟在偶数号传感器的后面。 其他方法还包括通过其他值建立索引。 此用户模块
选择的方法是按 3 倍建立索引。
Figure 5. 按 3 倍建立索引
您应当平衡滑条中的传感器电容。 根据传感器或 PCB 布局,某些传感器对可能采用了较长的路线。 当您
选择复用时,CSD2x 向导会自动生成复用传感器索引表。 下表揭示了不同滑条段计数的复用序列。
Document Number: 001-66172 Rev. **
Page 6 of 47
[+] Feedback
Dual CapSense Sigma-Delta
Table 1.
不同滑条段计数的复用序列
总滑条段计
数
段序列
10
0,1,2,3,4,0,3,1,4,2
12
0,1,2,3,4,5,0,3,1,4,2,5
14
0,1,2,3,4,5,6,0,3,6,1,4,2,5
16
0,1,2,3,4,5,6,7,0,3,6,1,4,7,2,5
18
0,1,2,3,4,5,6,7,8,0,3,6,1,4,7,2,5,8
20
0,1,2,3,4,5,6,7,8,9,0,3,6,9,1,4,7,2,5,8
22
0,1,2,3,4,5,6,7,8,9,10,0,3,6,9,1,4,7,10,2,5,8
24
0,1,2,3,4,5,6,7,8,9,10,11,0,3,6,9,1,4,7,10,2,5,8,11
26
0,1,2,3,4,5,6,7,8,9,10,11,12,0,3,6,9,12,1,4,7,10,2,5,8,11
28
0,1,2,3,4,5,6,7,8,9,10,11,12,13,0,3,6,9,12,1,4,7,10,13,2,5,8,11
30
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,3,6,9,12,1,4,7,10,13,2,5,8,11,14
32
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,3,6,9,12,15,1,4,7,10,13,2,5,8,11,14
34
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,3,6,9,12,15,1,4,7,10,13,16,2,5,8,11,14
36
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,0,3,6,9,12,15,1,4,7,10,13,16,2,5,8,11,14,17
38
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,0,3,6,9,12,15,18,1,4,7,10,13,16,2,5,8,11,14
,17
40
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0,3,6,9,12,15,18,1,4,7,10,13,16,19,2,5,8
,11,14,17
42
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,0,3,6,9,12,15,18,1,4,7,10,13,16,19,2,
5,8,11,14,17,20
44
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,0,3,6,9,12,15,18,21,1,4,7,10,13,16
,19,2,5,8,11,14,17,20
46
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,0,3,6,9,12,15,18,21,1,4,7,10,13
,16,19,22,2,5,8,11,14,17,20
48
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,3,6,9,12,15,18,21,1,4,7,10
,13,16,19,22,2,5,8,11,14,17,20,23
Document Number: 001-66172 Rev. **
Page 7 of 47
[+] Feedback
Dual CapSense Sigma-Delta
总滑条段计
数
段序列
50
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,0,3,6,9,12,15,18,21,24,1,
4,7,10,13,16,19,22,2,5,8,11,14,17,20,23
52
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,0,3,6,9,12,15,18,21,24
,1,4,7,10,13,16,19,22,25,2,5,8,11,14,17,20,23
54
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,0,3,6,9,12,15,18,21
,24,1,4,7,10,13,16,19,22,25,2,5,8,11,14,17,20,23,26
56
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,0,3,6,9,12,15,18
,21,24,27,1,4,7,10,13,16,19,22,25,2,5,8,11,14,17,20,23,26
内插和测量
在滑动传感器和触摸板应用中,通常需要将手指 (或其他电容性物体)的位置分辨率确定为高于单个传感
器的本身间距。 手指在滑动传感器或触摸板上的接触区域通常大于任何单一传感器的区域。
要使用质心计算内插位置,首先要扫描阵列,以验证给定的传感器位置是否有效。 要求一些数量的相邻传
感器信号要高于噪声阈值。 如果发现最强信号,将使用此信号和大于噪声阈值的连续信号来计算质心。 使
用两个到八个传感器 (通常使用八个)以下列形式计算质心:
Equation 1
计算出的值通常是分数。 要将质心报告为特定分辨率 (例如对于 12 个传感器,范围为 0 到 100),需要
将质心值乘以计算而得的标量。 一种更高效的方法是将内插和测量操作组合到单一计算中,按所需的标度
直接报告此结果。 这是在高级 API 中处理的。
滑条传感器计数和分辨率在 CSD2x 向导中进行设置。 测量值是通过向导计算的,以分数值存储。
质心分辨率的乘数包含在三个字节中,位定义如下:
分辨率乘数 MSB
位
乘数
7
215
6
5
4
3
2
1
0
214
213
212
211
210
29
28
64
32
18
16
8
4
2
1/4
1/8
1/16
1/32
1/64
1/128
1/256
分辨率乘数 ISB
乘数
128
分辨率乘数 LSB
乘数
1/2
使用以下等式确定分辨率:
分辨率 = ( 传感器数 – 1) x 乘数
质心以 24-bit 无符号整数的形式保留,其分辨率是传感器数和乘数的函数。
Document Number: 001-66172 Rev. **
Page 8 of 47
[+] Feedback
Dual CapSense Sigma-Delta
反馈组件选择指南
CSD2x 用户模块需要外部调制电容,还支持可选屏蔽电极。 本节介绍如何选择外部组件。
调制电容
用户模块需要外部调制电容 Cmod 和调制器反馈电阻 Rb。 该电容可以连接到 P0[7] 端口引脚和 Vss 地。
反馈电阻 Rb 可以连接到端口引脚 P0[5] 和电容引脚。 这些引脚可通过用户模块参数设置选择。 请不要
将为调制器组件连接选择的引脚用于任何其他目的。
调制电容的建议值为 4.7 nF 到 47 nF。 可以通过实验选择最合适的电容,以获取最大信噪比。 对于
PRS16 和 PRS8 配置,在大多数情况下,5.6 到 10 nF 值可以给出很好的结果。 如果选择了带有预分频器
的配置,则积分电容的建议值为 22 到 47 nF。 您可以在选择反馈电阻后,用一些电容值进行实验,以获
得最佳信噪比。 应当使用陶瓷电容。 温度电容系数并不重要。 电阻值取决于总传感器电容 Cs。 应通过以
下方法选择电阻值:
„ 监控不同传感器触摸的原始计数。
„ 选择一个电阻值,该值在选定扫描分辨率下提供的最大读数为全量程读数的 70%。 当电阻值提高时原
始计数会增加。
典型值为 500 ? 到 10 k ?,具体取决于传感器电容。 如果使用 CY3280-22x45 评估板,则最低值可以定为
2 k ?。
屏蔽电极
某些应用场合要求在即使有水膜或水滴的情况下也能进行可靠操作。 在白色家电、汽车应用场合、各种工
业应用场合和其他场合,都需要即使有水、冰和湿度变化也不会提供假触发的电容式传感器。 在这种情况
下,可以使用单独的屏蔽电极。 此电极位于传感电极之后或之外。 如果设备绝缘外覆层表面有水膜,则屏
蔽和传感电极之间的耦合会增加。 屏蔽电极可帮助降低寄生电容的影响,为您处理传感电容变化提供了更
动态的范围。
在某些场合,选择屏蔽电极信号以及屏蔽电极相对于传感电极的位置是非常有用的,增加这些电极之间的
耦合会导致触摸传感电极电容测量值向相反变化。 这可以简化高级软件 API 工作。 CSD2x 用户模块支持
屏蔽电极的单独输出。
Document Number: 001-66172 Rev. **
Page 9 of 47
[+] Feedback
Dual CapSense Sigma-Delta
Figure 6. 可能的屏蔽电极 PCB 布局
上图说明了按钮屏蔽电极的一种可能的布局配置。 屏蔽电极尤其适用于透明 ITO 触摸板设备,在这种设
备中,它既阻止了 LCD 驱动电极的噪声影响,同时又可以减少杂散电容。
在此示例中,按钮被屏蔽电极板覆盖。 替代做法是,屏蔽电极 (包括按钮下面的板)可以位于对面 PCB
层。 在这种情况下,建议使用开口方案,填充率大约为 30% 到 40%。 在此情况下,不需要附加接地层。
如果屏蔽电极与传感电极之间有水滴,Cpar 将增加,调制器电流可能会下降。 在实际测试中,API 可能会
增加调制器参考电压,以便水滴原始计数增加值应接近于零或稍微为负。 您可以通过选择适当的调制器参
考来实现此目的。
在此用户模块中,提供给屏蔽电极的信号与用于预充电时钟的信号相同。 屏蔽电极可以连接到它可以路由
到的任何 PSoC 引脚。 将驱动模式设置为 “ 很慢 ” 可以降低接地噪声和辐射。 在 PSoC 设备与屏蔽电极
之间,可以连接可选倾斜限制电阻。 对于行 LUT 函数,请选择 A。
比较器参考源
比较器参考源用于形成比较器参考电压。 参考电压值决定了灵敏度。
对于 IDAC 和 Rb 配置,用户模块使用不同的参考形成原则。
对于 Rb 配置,用户模块支持参考源的下列多种选择:
„ 带隙参考
„ 模拟调制器,由特殊 PWM 信号驱动
„ 外部电阻式电压分频器
下表汇总了 Rb 配置的参考选择选项:
Document Number: 001-66172 Rev. **
Page 10 of 47
[+] Feedback
Dual CapSense Sigma-Delta
类型
外部组件
UM 选择
使用场合
带隙参考
无
VBG
推荐用于大多数应用场合。 尝试从此选项
开始测试。
模拟调制器
无
ASExx
读数与电源电压成比例。 仅当电源稳压良
好时使用。
外部电阻式电压分频器
2
AnalogColumn
输入选择
读数与电源的相关性较低。 建议 R1 =
10k; R2 = 3.6k
对于 IDAC 配置,用户模块支持下列参考源:
„ 带隙参考
„ VDD 参考
„ 外部电阻式电压分频器
此表汇总了 IDAC 配置的参考选择选项:
类型
外部组件
UM 选择
使用场合
带隙参考
无
VBG
推荐用于大多数应用场合。 尝试从此选项
开始测试。
电源参考
无
VDD
读数与电源电压成比例。 仅当电源稳压良
好时使用。
您可以仅使用带隙参考或模拟调制器。 外部电阻式电压分频器适用于特殊场合。
时钟源
时钟源用于控制传感电容上的开关。 用户模块支持将两个选择选项用作预充电开关的时钟源:
„ 16-bit 伪随机序列发生器 (PRS)
„ 直接 IMO 分频器
可以通过相应的用户模块参数选择所需的配置。
PRS 源提供扩频操作,确保很好地抵抗外部噪声源的噪声。 另外,带有扩频时钟的设计能够达到较低的电
磁辐射级别。 如果您的应用程序目标是通过 EMC/EMI 测试或者必须在嘈杂环境下提供可靠操作,则建议
使用 PRS 时钟源。
下表比较了这两种时钟源:
时钟源
操作频率
抗 EMC 噪声能力
PRS
扩频,平均值为 FIMO/4/ 预分频器,峰 高。 敏感点是 PRS 序列重复周期的倍数和
PRS 基本频率 FIMO/ 预分频器。
值为 FIMO/2/ 预分频器
直接 IMO 预分频器
固定频率
FIMO/ 预分频器
Document Number: 001-66172 Rev. **
中等。 有更多敏感点。
Page 11 of 47
[+] Feedback
Dual CapSense Sigma-Delta
布置
当实例化用户模块时,会自动放置用户模块的块,其他放置仅可用于单一通道配置。 CSD2X 用户模块使用
CapSense 块和一个比较器块。
需要特定引脚资源 (包括 LCD 和 I2CHW)的用户模块必须在启动 CSD2X 向导之前放置,以建立 CSD2X 用
户模块的引脚连接。
当放置电容式传感器连接时,避免使用 P1[0] 和 P1[1]。 这些引脚用来对部件进行编程,可能产生影响传
感器灵敏度的额外路由电容和噪声。
向导
CSD2x 向导用于设置 CapSense 按钮、滑条和接近传感器的引脚输出。 您可以使用一个拖放界面选择所需
配置并分配按钮和段。
1.
要访问该向导,请在工作区浏览器中右键单击用户模块,然后选择 “CSD2X 向导 ”。
Document Number: 001-66172 Rev. **
Page 12 of 47
[+] Feedback
Dual CapSense Sigma-Delta
2.
向导打开,其中显示了传感器数和滑条传感器数的数字输入框。
向导引脚图例
白色 – 该引脚不能用作 CapSense 输入。
灰色 – 该引脚处于锁定状态。 这可能是由于两个原因。 第一种可能性是另一个用户模块
(如 LCD 或 I2C)已经声明使用了该引脚。 第二种可能性是该引脚从其默认名称改成了其他
名称。要将引脚恢复为默认名称,请在 “ 引脚 ”(Pinout) 视图中展开引脚,并从 “ 选择
”(Select) 菜单中选择 “ 默认 ”(Default)。 这时该引脚在向导中便可用于分配。
橙色 – 该引脚可用于分配。
绿色 – 该引脚已经分配为一个 CapSense 输入。
3.
向导右侧区域包含三个区域,其中添加了开关、滑条和旋转滑条的表示。 在相应的框中键入所需的开
关、滑条和旋转滑条数量,然后按 [Enter]。 显示内容随您选择的配置表示而更新。
Document Number: 001-66172 Rev. **
Page 13 of 47
[+] Feedback
Dual CapSense Sigma-Delta
4.
切换到 “ 传感器设置 ” 选项卡可设置滑条的参数。 滑条和旋转滑条的设置 (包括滑条或旋转滑条中
的传感器数)是共同设置的。 X-Y 触摸板需要两个滑条,但是选择了一个。 滑条传感器中的最低可行
传感器数为 5,最大值由引脚数限定。
5.
滑条分辨率即是滑条具有的位置数。 在滑条的多个段上给出读数的触摸值会内插到此分辨率中。 如果
将分辨率设置为 100,则手指在滑条上的位置报告为处于 0 与 99 之间的某个位置。 最小值为 5。 最
大值为 ( 用于传感器的引脚数 – 1) x 216 – 1 或 (2 x 用于传感器的引脚数 – 1) x 216 -1
(对于复用滑条)。
6. 如果需要,请选择 “ 复用 ”(Diplex)。 这会将选择用于传感器的引脚数映射到板上两倍数量的传感
器位置, 仅显示了双工传感器的前半部分;后半部分按前面 “ 双工 ” 章节所述自动映射。 有关引脚
连接的双工表,请参阅 “ 双工 ” 一节。
7. 要将开关映射到引脚,请左键单击开关,将其拖动到任意可用引脚。 可以使用 “ 芯片引脚分配 ” 视
图或 “ 表引脚分配 ” 视图来进行此操作。 选择端口引脚后,引脚变为灰色,不再可用。 可以通过将
传感器拖离端口以更改传感器的分配。
8.
9.
为其余独立传感器重复分配操作。
滑条段到端口引脚的映射与单个传感器相同。
Document Number: 001-66172 Rev. **
Page 14 of 47
[+] Feedback
Dual CapSense Sigma-Delta
10.
单击 “ 确定 ”(OK) 以接受数据并返回到 PSoC Designer。
至此就完成了传感器的布置。 设置用户模块参数,生成应用程序。 如果愿意,现在您可以改编一个样本项
目。
如果要更改引脚分配,请将光标放在已分配的引脚上,单击引脚,然后将其拖放到引脚分配框外。 该引脚
将取消分配,您可以重新分配它。
向导滑条设置
双工
仅适用于滑条。 允许您使用一个引脚监控两个电子传感器以提高分辨率。 有关更多信息,请参阅双
工章节。
分辨率
对于滑条和旋转滑条,该值设置 CSD2x_wGetCentroidPos API 所返回值的范围。 如果有任何滑条传
感器处于活动状态,则该函数返回从零到 CSD 向导中设置的分辨率值之间的值。 CapSense 算法根据
相邻传感器的读数,将质心位置内插到此分辨率。
传感器计数
该值设置每个滑条或旋转滑条中的传感器数。
向导生成的表
完成向导后,单击 “ 生成应用程序 ”(Generate Application)。 根据传感器计数、引脚分配和双工的输
入,将生成一组表。 这些表位于 CSD2X_Table.asm 中。
Document Number: 001-66172 Rev. **
Page 15 of 47
[+] Feedback
Dual CapSense Sigma-Delta
传感器表
传感器表针对每个传感器包含一个 2-byte 条目。 第一个字节是端口号,第二个字节是位的位掩码 (而不
是位编号)。 有两个表,分别用于左右通道。 该表包括所有独立传感器,然后按顺序列出每个传感器。 下
面是一个包含六个传感器的示例表:
CSD2X_Sensor_Table_Right:
_CSD2X_Sensor_Table_Right:
dw
0x0140 // Port
dw
0x0301 // Port
dw
0x0304 // Port
CSD2X_Sensor_Table_Left:
_CSD2X_Sensor_Table_Left:
dw
0x0308 // Port
dw
0x0302 // Port
dw
0x0108 // Port
1 Bit 6
3 Bit 0
3 Bit 2
3 Bit 3
3 Bit 1
1 Bit 3
该表由 CSD2X_wGetPortPin() 例程使用。
组表
组表定义每组按钮传感器或滑条。 每个滑条对应一个条目,另外还有一个条目用于空闲按钮传感器。 第一
个条目始终是空闲传感器。 每个条目为六个字节。 第一个字节是传感器表中组开始的索引。 第二个字节
是该组中的传感器数量。 第三个字节指示滑条是否为双工 (4 为双工,0 为非双工)。 第四、五、六个字
节是定点乘数,滑条的计算出的质心乘以这些乘数就可以得到 CSD2X 向导中所需的分辨率。
CSD2X_Group_Table:
_CSD2X_Group_Table:
; Group Table:
; Origin Count Diplex DivBtwSw(wholeMSB, wholeLSB, fractByte)
db 0x0,
0x3,
0x00,
0x00,
0x00,
0x00 ; Buttons
db 0x3,
0x8,
0x4,
0x0,
0x0,
0x44 ; Slider 1
双工表
当某个组是滑条且也处于双工时,将为该组生成双工表扫描顺序数据。 否则,将创建标签而不放置数据。
该表包含两部分:每个滑条的传感器映射,以及每个单独滑条对其表的引用。 下面是八传感器滑条的典型
示例。
DiplexTable_0:
; This group is not a diplexed slider
DiplexTable_1:
db 0,1,2,3,4,5,6,7,0,3,6,1,4,7,2,5 // 8 switch slider
CSD2X_Diplex_Table:
_CSD2X_Diplex_Table:
db >DiplexTable_0, <DiplexTable_0
db >DiplexTable_1, <DiplexTable_1
顺序表
顺序表针对每个传感器包含一个字节。 该字节是不依赖于通道的原始计数结果阵列中的左传感器顺序。 该
表由向导生成,反映了传感器顺序。
CSD2X_1_Order_Table_Left:
_CSD2X_1_Order_Table_Left:
DB 0x01 // Position 1
CSD2X_1_Order_Table_Right:
_CSD2X_1_Order_Table_Right:
Document Number: 001-66172 Rev. **
Page 16 of 47
[+] Feedback
Dual CapSense Sigma-Delta
DB 0x00,0x02 // Position 0 and 2
IDAC 表
启用 “ 自动校准 ” 时,会为具有 ICAD 配置的 CSD2X 生成 IDAC 表。 对于可在运行时更改的每个传感
器,该表包含了已校准的电流值。 这在复杂项目中很有帮助。
对于双通道配置:
CSD2X_1_baDACCodeBaselineL:
_CSD2X_1_baDACCodeBaselineL:
BLK CSD2X_1_TotalLeftSensorCount
CSD2X_1_baDACCodeBaselineR:
_CSD2X_1_baDACCodeBaselineR:
BLK CSD2X_1_TotalRightSensorCount
对于单通道配置:
CSD2X_1_baDACCodeBaselineL:
_CSD2X_1_baDACCodeBaselineL:
BLK CSD2X_1_TotalSensorCount
CSD2X_1_baDACCodeBaselineR:
_CSD2X_1_baDACCodeBaselineR:
BLK CSD2X_1_TotalSensorCount
软件中断兼容性
警告: CSD2x 用户模块在 INT_CLR2 寄存器运行期间用逻辑 “1” 值覆盖该寄存器的内容。 这意味着软件
中断功能不能用于 CSD2x 用户模块。 不要更改 INT_MSK3 寄存器中的 ENSWINT 位字段的值 - 这会中断项
目运行。
参数和资源
自动校准
启用或禁用自动校准 API 函数。
自动校准仅包括在 IDAC 配置中。 自动校准自动选择可能的 IDAC 值,以获取分辨率范围一半的原始
计数。 这会降低 CapSense 算法的整体灵敏度,但它允许您在调整过程开始时快速获取可读范围内的
原始计数。 自动校准使用 ROM 和 RAM 资源,因此会增加开始时间。 如果校准后的原始计数值小于分
辨率范围的一半,则您应当增大 IDAC 范围或者降低预充电频率。 自动校准可少量提高功能配置。 如
果启用此参数,在用户模块启动期间 CSD2X_Start API 结束时,会自动调用 CSD2X_Calibrate API
函数。
噪音阈值
如果计数值高于此阈值,则不更新基线。 对于滑条传感器,低于此阈值的计数值不会计入质心的计
算中。 可能值的范围为从 5 到 255。
屏蔽电极输出
此参数启用或禁用支持可选屏蔽电极的算法。 在 CSD2x 向导中,屏蔽电极 (如果启用)路由到左侧
通道的 P1[6] 或 P3[6] 或右侧通道的 P1[7] 或 P3[7]。 在具有较少引脚的设备上,P3[6] 和 P3[7]
不可用。 对于单一通道,连接取决于使用的是右侧还是左侧 CapSense 通道。
选定引脚的驱动模式应当设置为强。
Document Number: 001-66172 Rev. **
Page 17 of 47
[+] Feedback
Dual CapSense Sigma-Delta
BaselineUpdate 阈值
如果新的原始计数值高于当前基线,而差低于噪声阈值 (传感器自动复位参数设置为 “ 禁用 ”),
则当前基准与原始计数的差会累计到可以想象为一个存储桶 ( 水桶 ) 的地方。 当存储桶填满时,基
线按某个值递增,然后水桶清空。 此参数设置了基线递增时水桶必须要达到的阈值。 可能值为 0 到
255。 参数值越大,基线更新速度越慢。 如果需要更频繁的基线更新,则减小此参数。
传感器自动复位
此参数确定是在所有情况下都更新基线还是仅当信号差低于噪音阈值时才更新基线。 如果设置为
Enabled,基线将持续更新。 该设置限定了传感器的最大持续时间长度 (典型值为 5 – 10s),它会
防止当没有任何东西触摸传感器而原始计数突然升高时传感器一直保持开启状态。 较大的供电电压
波动、高能射频噪音源或极快的温度变化都会导致这种突然升高。
如果该参数设置为 Disabled,则仅当原始计数与基线之差低于 “ 噪音阈值 ” 参数时才会更新基
线。 除非您在任何物体未触碰传感器而原始计数突然上升的情况下传感器永久打开方面遇到问题,
否则应始终将此参数保留为 “ 禁用 ”。
下图说明了此参数对基线更新的影响。
Figure 7. 传感器自动复位参数
Document Number: 001-66172 Rev. **
Page 18 of 47
[+] Feedback
Dual CapSense Sigma-Delta
迟滞
“ 迟滞 ” 参数会与手指阈值相加或相减,具体取决于传感器当前处于活动还是非活动状态。 如果传
感器处于非活动状态,则差计数必须大于手指阈值与迟滞的和。 如果传感器处于活动状态,则差计
数必须低于手指阈值与迟滞的差。 此参数用于为手指检测算法增加防反跳和粘着性。 当调用
bIsSensorActive() 或 bIsAnySensorActive() 时,计算带有迟滞的阈值。 可以用 bIsSensorActive() 或 baSnsOnMask[] 阵列的返回值监控传感器状态。 可能的值为 0 到 255,但是必须小于 “
手指阈值 ” 参数设置。
只有正确选择高级决策逻辑参数,才能高效补偿环境温度因数 (温度、湿度变化等),抑制噪声信号
(ESD、电源尖峰脉冲),并在各种情况下提供可靠触摸检测。
反跳
“ 反跳 ” 参数为传感器的活动状态切换添加了一个反跳计数器。 为了使传感器从非活动跃变到活动
状态,对于指定数量的样品,差计数值必须大于手指阈值与迟滞之和。 防反跳计数器按 bIsSensorActive 或 bIsAnySensorActive API 函数递增。
可能值为 1 到 255。 设置为 1 则不提供防反跳。
手指阈值
此阈值用于确定每个按钮传感器的状态。 如果任何传感器处于活动状态,则 bIsAnySensorActive()
函数返回 1。 如果所有传感器关闭,则 bIsAnySensorActive() 函数返回 0。
手指检测阈值适用于所有传感器和滑条。 对于单个传感器 (不包含在滑条组中),这些阈值是变量,
在 baBtnFThreshold[] 阵列中提供。 可以使用 CSD2X_SetDefaultFingerThresholds() 函数将阈值
设置为用户模块参数中设置的默认值。 要调整单个传感器的灵敏度,请更改每个传感器的 baBtnFThreshold[] 值。 (此字节阵列的大小等于实现的单个传感器的计数。)
可能值的范围为从 1 到 255。
扫描速度
此参数影响传感器的扫描速度。 可用的选择有: 超快、快速、正常、慢速。 较慢的扫描速度具有下
列好处:
„ 信噪比提高
„ 更高的抗电源和温度变化能力
扫描速度通过下列方式影响扫描速度除数:
扫描速度
除数
超快
1
快速
2
正常
4
慢速
8
扫描分辨率
此参数确定扫描分辨率 (以比特为单位)。 可以用 9 到 16 比特的分辨率来扫描传感器。 N 比特的
扫描分辨率最大原始计数为 2N-1。
增大分辨率可提高触摸检测的灵敏度和信噪比。 对于接近检测,请使用高分辨率。 使用 16-bit 分辨
率、慢速扫描模式和一根 20 cm 导线,您可以在 20 cm 或更远距离检测到人手的移动。
Document Number: 001-66172 Rev. **
Page 19 of 47
[+] Feedback
Dual CapSense Sigma-Delta
Table 2.
24 MHz IMO 操作的扫描时间 (以 µs 为单位)与扫描速度和分辨率
扫描速度
分辨率,比特
超快
快速
正常
慢速
9
60
85
150
255
10
85
150
255
510
11
150
255
510
1020
12
255
510
1020
2040
13
510
1020
2040
4080
14
845
1700
3380
6760
15
1530
3060
6120
12100
16
2880
5800
11500
23000
Note
扫描时间按两次传感器扫描之间的时间间隔来测量。 此时间包括传感器设置时间、调制器稳定延
迟、样品转换间隔和数据预处理时间。
LowBaselineReset
LowBaselineReset 参数与 NegativeNoiseThreshold 参数配合使用。 对于指定数量的样品,如果样
品计数值低于基线与 NegativeNoiseTreshold(负噪声阈值)的差,则基线设置为新的原始计数值。
此参数实际上是对复位基线所需的异常低的样品数进行计数。 它通常用于更正启动时手指未移开的
情况。 可能值的范围为 0-255。
NegativeNoiseThreshold
NegativeNoiseThreshold 参数添加一个负计数差阈值。 如果当前原始计数低于基线且它们的差大于
此阈值,则不更新基线。 但是,如果当前原始计数在 LowBaselineReset 参数指定的采样数内一直保
持较低状态 (差值大于阈值),则会复位基线。 可能值的范围为 0-255。
调制器电容引脚
调制器电容引脚仅用于单一通道配置。 此参数设置引脚以连接外部调制器电容 (Cmod)。 可用引脚为
P0[5] 和 P0[7]。对于双通道配置,同时使用两个引脚。
参考源
此参数设置比较器参考源。 可能的选择有带隙 (Vbg)、模拟调制器 (ASExx) 或外部电压 (来自
AnalogColumn_InputSelect_x). 对于 IDAC 配置,可能的选择有 Vbg 或 Vdd。 有关其他信息,请参
阅 “ 比较器参考源 ” 一节。
Document Number: 001-66172 Rev. **
Page 20 of 47
[+] Feedback
Dual CapSense Sigma-Delta
参考值
对于 IDAC 和 Rb 配置,值 0 对应于接近 GND 的参考电压。 值 31 对应于接近 VDD 的参考电压。
这为参考电压提供了 5-bit 分辨率。
在 Rb 配置中,如果参考来自外部引脚或 Vbg,则参考值参数没有任何效果。 在这种情况下,可以忽
略参考值设置。 另外,在 Rb 配置中,参考电压的实际分辨率为 4-bits。 但是,所用的值仍然处于
5-bit 范围 (即,0 到 31)。
使用的参考值越高,提供的参考电压就越高。 较高的参考电压会导致传感器原始计数上升。 同样,
较低的参考值 / 电压会导致传感器原始计数下降。
预充电源
此参数选择预充电开关的时钟源。 允许的选项为 PRS 和定时器。 在大多数情况下,使用 PRS 源可获
得较高的抗 EMI 性能和较低的辐射。
预分频器
此参数设置预分频器比例,并确定预充电开关输出频率。 此参数还影响 PRS 输出频率。
可能的值有:
„
„
„
„
„
„
„
„
SYSCLK/1
SYSCLK/2
SYSCLK/4
SYSCLK/8
SYSCLK/16
SYSCLK/32
SYSCLK/128
SYSCLK/256
反馈电阻引脚
此参数仅可用于 Rb 配置。 此参数设置引脚来连接外部反馈电阻 (Rb)。 从下列可用引脚中选择: 用
于左通道的 P1[4]、P3[4] 和用于右通道的 P1[5]、P3[5]。 在某些设备封装上,某些引脚不可用。
提示:如果这些引脚中的一些引脚用于其他用途 (例如,分配用于传感器连接),则在 UM 参数列表
中将不能选择它们。 CSD 用户模块的将来版本可允许使用附加引脚来连接反馈电阻。 这将允许在没
有 P3 端口的封装中使用第二个 I2C 端口。 使用引脚 P1[5] 或 P3[1] 是为了避免编程问题。
IDAC 范围
此参数仅可在 iDAC 配置中可用。 设置 iDAC 当前乘数。 该设置的结果不同于双通道配置。 下面显
示了双通道配置结果:
在双通道配置中,将具有大电容的传感器连接到左通道。
IDAC 值
电容测量范围取决于此参数。 值越高,范围越大。 调整 IDAC 值,以获取大约为整个范围的 50-70%
的原始计数。 可以在运行时使用 CSD2X_SetLeftDACValue 或 CSD2X_SetRightDACValue API 函数更
改此参数。 可能值为 1 到 255。
补偿 IDAC 值
补偿 iDAC 旨在补偿传感器的初始电容。 虽然调整此参数会增大灵敏度和信噪比,但是设置太高的值
会中断 CSD2X 操作。 在调整过程中,调整起点为 0,增加该值可达到最大信噪比和灵敏度。 此参数
仅可用在单通道 IDAC 配置中。
可能值为 0 到 255。
Document Number: 001-66172 Rev. **
Page 21 of 47
[+] Feedback
Dual CapSense Sigma-Delta
应用程序编程接口
应用程序编程接口 (API) 函数作为用户模块的一部分提供,使您能够以更高级别处理模块。 本节指定每
个函数的接口,以及包括文件所提供的相关常量。
每次放置用户模块时,都会向其分配一个实例名称。 默认情况下,PSoC Designer 将 CSD2X_1 分配给此用
户模块在给定项目中的第一个实例。 它可以更改为符合标识符语法规则的任何唯一值。 分配的实例名称成
为每个全局函数名称、变量和常量符号的前缀。 在下面的说明中,为了简单起见,实例名称缩写为
CSD2X。
注意 ** 这里如同在所有用户模块 API 中一样,A 和 X 寄存器的值可以通过调用 API 函数来更改。 如果
在调用之后仍需要这些值,则调用函数需负责在调用之前保留 A 和 X 的值。 选择此 “ 寄存器是易失的
” 策略是为了提高效率,从 PSoC Designer 1.0 版开始就已经强制实施了此策略。 C 编译器会自动考虑
这一要求。 汇编语言编程人员也必须确保他们的代码符合此策略。 虽然一些用户模块 API 函数可以保留
A 和 X 不变,但是不保证将来它们也会这样做。
提供了初始化 CSD2X、启动其采样和停止 CSD2X 的进入点。 在所有情况下,模块的实例名称会替换下列进
入点中显示的 CSD2X 前缀。 未能使用正确的实例名称是造成语法错误的一个常见原因。
API 函数使用不同的全局阵列。 不应手动更改这些阵列。 但是,您可以出于调试目的检查这些值。 例如,
您可以使用绘图工具显示阵列的内容。 下面是一些全局阵列:
„
„
„
„
CSD2X_waSnsBaseline[]
CSD2X_waSnsResult[]
CSD2X_waSnsDiff[]
CSD2X_baSnsOnMask[]
CSD2X_waSnsBaseline[] – 这是一个整数阵列,其中包含每个传感器的基线数据。 阵列大小等于传感器
计数。 CSD2X_waSnsBaseline[] 阵列通过下列函数更新:
„ CSD2X_UpdateAllBaselines();
„ CSD2X_UpdateSensorBaseline();
„ CSD2X_InitializeBaselines().
CSD2X_waSnsResult[] – 这是一个整数阵列,其中包含每个传感器的原始数据。 阵列大小等于传感器计
数。 CSD2X_waSnsResult[] 数据通过下列函数更新:
„ CSD2X_ScanSensor();
„ CSD2X_ScanAllSensors();
CSD2X_waSnsDiff [] – 这是一个整数阵列,其中包含每个传感器的原始数据与基线数据的差。 阵列大小
等于传感器计数。 该数据通过以下函数更新: CSD_UpdateSensorBaseline().
CSD2X_baSnsOnMask[] – 这是一个将传感器保持在开或关状态的字节阵列 (用于按钮或滑条)。
CSD2X_baSnsOnMask[0] 包含传感器 0 到 7 的掩码位 (传感器 0 为第 0 位,传感器 1 为第 1 位)。
CSD2X_baSnsOnMask[1] 包含传感器 8 到 15 的掩码位 (如果需要),依此类推。 该字节数组包含囊括所
有布置的传感器所需的元素。 如果按钮开启,则位的值为 1 ;如果按钮关闭,则位的值为 0。
CSD2X_baSnsOnMask[] 数据通过 CSD2X_blsSensorActive(BYTE bSensor) 函数或
CSD2X_bIsAnySensorActive() 例程更新。
CSD2X_Start
说明:
初始化寄存器并启动用户模块。 应当在调用任何其他用户模块函数之前调用此函数。 启用 “ 自动校
准 ” 时,在应用所有其他用户模块参数之后,会在此函数中自动调用 CSD2X_Calibrate API。
Document Number: 001-66172 Rev. **
Page 22 of 47
[+] Feedback
Dual CapSense Sigma-Delta
C 原型:
void CSD2X_Start()
汇编:
lcall
CSD2X_Start
参数:
无
返回值:
无
副作用:
**
CSD2X_Stop
说明:
停止传感器扫描仪,禁用内部中断,调用 CSD2X_ClearSensors() 以将所有传感器复位为非活动状
态。
C 原型:
void CSD2X_Stop()
汇编:
lcall
CSD2X_Stop
参数:
无
返回值:
无
副作用:
**
CSD2X_SetScanMode
说明:
此函数会覆盖所有后续扫描的用户模块参数中设置的扫描速度和扫描分辨率。 分辨率为 9 与 16 之
间的整数值。
C 原型:
在单通道配置中:
void
CSD2X_SetScanMode(BYTE bSpeed, BYTE bResolution);
在双通道配置中:
void
void
CSD2X_SetLeftScanMode(BYTE bSpeed, BYTE bResolution);
CSD2X_SetRightScanMode(BYTE bSpeed, BYTE bResolution);
汇编:
在单通道配置中:
Document Number: 001-66172 Rev. **
Page 23 of 47
[+] Feedback
Dual CapSense Sigma-Delta
mov A, bSpeed
mov X, bResolution
lcall CSD2X_SetScanMode
在双通道配置中:
mov A, bSpeedL
mov X, bResolutionL
lcall CSD2X_SetLeftScanMode
mov A, bSpeedR
mov X, bResolutionR
lcall CSD2X_SetRightScanMode
参数:
A
=> 扫描速度
X
=> 扫描分辨率。 9 与 16 之间的整数值。
下面给出了 bSpeed 参数的常量:
常量
值
CSD2X_ULTRAFAST_SPEED
0x00
CSD2X_FAST_SPEED
0x01
CSD2X_NORMAL_SPEED
0x02
CSD2X_SLOW_SPEED
0x03
返回值:
无
副作用
**
CSD2X_SetPrescaler
说明:
此函数会覆盖所有后续扫描的用户模块参数中设置的预分频器值。
C 原型:
在单通道配置中:
void
CSD2X_SetPrescaler(BYTE bPrescaler);
在双通道配置中:
void
void
CSD2X_SetLeftPrescaler(BYTE bPrescaler);
CSD2X_SetRightPrescaler(BYTE bPrescaler);
汇编:
在单通道配置中:
mov
A,
bPrescaler
Document Number: 001-66172 Rev. **
Page 24 of 47
[+] Feedback
Dual CapSense Sigma-Delta
lcall
CSD2X_SetPrescaler
在双通道配置中:
mov A, bPrescalerL
lcall CSD2X_SetLeftPrescaler
mov A, bPrescalerR
lcall CSD2X_SetRightPrescaler
参数:
A
=> 预分频器值。
下面给出了 bPrescaler 参数的常量:
常量
值
CSD2X_PRESCALER_SYSCLK1
0x30
CSD2X_PRESCALER_SYSCLK2
0x20
CSD2X_PRESCALER_SYSCLK4
0x10
CSD2X_PRESCALER_SYSCLK8
0x00
CSD2X_PRESCALER_SYSCLK16
0x40
CSD2X_PRESCALER_SYSCLK32
0x50
CSD2X_PRESCALER_SYSCLK128
0x60
CSD2X_PRESCALER_SYSCLK256
0x70
返回值:
无
副作用
**
CSD2X_ScanSensor
说明:
扫描选定的传感器。 每个传感器在传感器阵列中有唯一编号。 对于单通道配置,此编号由 CSD2X 向
导按顺序分配。 Sw0 为传感器 0,Sw1 为传感器 1,依此类推。
对于双通道配置,传感器编号为 0 到最大通道传感器编号之间的一个值。 例如,如果左通道有两个
传感器,则它们的值分别为 0 和 1。 如果右通道也有两个传感器,则它们的值也分别为 0 和 1。 如
果 0xFF 值作为传感器编号传入此函数,则不扫描该通道的传感器。
在单通道配置中:
C 原型:
void CSD2X_ScanSensor(BYTE bSensor);
在双通道配置中:
Document Number: 001-66172 Rev. **
Page 25 of 47
[+] Feedback
Dual CapSense Sigma-Delta
void
CSD2X_ScanSensor(BYTE bSensorLeft, byte bSensorRight);
汇编:
mov A, bSensor
lcall CSD2X_ScanSensor
在双通道配置中:
mov A, bSensorLeft
mov X, bSensorRight
lcall CSD2X_ScanSensor
参数:
A
=> 传感器编号
在双通道配置中:
A
=> 左通道传感器编号
X
=> 右通道传感器编号
返回值:
无
副作用
**
CSD2X_ScanAllSensors
说明:
通过为每个传感器索引调用 CSD2X_ScanSensor() 扫描所有配置的传感器。
C 原型:
void CSD2X_ScanAllSensors();
汇编:
lcall
CSD2X_ScanAllSensors
参数:
无
返回值:
无
副作用
**
CSD2X_UpdateSensorBaseline
说明:
为每个传感器单独计算的历史计数值称为传感器的基线。 该基线使用 “ 水桶方法 ” 进行更新。
水桶方法使用以下算法。
Document Number: 001-66172 Rev. **
Page 26 of 47
[+] Feedback
Dual CapSense Sigma-Delta
1.
每次调用 CSD2X_UpdateSensorBaseline() 时,通过从原始计数值中减去前一个基线计算计数差。 此
差存储在 CSD2X_waSnsDiff[] 阵列中并提供给您。
2. 如果禁用 “ 传感器自动复位 ”,则每次调用 CSD2X_UpdateSensorBaseline() 时,会将差计数与噪
声阈值进行比较。 如果差低于噪声阈值,会将它累计到虚拟水桶中。 如果差高于噪声阈值,则不更新
水桶。 如果启用 “ 传感器自动复位 ”,则无论噪声阈值参数如何,都会将差累计到一个虚拟水桶内。
3. 虚拟存储桶中的累计差计数达到 BaselineUpdateThreshold (基线更新阈值)后,基线按 1 递增,
水桶复位为 0。
4. 如果差计数低于噪声阈值,则保留在 waSnsDiff[] 阵列中的值复位为 0。 因此,此阵列不包含值大于
0 但低于噪声阈值的元素。
C 原型:
void CSD2X_UpdateSensorBaseline(BYTE bSensor)
汇编:
mov A, bSensor
lcall CSD2X_UpdateSensorBaseline
参数:
A
=> 传感器编号
返回值:
无
副作用:
**
CSD2X_UpdateAllBaselines
说明:
使用 CSD2X_bUpdateSensorBaseline() 函数更新所有传感器的基线
C 原型:
void CSD2X_UpdateAllBaselines()
汇编:
lcall
CSD2X_UpdateAllBaselines
参数:
无
返回值:
无
副作用:
**
CSD2X_bIsSensorActive
说明:
检查指定传感器与其手指阈值相比的计数差数组。 其中会考虑 “ 迟滞 ”。 根据传感器当前是否开
启,在手指阈值上加减迟滞值。 如果传感器处于活动状态,则降低阈值。 如果处于非活动状态,则
升高阈值。 此函数还更新传感器在 CSD2X_baSnsOnMask[] 阵列中的位。
Document Number: 001-66172 Rev. **
Page 27 of 47
[+] Feedback
Dual CapSense Sigma-Delta
C 原型:
BYTE CSD2X_bIsSensorActive(BYTE bSensor)
汇编:
mov A, bSensor
lcall CSD2X_bIsSensorActive
参数:
bSensor A => 传感器编号
返回值:
如果处于活动状态,则返回值为 1,如果处于非活动状态,则返回值为 0。
A => 1 – 所选传感器处于活动状态,0 – 所选传感器处于非活动状态。
副作用:
**
CSD2X_bIsAnySensorActive
说明:
检查所有传感器与其手指阈值相比的计数差数组。 为每个传感器调用 CSD2X_bIsSensorActive() 以
便在调用此函数之后使 CSD2X_baSnsOnMask[] 数组保持最新状态。
C 原型:
BYTE CSD2X_bIsAnySensorActive()
汇编:
lcall
CSD2X_bIsAnySensorActive
参数:
无
返回值:
如果处于活动状态,则返回值为 1,如果处于非活动状态,则返回值为 0。
A => 1 – 一个或多个传感器处于活动状态,0 – 没有传感器处于活动状态。
副作用:
**
CSD2X_wGetCentroidPos
说明:
检查计数差数组的中心。 如果存在,则偏移和长度存储在临时变量中,质心位置计算为 CSD2X 向导
中指定的分辨率。 只有当滑条是由 CSD2X 向导定义时,此函数才可用。
C 原型:
WORD CSD2X_wGetCentroidPos(BYTE bSnsGroup)
汇编:
mov A, bSnsGroup
lcall CSD2X_wGetCentroidPos
Document Number: 001-66172 Rev. **
Page 28 of 47
[+] Feedback
Dual CapSense Sigma-Delta
参数:
bSnsGroup A => 组编号
此参数是对用作滑条的一组特定传感器的引用。 组 0 对应于按钮。 滑条包含在组 1 及更高编号的组
中。
返回值:
滑条的位置值,LSB 位于 A 中,MSB 位于 X 中。
副作用:
该例程通过减去噪音阈值来修改计数差。 该例程只应在每次扫描后调用一次以避免得到负差值。 如
果您的应用要监控计数差信号,请在传输计数差数据之后调用此例程。
如果有任何滑条传感器处于活动状态,则该函数返回从零到 CSD2X 向导中设置的分辨率值之间的值。
如果没有传感器处于活动状态,则该函数返回 –1 (FFFFh)。 如果在执行质心 / 双工算法时出现错
误,则该函数返回 –1 (FFFFh)。 如果需要,可以使用 CSD2X_blsSensorActive() 例程确定触摸了
哪些滑条段。
注: 如果滑条段的噪音计数大于噪音阈值,此子例程可能会生成错误的中心结果。 噪音阈值应小心
设置 (高出噪音水平足够程度),以确保噪音不会生成错误的中心。
CSD2X_wGetRadialPos
说明:
检查计数差数组的中心。 如果存在,则质心位置计算为 CSD2X 向导中指定的分辨率。 此函数仅可用
于 CSD2X 向导定义的辐射滑条。
C 原型:
WORD CSD2X_wGetRadialPos(BYTE bSnsGroup)
汇编:
mov A, bSnsGroup
lcall CSD2X_wGetRadialPos
参数:
bSnsGroup A => 滑条编号
此参数是您使用的辐射滑条的编号。 可以通过辐射滑条表示左侧的 CSD2X UM 向导获取其编号(例如
对于 s2,辐射滑条编号为 2)。
返回值:
辐射滑条的位置值、A 中的 LSB 和 X 中的 MSB。
副作用:
在每次扫描后只能调用一次此例程,以避免得到负的差值和基线更新。 如果您的应用要监控计数差
信号,请在传输计数差数据之后调用此例程。
如果有任何滑条传感器处于活动状态,则该函数返回从零到 CSD2X 向导中设置的分辨率值之间的值。
如果没有传感器处于活动状态,则该函数返回 –1 (FFFFh)。
注:如果滑条段的噪音计数大于噪音阈值,此子例程可能会生成错误的中心结果。 噪音阈值应小心
设置 (高出噪音水平足够程度),以确保噪音不会生成错误的中心。
Document Number: 001-66172 Rev. **
Page 29 of 47
[+] Feedback
Dual CapSense Sigma-Delta
CSD2X_wGetRadialInc
说明:
返回实际手指移动、手指当前位置与以前位置之差。 此函数与 CSD2X_wGetRadialPos() 成对使用,
并采用后者生成的数据 (数据保存在内部变量中)。
C 原型:
WORD CSD2X_wGetRadialInc(BYTE bSnsGroup)
汇编:
mov A, bSnsGroup
lcall CSD2X_wGetRadialInc
参数:
bSnsGroup A => 滑条编号
此参数是您使用的辐射滑条的编号。 可以通过辐射滑条表示左侧的 CSD2X UM 向导获取其编号(例如
对于 s2,辐射滑条编号为 2)。
返回值:
手指移动值 (如果顺时针则为正,如果逆时针则为负)、A 中的 LSB 和 X 中的 MSB。
手指移动值是手指当前位置与以前位置之差。 如果在以前的扫描中没有任何触摸 (上一次但只有一
次 CSD2X_wGetRadialPos() 返回 -1 (FFFFh))或者当前没有任何触摸 (此时
CSD2X_wGetRadialPos() 返回 -1 (FFFFh))
副作用:
只能在 CSD2X_wGetRadialPos() API 之后调用该例程。 因为它使用 CSD2X_wGetRadialPos(). 所设
置的内部数据 CSD2X_waSliderPrevPos 和 CSD2X_waSliderCurrPos
CSD2X_InitializeSensorBaseline
说明:
通过扫描选定传感器,用初始值加载 CSD2X_waSnsBaseline[bSensor] 阵列元素。 原始计数值复制到
选定传感器的基线阵列元素中。 此函数可用于复位单个传感器的基线。
C 原型:
void CSD2X_InitializeSensorBaseline(BYTE bSensor)
汇编:
mov A, bSensor
lcall CSD2X_InitializeSensorBaseline
参数:
A => 传感器编号
返回值:
无
副作用:
**
Document Number: 001-66172 Rev. **
Page 30 of 47
[+] Feedback
Dual CapSense Sigma-Delta
CSD2X_InitializeBaselines
说明:
通过扫描每个传感器为 CSD2X_waSnsBaseline[] 数组加载初始值。 原始计数值复制到每个传感器的
基线阵列中。
C 原型:
void CSD2X_InitializeBaselines()
汇编:
lcall
CSD2X_InitializeBaselines
参数:
无
返回值:
无
副作用:
**
CSD2X_SetDefaultFingerThresholds
说明:
为 CSD2X_baBtnFThreshold[] 数组加载 FingerThreshold 参数值。 如果 CSD2X_baBtnFThreshold[]
阵列不是用自定义值手动加载的,则必须在扫描之前调用此函数。
C 原型:
void CSD2X_SetDefaultFingerThresholds()
汇编:
lcall
CSD2X_SetDefaultFingerThresholds
参数:
无
返回值:
无
副作用:
**
CSD2X_SetLeftDACValue
说明:
此函数将会覆盖用户模块参数设置中的左 IDAC 值。 如果需要用不同的 iDAC 设置扫描某些传感器,
则使用此函数。 此函数可以与 CSD2X_ScanSensor(). 一起使用。此函数在 Rb 配置中不可用。
C 原型:
void CSD2X_SetLeftDACValue(BYTE bIdacValue);
汇编:
mov A,
bIdacValue
Document Number: 001-66172 Rev. **
Page 31 of 47
[+] Feedback
Dual CapSense Sigma-Delta
lcall
CSD2X_SetLeftDACValue
参数:
bIdacValue - 设置 iDAC 值。 接受的值为 1 至 255。
返回值:
无
副作用:
**
CSD2X_SetRightDACValue
说明:
此函数将会覆盖用户模块参数设置中的右 IDAC 值。 如果需要用不同的 iDAC 设置扫描某些传感器,
则使用此函数。 此函数可以与 CSD2X_ScanSensor(). 一起使用。此函数在 Rb 配置中不可用。
C 原型:
void CSD2X_SetRightDACValue(BYTE bIdacValue);
汇编:
mov A, bIdacValue
lcall CSD2X_SetRightDACValue
参数:
bIdacValue - 设置 iDAC 值。 接受的值为 1 至 255。
返回值:
无
副作用:
**
CSD2X_SetIdacValue
说明:
此函数将会覆盖用户模块设置中的 IDAC 值和 IDAC 补偿值。 如果需要用不同的 IDAC 设置扫描某些
传感器,则使用此函数。 此函数可以与 CSD2X_ScanSensor(). 一起使用。此函数仅在单通道 IDAC 配
置中可用。
C 原型:
void CSD2X_SetIdacValue(BYTE bIDACVal, BYTE bCompIDACVal);
汇编:
mov A, bIDACVal
mov X, bCompIDACVal
lcall CSD2X_SetIdacValue
参数:
bIDACVal - 设置 IDAC 值。 接受的值为 1 至 255。
bCompIDACVal - 设置 IDAC 补偿值。 接受的值为 0 至 255。
Document Number: 001-66172 Rev. **
Page 32 of 47
[+] Feedback
Dual CapSense Sigma-Delta
返回值:
无
副作用:
**
CSD2X_SetRefValue
说明:
此函数将会覆盖用户模块参数设置中的参考值。 如果需要用不同的参考设置扫描某些传感器,则使
用此函数。 此函数可以与 CSD2X_ScanSensor(). 一起使用。当使用 Rb 配置且参考值设置为 Vbg 或
外部引脚时中的某个值时,此函数不起作用。 这是因为在运行时不能调整 Vbg 参考电压或来自外部
引脚的参考电压。
C 原型:
在单通道配置中:
void
CSD2X_SetRefValue(BYTE bRefValue);
在双通道配置中:
void
void
CSD2X_SetLeftRefValue(BYTE bLeftRefValue);
CSD2X_SetRightRefValue(BYTE bRightRefValue);
汇编:
在单通道配置中:
mov A, bRefValue
lcall CSD2X_SetRefValue
在双通道配置中:
mov A, bLeftRefValue
lcall CSD2X_SetLeftRefValue
mov A, bRightRefValue
lcall CSD2X_SetRightRefValue
参数:
bRefValue - 设置参考值。 接受的值为 0 至 31。
返回值:
无
副作用:
**
CSD2X_SetRefSource
说明:
此函数将会覆盖用户模块参数设置中的参考源。 如果需要用不同的参考设置扫描某些传感器,则使
用此函数。 此函数可以与 CSD2X_ScanSensor(). 一起使用
C 原型:
在所有进行了 IDAC 配置的单通道和双通道中:
void
CSD2X_SetRefSource(BYTE bRefSource);
Document Number: 001-66172 Rev. **
Page 33 of 47
[+] Feedback
Dual CapSense Sigma-Delta
在进行了 Rb 配置的双通道中:
void
void
CSD2X_SetLeftRefSource(BYTE bLeftRefSource);
CSD2X_SetRightRefSource(BYTE bRightRefSource);
汇编:
在所有进行了 IDAC 配置的单通道和双通道中:
mov A, bRefSource
lcall CSD2X_SetRefSource
在进行了 Rb 配置的双通道中:
mov A, bLeftRefSource
lcall CSD2X_SetLeftRefSource
mov A, bRightRefSource
lcall CSD2X_SetRightRefSource
参数:
bRefSource - 参考源常量。 下表中列出了接受的值。
常量 (对于 Rb 配置)
值
CSD2X_REFERENCE_ACOLUMN_MUX
0x01
CSD2X_REFERENCE_VBG
0x03
CSD2X_REFERENCE_ASE
0x04
常量 (对于 IDAC 配置)
值
CSD2X_REFERENCE_VDD
0x00
CSD2X_REFERENCE_2VBG
0x10
返回值:
无
副作用:
**
CSD2X_SetIdacRange
说明:
此函数将会覆盖用户模块参数设置中的 DAC 范围。 如果需要用不同的范围设置扫描某些传感器,则
使用此函数。 此函数可以与 CSD2X_ScanSensor(). 一起使用。此函数在 Rb 配置中不可用。
C 原型:
void CSD2X_SetIdacRange(const bRange);
汇编:
mov A, bRange
lcall CSD2X_SetIdacRange
Document Number: 001-66172 Rev. **
Page 34 of 47
[+] Feedback
Dual CapSense Sigma-Delta
参数:
bRange - 设置参考值。 接受的值为下列常量之一。
设置
值
作用
CSD2X_IDAC_RANGE_1X
0x00
最大 IDAC 电流为 19.92 µA
CSD2X_IDAC_RANGE_4X
0x01
最大 IDAC 电流为 91.03 µA
CSD2X_IDAC_RANGE_16X
0x08
最大 IDAC 电流为 318.75 µA
CSD2X_IDAC_RANGE_32X
0x09
最大 IDAC 电流为 637.50 µA
返回值:
无
副作用:
**
CSD2X_Calibrate
说明:
此函数用于执行 CDS2X 自动校准。 启用自动校准之后,当用 CSD2X_Start() 函数启动用户模块时,
系统将会自动调用此函数。 此函数在 Rb 配置中不可用。
C 原型:
void CSD2X_Calibrate(void);
汇编:
lcall
CSD2X_Calibrate
参数:
无
返回值:
无
副作用:
**
CSD2X_ClearSensors
说明:
通过按顺序调用每个传感器的 CSD2X_wGetPortPin() 和 CSD2X_DisableSensor(),将所有传感器清空
到非采样状态。
C 原型:
void CSD2X_ClearSensors()
汇编:
lcall
CSD2X_ClearSensors
Document Number: 001-66172 Rev. **
Page 35 of 47
[+] Feedback
Dual CapSense Sigma-Delta
参数:
无
返回值:
无
副作用:
**
CSD2X_wReadSensor
说明:
在 A (LSB) 和 X (MSB) 中返回关键原始扫描值。
C 原型:
WORD CSD2X_wReadSensor(BYTE bSensor)
汇编:
mov A, bSensor
lcall CSD2X_wReadSensor
参数:
A
=> 传感器编号
返回值:
传感器的扫描值、A 中的 LSB 和 X 中的 MSB。
副作用:
**
CSD2X_wGetPortPin
说明:
返回指定传感器的端口号和引脚掩码。 传递的参数对 CSD2X_Sensor_Table[]. 中的数据编制索引并
进行选择。返回值可以传递给 CSD2X_EnableSensor()、CSD2X_DisableSensor().。此函数仅在单通
道配置中可用。
C 原型:
WORD CSD2X_wGetPortPin(BYTE bSensorNum)
汇编:
mov A, bSensorNumber
lcall CSD2X_wGetPortPin
参数:
bSensorNumber – 范围为 0 到 (n – 1),其中 n 是 CSD2X 向导中设置的传感器数量与滑条中包含
的传感器数量之和。 CSD2X_wGetPortPin() 使用传感器编号来确定所选活动传感器的端口和位掩码。
返回值:
A
=> 传感器位图
Document Number: 001-66172 Rev. **
Page 36 of 47
[+] Feedback
Dual CapSense Sigma-Delta
X
=> 端口号
副作用:
**
CSD2X_wGetPortPinLeft
说明:
返回连接到左通道的给定传感器的端口号和引脚掩码。 传递的参数对 CSD2X_Sensor_Table_Left[].
中的数据编制索引并进行选择。返回值可以传递给 CSD2X_EnableSensor()、
CSD2X_DisableSensor().。此函数仅在双通道配置中可用。
C 原型:
WORD CSD2X_wGetPortPinLeft(BYTE bSensorNum)
汇编:
mov A, bSensorNumber
lcall CSD2X_wGetPortPinLeft
参数:
bSensorNumber – 范围为 0 到 (n – 1),其中 n 是左通道 CSD2X 向导中设置的传感器数量与滑条
中包含的传感器数量之和。 CSD2X_wGetPortPinLeft() 使用传感器编号来确定所选活动传感器的端口
和位掩码。
返回值:
A
=> 传感器位图
X
=> 端口号
副作用:
**
CSD2X_wGetPortPinRight
说明:
返回连接到右通道的给定传感器的端口号和引脚掩码。 传递的参数对 CSD2X_Sensor_Table_Right[].
中的数据编制索引并进行选择。返回值可以传递给 CSD2X_EnableSensor()、
CSD2X_DisableSensor().。此函数仅在双通道配置中可用。
C 原型:
WORD CSD2X_wGetPortPinRight(BYTE bSensorNum)
汇编:
mov A, bSensorNumber
lcall CSD2X_wGetPortPinRight
参数:
bSensorNumber – 范围为 0 到 (n – 1),其中 n 是左通道 CSD2X 向导中设置的传感器数量与滑条
中包含的传感器数量之和。 CSD2X_wGetPortPinLeft() 使用传感器编号来确定所选活动传感器的端口
和位掩码。
返回值:
A
=> 传感器位图
Document Number: 001-66172 Rev. **
Page 37 of 47
[+] Feedback
Dual CapSense Sigma-Delta
X
=> 端口号
副作用:
**
CSD2X_EnableSensor
说明:
配置所选传感器以在下一测量周期中进行测量。 可以使用 CSD2X_wGetPortPin() 函数选择端口和传
感器,同时将端口号和传感器位掩码分别加载到 X 和 A 中。 驱动模式将修改以便将选定端口和引脚
布置为 “ 模拟高 Z” 模式,并启用正确的模拟复用器总线输入。 这还会启用比较功能。
C 原型:
void CSD2X_EnableSensor(BYTE bMask, BYTE bPort)
汇编:
mov X, bPort
mov A, bMask
lcall CSD2X_EnableSensor
参数:
A
=> 传感器位图
X
=> 端口号
返回值:
无
副作用:
**
CSD2X_DisableSensor
说明:
禁用通过 CSD2X_wGetPortPin() 函数选择的传感器。 驱动模式更改为 “ 强 (001)”。 这可以将传感
器有效接地。 端口引脚与 AnalogMuxBus 的连接断开。 函数参数由 CSD2X_wGetPortPin() 函数返回。
C 原型:
void CSD2X_DisableSensor(BYTE bMask, BYTE bPort)
汇编:
mov X, bPort
mov A, bMask
lcall CSD2X_DisableSensor
参数:
A
=> 传感器位图
X
=> 端口号
返回值:
无
Document Number: 001-66172 Rev. **
Page 38 of 47
[+] Feedback
Dual CapSense Sigma-Delta
副作用:
**
固件源代码样本
示例 1。 此代码启动用户模块并继续扫描传感器。 可以使用通信部分将值传递给 PC 绘图工具:
//-----------------------------------------------------------------------// Sample C code for the CSD2X module
// Scanning all sensors continuously
//-----------------------------------------------------------------------#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main(void)
{
M8C_EnableGInt;
CSD2X_Start();
CSD2X_InitializeBaselines() ; //scan all sensors first time, init baseline
CSD2X_SetDefaultFingerThresholds() ;
//
// Loop Forever
//
while (1) {
CSD2X_ScanAllSensors(); //scan all sensors in array (buttons and sliders)
CSD2X_UpdateAllBaselines(); //Update all baseline levels;
//detect if any sensor is pressed
if(CSD2X_bIsAnySensorActive()){
// Add user code here to proceed the sensor touching
}
// now we are ready to send all status variables to chart program
// communication here
//
// OUTPUT CSD2X_waSnsResult[x] <- Raw Counts
// OUTPUT CSD2X_waSnsDiff[x] <- Difference
// OUTPUT CSD2X_waSnsBaseline[x] <- Baseline
// OUTPUT CSD2X_baSnsOnMask[x] <- Sensor On/Off
}
}
Document Number: 001-66172 Rev. **
Page 39 of 47
[+] Feedback
Dual CapSense Sigma-Delta
示例 2。下面的代码演示了如何能够并行连接多个传感器并通过调用 CSD2X_ScanSensor() 函数同时对它
们进行扫描。 当您需要在未区分已触摸哪些传感器的情况下检测传感器触摸时,可以充分参考本示例。 可
以使用本示例进行设备唤醒检测以及最大限度地减少扫描时间,从而节省电池电量。 如果检测到唤醒触
摸,则可以分别将每个传感器返回到常规扫描。
//-----------------------------------------------------------------------// Sample C code for the CSD2X module
// Scan several sensors in parallel
//-----------------------------------------------------------------------#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main(void)
{
M8C_EnableGInt;
CSD2X_Start();
CSD2X_SetDefaultFingerThresholds();
// Enable the sensor connected to P1[4]
CSD2X_EnableSensor(0x10, 1);
// Enable the sensor connected to P1[6]
CSD2X_EnableSensor(0x40, 1);
// Enable the sensor connected to P3[0]
CSD2X_EnableSensor(0x01, 3);
// Initialize baseline for sensor number "3"
CSD2X_InitializeSensorBaseline(3);
while (1) {
// Scan continuously sensor number "3" which is connected
//in parallel to the enabled above sensors
CSD2X_ScanSensor(3);
// CSD2X_ScanSensor(0xFF, 3); // for Double channel configuration
CSD2X_UpdateSensorBaseline(3);
if(CSD2X_bIsSensorActive(3)){
// Add user code here to proceed the buttons pressing
}
}
}
示例 3。 下面的示例演示如何能够为每个传感器设置不同的手指阈值级别。 当多个传感器放置在不同位置
而其中一些传感器比另外一些传感器更灵敏时,非常有用。
//-----------------------------------------------------------------------// Sample C code for the CSD2X module
// Set individual finger threshold parameter for each sensor
//-----------------------------------------------------------------------#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main(void)
{
M8C_EnableGInt;
CSD2X_Start();
CSD2X_InitializeBaselines();
// set finger threshold for sensor "0"
CSD2X_baBtnFThreshold[0] = 10;
// set finger threshold for sensor "1"
CSD2X_baBtnFThreshold[1] = 20;
// set finger threshold for sensor "2"
Document Number: 001-66172 Rev. **
Page 40 of 47
[+] Feedback
Dual CapSense Sigma-Delta
CSD2X_baBtnFThreshold[2] = 30;
// set finger threshold for sensor "3"
CSD2X_baBtnFThreshold[3] = 40;
// set finger threshold for sensor "4"
CSD2X_baBtnFThreshold[4] = 50;
// set finger threshold for sensor "5"
CSD2X_baBtnFThreshold[5] = 255;
// set finger threshold for sensor "6"
CSD2X_baBtnFThreshold[6] = 200;
while (1) {
// Scan continuously all sensors
CSD2X_ScanAllSensors();
CSD2X_UpdateAllBaselines();
//detect if any sensor is pressed
if(CSD2X_bIsAnySensorActive()){
// Add user code here to proceed the buttons pressing
}
}
}
配置寄存器
Table 3.
模块 CapSense,寄存器: CS_CR0
位
值
7
0
Table 4.
0
5
4
CSD2X_PRSC 0
LK
3
1
2
0
1
0
0
EN
模块 CapSense,寄存器: CS_CR1
位
值
6
7
1
6
5
扫描速度
4
0
3
0
2
0
1
0
0
0
电源: 0x01 打开模拟模块电源。 0x00 关闭模拟模块电源。
Table 5.
模块 CapSense,寄存器: CS_CR2
位
值
7
1
Table 6.
0
7
0
Table 7.
5
0
4
0
3
0
2
1
1
0
0
0
模块 CapSense,寄存器: CS_CR3
模式 / 位
值
6
6
1
5
1
4
1
3
0
2
0
1
0
0
0
模块 CapSense,寄存器: CS_CNTH
位
7
6
5
4
3
2
1
0
数据输出 MSB
Document Number: 001-66172 Rev. **
Page 41 of 47
[+] Feedback
Dual CapSense Sigma-Delta
Table 8.
模块 CapSense,寄存器: CS_CNTL
位
7
6
5
4
3
2
1
0
4
3
2
1
0
2
1
0
数据输出 LSB
Table 9.
模块 CapSense,寄存器: PRS_CR
模式 / 位
值
7
1
6
0
5
8/12 比特
1
预分频器
Table 10. 模块定时器,寄存器: PT1_CFG
模式 / 位
值
7
0
6
0
5
0
4
0
3
0
0
1
开始
Table 11. 模块定时器,寄存器: PT1_DATA0
模式 / 位
值
7
6
5
4
3
2
1
0
4
3
2
1
0
数据 LSB
Table 12. 模块定时器,寄存器: PT1_DATA1
模式 / 位
值
7
6
5
数据 MSB
附录
下面各节将介绍用户模块数据表中通常包含内容之外的信息。 赛普拉斯工程师编写了详细信息,您可以借
鉴这些信息成功设计出 CapSense 应用程序。 其中的部分信息可能会在将来移动到应用笔记中。
CSD2x 参数的交互
下图说明了基准更新和决策逻辑操作,对于更好地了解如何设置 UM 参数以获得最佳性能很有帮助。 第一
个图形说明了 “ 传感器自动复位 ” 参数设置为禁用情况下的系统操作。 第二个图形说明了 “ 传感器自
动复位 ” 参数设置为启用情况下的系统操作。 图中还一同显示了手指阈值、噪声阈值、迟滞和负噪声阈
值以及差信号 (原始计数 – 基准)。 数据是在一些人工测试中收集的,这些测试展现了原始计数慢速和
快速变化时的系统操作。慢速变化可能是温度或湿度变化所致,快速变化可能是由传感器触摸、ESD 事件
或强射频场的影响触发的。
Document Number: 001-66172 Rev. **
Page 42 of 47
[+] Feedback
Dual CapSense Sigma-Delta
Figure 8. 在 SensorsAutoreset 设置为 “ 禁用 ” 情况下原始计数、基准、差信号变化的示例
在 t0,原始计数接近于基准水平,然后由于湿度或温度变化,开始缓慢下降。 由于两次连续转变之间的原
始计数变化不超过 NegativeNoiseThreshold 参数 (绝对值),因此通过跟踪原始计数最小值来更新基
准,保留原始计数信号的较小值。
在 t1,原始计数快速下降,负差超过 NegativeNoiseThreshold。 如果在手指位于传感器上时打开设备的
电源,过一会后移开手指,则会发生这种情况。 此时,基准更新机制冻结,激活内部超时计数器。 当差信
号低于 LowBaselineReset 示例的 NegativeNoiseThreshold 时,基准复位。 这发生在 t2。
第二大负差信号尖峰脉冲在 t3 发生,例如,此尖峰脉冲可能由 ESD 事件触发。 由于计数示例中的尖峰脉
冲持续时间小于 LowBaselineReset 参数,因此保留基准,对尖峰脉冲进行滤波。 这可以阻止假基准复位
并避免进行假触摸检测。
传感器是在 t4 上被触摸的。 当差信号超过 “ 手指阈值 + 迟滞 ” 值时,激活内部防反跳计数器。 如果
信号超过此值的量大于防反跳示例,则传感器状态设置为启用。 这发生在 t5。 当差信号在 t7 下降到 “
手指阈值 – 迟滞 ” 级别之下时,传感器立即恢复为关闭状态。 t9 处短的正尖峰脉冲已被防反跳计数器
滤波,这是因为样品单元中的尖峰脉冲持续时间不会超过防反跳值。
Document Number: 001-66172 Rev. **
Page 43 of 47
[+] Feedback
Dual CapSense Sigma-Delta
原始计数在 t7 和 t10 之间缓慢升高。 当差信号低于 NoiseThreshold (SensorsAutoreset 设置为 “ 禁
用 ”),差信号与漂移速率成比例时,使用水桶算法来更新基线。 可以使用 BaselineUpdate 阈值参数来
控制基准更新速度。 参数值越低,基准更新速度越快。
Figure 9. 在 SensorsAutoreset 设置为 “ 启用 ” 的情况下原始计数、基准、差信号的变化示例
Document Number: 001-66172 Rev. **
Page 44 of 47
[+] Feedback
Dual CapSense Sigma-Delta
上图中的系统操作与上例中的操作类似,但存在以下差异:
„ 在 t6 处传感器被触摸,根据活动基准更新算法,触摸持续时间下降。
„ 手指移开后,在 LowBaselineReset 示例 (t8) 模块触摸检测很短时间后,基准复位。 这称为附加防反
跳机制。
双通道扫描
双通道扫描是以同步模块函数形式进行的。
同步意味着同时扫描左右通道传感器,只有在完成上一对传感器的扫描之后,才能在下一对传感器上开始
扫描。 左右传感器可以具有不同的分辨率和扫描时间。 在此情况下,“Scan Sensor” 函数等待较慢的传
感器,不对另一个传感器执行任何操作。 如果左右传感器阵列由不同数量的传感器组成,则
“ScanAllSensors” 函数:
„ 成对扫描所有可能的传感器
„ 如果一侧的传感器比另一侧多,则一次扫描一个该通道上的其余传感器
扫描从阵列末尾开始。 了在 GUI 中根据从左上到右下的顺序分配传感器位置。 要尽量确保您的双通道扫
描高效进行,请执行下列操作:
„
„
„
„
„
在每个通道中放置相同数量的传感器
排列传感器,使具有较长扫描时间的传感器成对放置
将所有滑条段放置在同一通道中
将大的传感器放在左通道中。
如果使用不同的参考,则首先放置具有较高参考值的传感器
Document Number: 001-66172 Rev. **
Page 45 of 47
[+] Feedback
Dual CapSense Sigma-Delta
版本历史记录
版本
创作者
说明
1.0
DHA
初始版本
2.0
DHA
1. 从 CSD2x 向导中移除了下列参数:
IDAC 值、手指阈值、参考值、扫描速度、扫描分辨率
2. 在向导中禁用了用于设置每个传感器扫描参数的选项。 这可以节省 RAM 和 ROM 空
间。
3. 向用户模块参数窗口中添加了下列新参数:
手指阈值、参考值 (左 / 右)、IDAC 值 (补偿 / 左 / 右)、扫描速度、分辨率
这些参数在启动时应用于所有传感器。
4. 参考值 (左 / 右)参数分辨率增加到 5 比特。
5. 增加了下列新 API 函数,以便与其他 CapSense 用户模块保持一致:
SetScanMode (左 / 右)、SetPrescaler (左 / 右)、SetRefSource (左 / 右)、
SetRefValue (左 / 右)、SetDACValue (左 / 右)
6. RAM 中存储了所有扫描参数。 这允许在运行时为单个传感器设置不同的扫描参数。
7. 现在,在启动时自动完成自动校准(如果启用)。 不需要手动调用 CSD2X_Calibrate
API。
8. 解决了其他缺陷,清理了用户模块源代码。
2.1
DHA
1. 更新了 IDAC 值输入范围。
2. 更新了参考值和自动校准参数的说明。
3. 更新了 PSoC Designer 中的参数顺序。
4. 添加了对数据表部分的引用。
5. 向数据表添加了 SetRefSource API。
6. 更新了下列 API 的说明:
CSD2X_DisableSensor, CSD2X_Start, CSD2X_SetScanMode
7. 更改了 MUM 配置说明。
8. 添加了对新部件号的支持。
9. 添加了 LowBaselineReset、NegativeNoiseThreshold 和模块电容引脚参数的范围。
10. 解决了手指阈值参数的范围问题。
11. 添加了 SetLeftRefSource 和 SetRightRefSource API 的原型。
2.20
DHA
添加了针对未分配传感器的 DRC 警告消息。
Document Number: 001-66172 Rev. **
Page 46 of 47
[+] Feedback
Dual CapSense Sigma-Delta
Note
PSoC Designer 5.1 在所有用户模块数据表中提供了一个版本历史记录。 这一部分概要说明了当
前与以前的用户模块版本之间的差异。
Document Number: 001-66172 Rev. **
Revised December 22, 2010
Page 47 of 47
Copyright © 2009-2010 Cypress Semiconductor Corporation. The information contained herein is subject to change without notice. Cypress Semiconductor Corporation assumes no responsibility
for the use of any circuitry other than circuitry embodied in a Cypress product. Nor does it convey or imply any license under patent or other rights. Cypress products are not warranted nor intended
to be used for medical, life support, life saving, critical control or safety applications, unless pursuant to an express written agreement with Cypress. Furthermore, Cypress does not authorize its
products for use as critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress products
in life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges.
PSoC Designer™ and Programmable System-on-Chip™ are trademarks and PSoC® is a registered trademark of Cypress Semiconductor Corp. All other trademarks or registered trademarks
referenced herein are property of the respective corporations.
Any Source Code (software and/or firmware) is owned by Cypress Semiconductor Corporation (Cypress) and is protected by and subject to worldwide patent protection (United States and foreign),
United States copyright laws and international treaty provisions. Cypress hereby grants to licensee a personal, non-exclusive, non-transferable license to copy, use, modify, create derivative works
of, and compile the Cypress Source Code and derivative works for the sole purpose of creating custom software and or firmware in support of licensee product to be used only in conjunction with
a Cypress integrated circuit as specified in the applicable agreement. Any reproduction, modification, translation, compilation, or representation of this Source Code except as specified above is
prohibited without the express written permission of Cypress.
Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress reserves the right to make changes without further notice to the materials described herein. Cypress does not
assume any liability arising out of the application or use of any product or circuit described herein. Cypress does not authorize its products for use as critical components in life-support systems
where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress' product in a life-support systems application implies that the manufacturer
assumes all risk of such use and in doing so indemnifies Cypress against all charges.
Use may be limited by and subject to the applicable Cypress software license agreement.
[+] Feedback