ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

瑞萨RA系列CTSU触摸方案:FSP与QE协同调优实战指南

瑞萨RA系列CTSU触摸方案:FSP与QE协同调优实战指南 1. 项目概述为什么一个触摸方案要专门讲FSP与QE工具链瑞萨RA系列MCU这两年在工业控制、人机交互和智能家电领域跑得特别稳尤其是RA4M1、RA6M5这些型号一上来就带着硬件级电容触摸检测模块CTSU不是靠GPIO模拟那种“抖动式”方案而是真正在芯片里集成了可配置的电流源、比较器、数字滤波器和扫描状态机。但问题来了——很多人拿到RA开发板对着官方例程一顿编译发现触摸按键响应迟钝、误触发频繁、滑条跳变严重甚至同一块板子换个人摸灵敏度都差一大截。我去年帮三个客户做RA6M5的HMI升级全卡在触摸这一关最后发现根本不是硬件问题而是FSPFlexible Software Package配置没吃透QEQuick-Connect Environment里的参数调得像蒙眼抓骰子。核心矛盾就在这里瑞萨把CTSU硬件做得足够强但FSP封装的驱动层默认配置是“通用安全模式”它优先保稳定、防干扰牺牲了响应速度和动态范围而QE工具又是个半自动化的“参数翻译器”它把寄存器位映射成滑块和下拉框但不告诉你每个滑块背后对应的是采样周期、噪声抑制阈值还是去抖时间常数。比如你拖动“Sensitivity”滑块它实际改的是CTSU_SSDR寄存器的SSDR[7:0]字段这个值每1采样积分时间就翻一倍响应延迟直接从2ms涨到4ms——但QE界面里根本没写单位也没提示“此操作将降低刷新率”。所以这篇不是教你怎么点灯、串口打印的入门帖而是聚焦在FSP与QE如何协同完成一个工业级触摸方案的闭环落地。它适合三类人一是刚从STM32转过来、被瑞萨这套工具链搞懵的嵌入式工程师二是负责HMI功能定义的产品经理需要理解触摸参数对用户体验的实际影响三是产线测试人员得知道为什么同一套固件在不同温湿度环境下触摸一致性会漂移。我们不讲抽象理论只拆解真实项目里必须面对的五个硬骨头CTSU时钟树怎么配才不丢采样点、QE生成的初始化代码里哪三行必须手改、噪声抑制滤波器的系数怎么算、滑条线性度校准的实操步骤、以及RA6M5上多通道同步扫描的底层陷阱。所有内容都来自我手调过17块不同PCB、烧录过2300次固件后记下的笔记。2. FSP与QE协同设计逻辑不是“用工具”而是“驯服工具”2.1 FSP的本质一个带约束的代码生成器不是万能胶很多人以为FSP就是瑞萨版的CubeMX点点鼠标生成初始化代码就完事。错。FSP的核心定位是硬件抽象层HAL与中间件的约束型集成平台。它强制要求你先选好“系统资源拓扑”——比如你选了CTSU模块FSP就会锁死你不能同时启用ADC1的某些通道因为它们共享同一个模拟前端开关矩阵你启用了FreeRTOSFSP就自动禁用掉SysTick的裸机配置选项。这种设计本意是防冲突但新手常踩的坑是在FSP配置界面里反复切换“Enable CTSU”开关结果生成的代码里ctsu_instance_t结构体指针始终为NULL调试半天才发现——FSP在后台悄悄把CTSU的电源域SBYCR寄存器配置成了待机模式而你的主时钟还没切到HOCO导致CTSU根本没上电。真正关键的三个FSP配置节点必须手动核对Clock Configuration → CTSU Clock Source这里不能选“Auto”必须明确指定为“PCLKB”。因为RA6M5的CTSU时钟路径是PCLKB → CTSUCLK → 内部分频器。如果选AutoFSP可能按低功耗模式配成1MHz而CTSU最低有效采样率要求是2MHz否则积分电容充不满。我实测过1MHz时钟下即使把Sensitivity滑到最大触摸响应延迟也超过80ms手指离开后LED还亮着。CTSU Driver → Noise Filter Settings → Enable Digital Filter默认勾选但这是个双刃剑。数字滤波器DFLT能压掉50Hz工频干扰但会引入2~3个采样周期的相位延迟。如果你要做滑条实时跟随比如音量旋钮这个延迟会让UI感觉“发滞”。我的做法是在FSP里先勾选启用生成代码后立刻找到g_ctsu_instance.p_api-noiseFilterSet()调用处把它注释掉改用手动配置寄存器CTSU_DFLT——这样既能保留滤波器硬件电路又能绕过FSP封装的固定延迟逻辑。Stack Size Allocation → CTSU StackFSP自动生成的CTSU任务栈是1024字节够跑demo但不够跑量产。CTSU中断服务程序ISR里要处理采样、滤波、阈值判断、状态机跳转还要预留空间给FSP的回调函数指针。我在RA6M5上实测当同时启用8个触摸按键1个滑条时栈溢出发生在第37次触摸事件。解决方案是在FSP的“Stack Size”栏手动改成2048并在生成的ctsu_cfg.h里确认CTSU_CFG_STACK_SIZE宏定义同步更新。提示FSP生成的代码里所有以g_ctsu_开头的全局变量如g_ctsu_instance,g_ctsu_cfg都是强符号。如果你在应用层自己定义同名变量链接时不会报错但运行时会覆盖FSP的配置结构体——这是个静默崩溃陷阱调试器都抓不到。2.2 QE的真相一个寄存器位图的可视化翻译器QEQuick-Connect Environment常被误认为是“图形化IDE”其实它连编译器都不是。它的本质是一个基于XML描述文件的寄存器位映射工具。当你打开QE的CTSU配置页看到的每一个滑块、复选框、下拉菜单背后都对应着RA芯片手册里某一页的某个寄存器字段。比如“Scan Mode”下拉框的三个选项Single, Multi, Self实际修改的是CTSU_CSSR寄存器的CSSR[1:0]位而“Number of Channels”输入框改的是CTSU_CTRT寄存器的CTRT[7:0]字段。这就引出QE最致命的局限它不验证参数组合的物理可行性。你可以把“Number of Channels”设成64QE照生成但RA6M5的CTSU硬件只支持最多32个通道CTSU0~CTSU31超出部分在运行时直接读回0值。更隐蔽的是时序冲突——当“Sampling Clock Divider”设为1即不分频而“Scan Cycle”又设成1000时QE不会警告你此时单次扫描耗时1000×(1/PCLKB)若PCLKB60MHz则耗时16.7μs但CTSU硬件要求最小扫描周期为20μs低于此值会导致电荷积分不充分数据全飘。所以QE的正确用法不是“点完就编译”而是“点完查手册”。我的标准流程是在QE里完成初步配置点击“Generate Code”但不关闭QE窗口打开RA6M5硬件手册R01UH0886EJ0100翻到“28. Capacitive Touch Sensing Unit (CTSU)”章节对照QE生成的ctsu_user_config.h头文件逐行核对每个宏定义对应的寄存器地址和位域特别检查时序相关参数CTSU_CFG_PCLK_DIVIDER采样时钟分频、CTSU_CFG_SCAN_CYCLE扫描周期、CTSU_CFG_NUM_CHANNELS通道数三者是否满足手册Table 28.12的约束公式。注意QE生成的ctsu_user_config.h里所有#define CTSU_CFG_XXX宏都是编译期常量。如果你想在运行时动态调整灵敏度比如根据环境湿度自动补偿不能改这些宏而要调用g_ctsu_instance.p_api-parameterSet()接口——这个细节FSP文档里提都没提全靠翻瑞萨的GitHub示例代码才挖出来。2.3 FSP与QE的耦合点生成代码里的三处“暗门”FSP和QE的协同不是松耦合而是深度绑定。QE生成的配置代码会被FSP的构建系统自动注入到初始化流程中。但这个注入过程有三处关键“暗门”不掌握就等于没通关暗门一ctsu_init()函数的执行时机FSP生成的R_CTSU_Open()函数内部会调用ctsu_init()来加载QE配置的参数。但这个调用发生在hal_entry()之后、main()之前。这意味着如果你在main()里想修改QE配置的某个参数比如动态调高滑条灵敏度必须先调用g_ctsu_instance.p_api-close()再调用g_ctsu_instance.p_api-open()重新初始化——而open()内部又会再次执行ctsu_init()覆盖你之前的手动修改。破解方法是在main()开头就调用R_CTSU_Open()然后立刻用g_ctsu_instance.p_api-parameterSet()覆盖关键参数最后再启动扫描。暗门二g_ctsu_callback函数指针的注册逻辑QE生成的代码里g_ctsu_callback是一个全局函数指针指向你在FSP里配置的回调函数。但FSP默认把它初始化为NULL只有当你在FSP的CTSU配置页勾选了“Enable Callback Function”并指定了函数名生成的代码才会在R_CTSU_Open()里执行g_ctsu_callback your_callback_func;。很多新手漏掉这一步结果触摸事件发生了但回调函数 never 被调用——调试器里看g_ctsu_callback值一直是0x00000000。暗门三ctsu_user_config.h的包含顺序这个头文件必须在fsp_cfg.h之后、r_ctsu.h之前被包含。因为r_ctsu.h里定义的结构体依赖fsp_cfg.h里的类型定义而ctsu_user_config.h里的宏又会被r_ctsu.h里的内联函数引用。如果包含顺序错了编译会报一堆“unknown type name”的错误。KEIL环境下这个顺序由FSP的.cproject文件控制但如果你手动添加了新源文件就得自己检查#include顺序。3. 触摸方案核心实现从寄存器配置到用户体验的完整链路3.1 CTSU硬件初始化绕过FSP封装的底层操作FSP生成的R_CTSU_Open()函数看似完整但为了达到工业级触摸性能必须在它之后插入三段手动寄存器操作。这不是炫技而是补足FSP为兼容性牺牲掉的关键控制权。第一步重置CTSU模拟前端AFEFSP的R_CTSU_Open()只做了数字部分初始化没碰模拟开关。RA6M5的CTSU AFE有个隐藏状态机如果上电后没执行软复位首次扫描可能读到随机噪声。手动操作如下// 在R_CTSU_Open()成功返回后立即执行 CTSU-CTSUCR0_b.CTSUEN 0; // 关闭CTSU __NOP(); __NOP(); __NOP(); // 等3个周期 CTSU-CTSUCR0_b.CTSUEN 1; // 重新使能 while(CTSU-CTSUCR0_b.CTSUST 0); // 等待就绪这段代码必须插在R_CTSU_Open()之后、R_CTSU_ScanStart()之前。我遇到过客户产线批量不良现象是10%的板子首次上电触摸无反应加了这三行后100%解决。第二步配置CTSU时钟分频器CTSUCLKDIVFSP只允许你选“PCLKB分频比”但CTSU内部还有一个二级分频器CTSUCLKDIV它决定最终施加到CTSU比较器上的时钟频率。这个值直接影响信噪比SNR分频比越大采样时钟越慢电荷积分越充分SNR越高但太慢又会导致扫描周期超限。RA6M5手册推荐值是CTSUCLKDIV 3即PCLKB/4。手动配置代码CTSU-CTSUCR1_b.CTSUCLKDIV 3; // 设置内部时钟分频 CTSU-CTSUCR1_b.CTSUSST 1; // 启用SSTSample and Hold注意CTSUSST位必须设为1否则CTSU工作在“连续采样”模式无法实现精确的电荷转移控制。第三步设置CTSU扫描触发源FSP默认用软件触发CTSU-CTSUCR0_b.TRIGEN 0但工业场景要求确定性时序。我们改用GPT定时器触发// 假设GPT0已配置为10kHz周期中断 CTSU-CTSUCR0_b.TRIGEN 1; // 使能外部触发 CTSU-CTSUCR0_b.TRIGSEL 0x02; // 选择GPT0作为触发源查手册Table 28.9 GPT0-GTSTR_b.STR0 1; // 启动GPT0计数这样做的好处是触摸扫描完全脱离CPU调度即使FreeRTOS任务切换卡顿扫描周期依然精准稳定。我在电梯控制面板项目里用这招把触摸响应抖动从±15ms压到了±0.3ms。3.2 QE参数精调从“能用”到“好用”的五个关键滑块QE界面上有十几个参数滑块但真正影响用户体验的只有五个。我把它们按优先级排序并给出每个参数的物理意义、推荐值范围、以及调错后的典型现象。QE参数名对应寄存器/位物理意义推荐值RA6M5调错现象实测调整技巧SensitivityCTSU_SSDR[7:0]积分时间单位CTSUCLK周期120~180过低触摸不响应过高环境温漂大每±10响应延迟变化约1.2ms建议先设150再根据PCB走线长度微调Noise Filter LevelCTSU_NFCTL[2:0]数字滤波器阶数1~7阶FIR3~5过低50Hz干扰明显过高滑条拖动卡顿阶数每1处理延迟1采样周期工厂环境选4实验室选3ThresholdCTSU_THRESH[15:0]触摸判定阈值原始AD值800~1500过低误触发过高需用力按必须配合Baseline使用先调Threshold再调Baseline使其稳定在2000±50Baseline Update RateCTSU_BSDR[7:0]基线更新速率单位扫描周期64~256过低基线跟不上环境变化过高触摸时基线乱跳温度每变化1℃基线漂移约3~5点空调房选128车间选64Debounce CountCTSU_DEBNC[7:0]去抖计数单位扫描周期4~12过低按键抖动过高长按响应慢机械按键选8电容触摸选4RA6M5上超过12会导致中断丢失实操心得不要在QE里一次性调完所有参数。我的标准流程是先调Sensitivity到150让触摸能响应再调Threshold到1000确保空闲时不误触发然后开启Baseline Update Rate128观察1分钟基线波动最后用手指匀速滑动滑条看Noise Filter Level设为4时是否平滑——如果还有跳变再微调Sensitivity±5而不是盲目加大滤波阶数。3.3 滑条Slider线性度校准绕过QE的纯手工方案QE提供了“Slider Calibration”按钮但点完它只生成一个空的slider_calibrate()函数框架真正的校准逻辑要你自己写。RA6M5的滑条不是简单的ADC值线性映射而是基于电荷转移比率Charge Transfer Ratio的非线性计算。官方算法AN1234要求你采集滑条两端CH0, CH7和中间CH3, CH4四个通道的原始值然后用二次多项式拟合。但实测发现这个算法在PCB走线不对称时误差高达±15%。我用的工业级校准方案分三步走第一步硬件基准点标定在滑条PCB上用激光打标机刻出三个物理基准点0%位置左端、50%位置中心、100%位置右端。用高精度LCR表测量这三个点对地的等效电容值C0、C50、C100。记录下来这是后续软件校准的黄金标准。第二步软件采集与归一化在固件里让滑条连续扫描100次取每个通道CH0~CH7的平均值得到数组raw[8]。然后计算“电荷比率”uint16_t ratio[8]; for(int i0; i8; i) { ratio[i] (raw[i] * 1000) / (raw[0] raw[7]); // 归一化到0~1000范围 }注意这里不用原始值而用比率是为了消除环境温漂的影响。第三步分段线性插值Piecewise Linear Interpolation不采用官方的二次拟合而是用三段直线0%~33%区间用CH0和CH2的比率值拟合直线33%~66%区间用CH2和CH5的比率值拟合直线66%~100%区间用CH5和CH7的比率值拟合直线最终位置计算if(ratio_sum ratio[2]) { pos map(ratio_sum, ratio[0], ratio[2], 0, 333); // 0~33.3% } else if(ratio_sum ratio[5]) { pos map(ratio_sum, ratio[2], ratio[5], 333, 666); // 33.3~66.6% } else { pos map(ratio_sum, ratio[5], ratio[7], 666, 1000); // 66.6~100% }其中ratio_sum ratio[0]ratio[1]...ratio[7]。这个方案在RA6M5上实测线性度误差≤±0.8%远优于官方算法的±3.5%。3.4 多通道同步扫描RA6M5特有的硬件加速技巧RA6M5的CTSU支持“Multi-Channel Scan Mode”可以同时扫描多个通道把8个按键的扫描时间从8×T压缩到1×T。但FSP和QE对此支持极弱——QE界面里根本没有“Multi-Channel”选项FSP生成的代码也只实现了Single模式。要启用Multi模式必须手动改写扫描触发逻辑。核心是配置CTSU_CTRT寄存器的CTRT[7:0]字段让它指向一个“通道掩码表”。具体步骤定义通道掩码数组按扫描顺序const uint8_t g_ctsu_channel_mask[] { 0x01, // CH0 only 0x03, // CH0CH1 0x07, // CH0CH1CH2 0x0F, // CH0~CH3 0x1F, // CH0~CH4 0x3F, // CH0~CH5 0x7F, // CH0~CH6 0xFF, // CH0~CH7 (全通道) };在扫描开始前动态写入CTRTCTSU-CTRT g_ctsu_channel_mask[scan_index]; // scan_index0~7 R_CTSU_ScanStart(g_ctsu_instance);在CTSU中断服务程序里解析CTSU-CTSUSO0到CTSU-CTSUSO7寄存器每个寄存器的低8位是对应通道的原始值。这个技巧让RA6M5的8键扫描时间从12.8msSingle模式降到1.6msMulti模式为UI动画留出了充足的CPU时间。但要注意Multi模式下各通道的采样是时间分片的不是真正并行所以相邻通道间仍有微弱串扰。我的解决方案是在PCB布局时把高灵敏度按键如电源键单独放在一组低灵敏度按键如菜单键放在另一组用不同的scan_index分时扫描。4. 常见问题与排查技巧实录产线工程师的救命清单4.1 触摸无响应从电源到时钟的七层排查法这是最常被问的问题但90%的案例不是代码bug而是硬件或配置疏漏。我按OSI模型类比整理出七层排查法从物理层开始逐层向上Layer 1 物理层PCB检查触摸电极铜箔宽度RA6M5要求最小线宽≥0.2mm我见过客户用0.15mm线宽导致阻抗过高电荷无法有效耦合检查电极与地平面间距必须≥0.5mm否则寄生电容过大信噪比崩塌检查覆盖层厚度亚克力盖板超过3mm时灵敏度下降50%需同步调高Sensitivity值。Layer 2 电源层测量VCCQCTSU专用电源纹波必须10mVpp否则比较器误翻转。RA6M5的VCCQ引脚P14必须接独立LDO不能和VCC共用检查去耦电容VCCQ引脚旁必须放0.1μF10μF陶瓷电容且10μF电容要离IC引脚2mm。Layer 3 时钟层用示波器测PCLKB频率必须稳定在60MHz±0.5%我遇到过晶振负载电容焊错导致PCLKB为58.3MHzCTSU扫描周期失准检查CTSUCLKDIV寄存器值必须为3见3.1节FSP生成代码里常被忽略。Layer 4 初始化层在R_CTSU_Open()返回后立即读CTSU-CTSUCR0确认CTSUEN1且CTSUST1读CTSU-CTSUSO0首次扫描后该寄存器值应500空闲状态若为0或接近0说明AFE未上电。Layer 5 配置层检查ctsu_user_config.h里CTSU_CFG_NUM_CHANNELS是否≤32检查CTSU_CFG_SCAN_CYCLE是否≥20单位CTSUCLK周期。Layer 6 中断层查NVIC寄存器ICPR[0]确认CTSU中断未被挂起在CTSU ISR里加LED闪烁证明中断能进入排除优先级配置错误。Layer 7 应用层检查g_ctsu_callback是否为NULL在回调函数第一行加__BKPT(0)用调试器确认是否被调用。产线快速诊断法拿万用表二极管档红表笔接地黑表笔依次点触每个触摸电极焊盘。正常应显示0.5~0.7VESD二极管压降若显示OL说明电极开路若显示0.0V说明短路到地。4.2 触摸漂移温漂、湿漂、时漂的三重对抗策略漂移是触摸方案的慢性病症状是上午校准好的阈值下午就误触发。根源在于CTSU的基准电压VREFH随温度变化以及PCB表面水汽改变电极介电常数。温漂对策-40℃~85℃RA6M5的VREFH温漂系数是±30ppm/℃即温度每变10℃基准电压偏移0.03%对应原始值漂移约6点。我的补偿方案是在main()里启动一个1Hz的温度采样任务用内置温度传感器建立温度-基线偏移查表const int16_t temp_comp_table[13] { // -40℃到80℃步进10℃ -72, -42, -12, 18, 48, 78, 108, 138, 168, 198, 228, 258, 288 }; int8_t current_temp R_TempSensor_Read(); int8_t index (current_temp 40) / 10; if(index 0) index 0; if(index 12) index 12; g_baseline_offset temp_comp_table[index];然后在基线更新逻辑里把g_baseline_offset加到当前基线上。湿漂对策RH 30%~90%湿度影响更大RH每10%电极电容1.2pF原始值25点。对策是在PCB上贴一片吸湿硅胶如Blue Gel并用NTC热敏电阻监测其温度——硅胶吸湿会放热温度微升0.3℃这个信号比湿度传感器更快。我用这个原理做了个简易湿度计精度±5%RH。时漂对策长期稳定性电解电容老化会导致VCCQ缓慢下降。对策是每天凌晨2点让MCU进入低功耗模式10秒利用RTC唤醒后执行一次全通道基线重校准。代码里加个标志位g_daily_calibrate在R_RTC_CalendarGet()返回时间后判断。4.3 QE生成代码编译失败KEIL环境下的五个致命陷阱用KEIL开发RA项目QE生成的代码常报各种诡异错误。以下是高频陷阱及解法Trap 1undefined symbol g_ctsu_instance原因KEIL的Options for Target → C/C → Define里没加BSP_CFG_ENABLE_CTSU1。FSP的条件编译宏必须显式定义QE生成的代码才包含CTSU实例。Trap 2expected a ;inctsu_user_config.h原因QE生成的头文件里有中文注释如“// 灵敏度设置”KEIL默认编码是GBK而FSP要求UTF-8。解决方案右键ctsu_user_config.h→Properties→Text file encoding→ 改为UTF-8。Trap 3L6218E: Undefined symbol xxxxxx是CTSU函数原因KEIL的Options for Target → Target → Library里Use MicroLIB被勾选了。MicroLIB不兼容FSP的C风格API。必须取消勾选改用Full LIB。Trap 4Error: #137: expression must be a modifiable lvalue出现在g_ctsu_instance.p_api-open()调用处。原因KEIL的C/C → Optimization等级设为Level 3编译器把g_ctsu_instance优化成常量。解决方案在ctsu_cfg.c文件属性里Optimization设为Level 0。Trap 5Error: L6218E: Undefined symbol __aeabi_memclr4这是ARM软浮点库缺失。解决方案在Options for Target → Linker → Libraries里添加--library_typefull并确保ARM Compiler版本≥6.16。最后提醒KEIL环境下RA6M5的Flash编程算法必须选Renesas RA6M5 Flash Programming Algorithm不能用通用ARM算法否则烧录后CTSU无法工作——这个坑我踩了三次才记住。4.4 RA6M5特有问题引脚复用冲突与E2Lite调试器的隐藏限制RA6M5的CTSU通道CTSU0~CTSU31和GPIO引脚是复用的但不是一一对应。比如CTSU0可以映射到P001或P101但P001同时又是SWDIO引脚。这就带来两个现实问题问题一调试与触摸引脚冲突当CTSU0映射到P001时你用E2Lite调试器连接SWDIO和CTSU0信号打架触摸数据全乱。解决方案在FSP的Pin Configurator里把P001的Function设为SWDIO然后在QE里把CTSU0映射到P101——虽然多走2cm线但避免了信号冲突。问题二E2Lite的CTSU时钟干扰E2Lite调试器在SWD通信时会向目标板注入高频噪声20~30MHz恰好落在CTSU采样频带内。现象是断开E2Lite触摸完美一连上误触发率飙升。我的应对方案在R_CTSU_Open()之后插入一段屏蔽代码// 屏蔽E2Lite噪声 CTSU-CTSUCR0_b.CTSUEN 0; __NOP(); __NOP(); CTSU-CTSUCR0_b.CTSUEN 1; // 等待3个稳定周期 for(volatile int i0; i3000; i);这段代码让CTSU在E2Lite握手完成后再重新初始化AFE避开噪声峰值。另外E2Lite的供电能力有限RA6M5的VCCQ1.8V必须由板载LDO提供不能从E2Lite取电否则VCCQ纹波超标触摸失效。这是瑞萨FAE文档里都没写的细节全靠实测撞出来的。5. 实战经验总结从项目交付到量产落地的血泪教训最后分享几个没写在任何手册里但决定项目成败的经验经验一触摸PCB必须做“三明治结构”不要用单层铜箔做电极。我的标准是顶层电极0.2mm线宽→ 0.5mm FR4介质 → 底层铺满地平面。这样做的好处是地平面作为屏蔽层把电极电容稳定在2.1±0.05pF而单层结构电容在1.8~2.5pF之间漂移。这个细节让客户量产直通率从82%提升到99.6%。经验二QE的“Calibration”按钮永远不要信它生成的校准代码只做了一次静态采样而工业环境要求动态基线跟踪。我写的校准函数会在每次触摸事件后用过去100次扫描的基线均值更新当前基线并加入温度补偿因子。代码只有12行但让产品通过了IEC 61000-4-3辐射抗扰度测试。经验三RA6M5的CTSU不能省掉外部RC滤波FSP文档说“内部滤波足够”但实测在变频器附近没有外部RC滤波的板子触摸误触发率是加了RC的7倍。我的方案是在每个CTSU引脚串联10Ω电阻并对地接100pF电容——这个RC值是用网络分析仪扫出来的谐振点不是随便选的。经验四量产测试必须用“手指模型”不能只用金属探针测试。我用3D打印了一个硅胶手指模型邵氏硬度30A内部嵌入NTC和湿度传感器模拟真实人体参数。用这个模型测出的灵敏度和用户实测吻合度达98%而金属探针只有65%
返回列表