1. 项目概述与核心价值
在嵌入式系统开发,尤其是那些需要人机交互的设备中,模拟信号的处理一直是个既基础又关键的环节。无论是触摸屏上手指滑过的轨迹,还是麦克风捕捉到的语音信号,都需要一个可靠的“翻译官”将连续的物理世界信号,转换为微控制器能理解的数字语言。摩托罗拉(后为飞思卡尔)的MC68SZ328微控制器内置的模拟信号处理器模块,就是这样一个设计精良的“翻译官”。它不是简单地将ADC(模数转换器)集成进去,而是围绕触摸屏和语音处理这两个典型应用场景,构建了一套高度集成、硬件自动化的解决方案。我接触过不少早期的PDA、工业手持终端项目,其中很多都基于类似MC68SZ328的架构,其ASP模块的设计思路在今天看来依然充满智慧——它通过硬件逻辑最大限度地分担了CPU的负担,在资源有限的单片机上实现了流畅的触摸响应和稳定的语音采样。理解这个模块,不仅能让你读懂一份二十年前的芯片手册,更能深刻体会到在硬件资源受限时代,工程师们是如何通过精妙的架构设计来平衡性能、功耗和成本的,这种设计哲学对今天的嵌入式开发依然有很强的借鉴意义。
2. ASP模块整体架构与设计思路拆解
2.1 双ADC架构与分工哲学
MC68SZ328的ASP模块最核心的特征是其双ADC架构。这并非简单的资源堆砌,而是基于应用场景的精准划分。
Pen ADC(笔输入ADC):这是一个16位分辨率、8位精度的ADC,专门服务于触摸屏输入。它的设计目标非常明确:低延迟、可预测的周期性采样。触摸笔的移动轨迹需要被连续、等间隔地捕捉,任何采样时间上的抖动都会导致笔画不连贯。因此,Pen ADC配备了深度为12x16位的专用FIFO,并支持硬件自动采样模式。一旦配置好采样率,ADC便会按照预设节奏(如200Hz)自动循环采样X、Y坐标(以及可能的U通道外部信号),并将数据压入FIFO,完全无需CPU干预。只有当FIFO半满或全满时,才通过中断通知CPU来批量读取数据。这种“生产-消费”模型极大地降低了软件轮询的开销,让CPU可以腾出时间处理更复杂的UI逻辑或业务代码。
Enhanced ADC(增强型ADC):同样是16位分辨率、8位精度,但它的定位是语音处理或第二路通用ADC。语音信号对采样率的稳定性有严格要求(通常为8kHz),因此这个ADC固定工作在8.29 kHz的采样率上。它拥有一个8x16位的独立FIFO。这种分离设计的好处是隔离了不同速率的数据流。想象一下,如果触摸数据和语音数据混在同一个FIFO里,软件解析起来会非常麻烦,而且两者的数据率和重要性也不同。触摸数据需要实时处理以保证笔迹跟手,而语音数据则更注重连续性和完整性。双ADC加双FIFO的架构,从硬件层面就实现了数据流的隔离和并行处理。
设计启示:这种根据数据特性和实时性要求,用专用硬件通道处理特定任务的思想,是嵌入式系统优化的精髓。即使在今天,面对复杂的传感器融合场景,我们依然会采用类似的思路,为不同传感器分配专用的DMA通道或硬件加速器。
2.2 触摸屏开关电路:四线电阻屏的“指挥官”
ASP模块集成了触摸屏开关电路,这是它能显著降低软件复杂度的另一个关键。四线电阻式触摸屏由两层透明的电阻膜组成,需要外部电路来控制哪一层提供电压梯度,哪一层用于测量。
模块内部的开关电路由8个晶体管开关(SW1-SW8)构成,如图11-2和图11-3所示。通过配置ASP控制寄存器中的SW[8:1]位,可以精确控制这些开关的导通与关断,从而形成不同的测量回路:
- 测量X坐标:将SW[8:1]设置为
1100 0110。此时,给X+(X1)和X-(X2)电极施加电压,形成水平方向的电压梯度,然后从Y+(Y1)电极测量电压,其值即对应触摸点的X坐标。 - 测量Y坐标:将SW[8:1]设置为
0011 1001。此时,给Y+和Y-电极施加电压,形成垂直方向的电压梯度,从X+电极测量电压,得到Y坐标。 - 空闲状态:设置为
0010 0000,此时所有驱动电压关闭,仅保留一个上拉电阻用于检测笔触(TOUCH_INT)中断。 - 自动归零(Auto-Zero):设置为
0000 0000,将所有输入短接到地,用于测量ADC本身的零点偏移,后续采样值可以减去这个偏移以提高精度。
最关键的是,这个开关切换过程可以由硬件状态机自动完成。当开启自动采样(AUTO=1)时,ASP内部的“开关控制与输入选择逻辑”单元会像导演一样,按照设定的剧本(如X->Y->U->X...)自动切换开关配置、启动ADC采样、存储结果。软件只需要在开始时写好“剧本”(配置寄存器),然后等待数据准备好的通知即可。这彻底把软件从繁琐、时序要求严苛的开关控制、ADC触发循环中解放了出来。
2.3 中断系统的精细化设计
ASP模块的中断生成器提供了四个独立的中断源,体现了精细化的中断管理思想:
- TOUCH_INT:笔触中断。当触摸笔按下,将X1引脚拉低时触发。这是系统从休眠中被唤醒,开始准备采样流程的起点。
- COMP_INT:笔尖抬起中断。用于通知系统一次完整的笔画已经结束,可以停止采样或进行笔迹识别等后处理。
- PEN_DATA_INT:笔数据中断。由两个条件触发:a) Pen Sample FIFO中有至少一组有效数据(PDR);b) Pen Sample FIFO已满(PFF)。这给了软件灵活性,可以设置数据一到就中断(低延迟),或者等攒够一批数据再中断(高效率)。
- ENHANCED_ADC_INT:增强ADC中断。当EADC FIFO满时触发,用于语音数据的块传输。
这种设计允许软件为不同事件分配不同的优先级和处理例程。例如,TOUCH_INT可以连接到一个高优先级中断,用于快速启动采样;而PEN_DATA_INT可以连接到一个较低优先级的中断或由主循环轮询,用于处理已经缓存好的轨迹数据。
3. Pen ADC操作模式与采样率深度解析
3.1 操作模式:从手动到全自动
Pen ADC的操作模式由AUTO、PADE、MOD[1:0]和AZE这几个关键位组合控制,如表11-2所示。这几种模式覆盖了从调试到量产的所有场景。
手动模式(AUTO=0):在此模式下,每次采样都需要软件手动将PADE位从0切换到1来触发一次转换。这通常用于系统调试、校准或单次测量。例如,在工厂校准阶段,工程师可以用手动模式分别测量屏幕四个角的坐标,来计算校准参数。
自动模式(AUTO=1):这是正常使用时的标准模式。一旦使能,ADC便会根据MOD[1:0]和AZE的设置,无限循环地进行采样序列。
MOD[1:0]=01:仅采样X和Y通道。若AZE=0,序列为X, Y, X, Y...;若AZE=1,序列为AZ, X, Y, AZ, X, Y...,每次测量坐标前都先进行一次自动归零,以消除温漂和偏移误差,适合高精度场合。MOD[1:0]=10:采样X, Y和外部U通道。这是最常用的触摸+额外传感器模式。AZE=1时序列为AZ, X, Y, U, AZ, X, Y, U...。这里的U通道采样时间隙被巧妙地用于笔尖抬起检测,后文会详述。MOD[1:0]=11:仅采样U通道。此时可以将Pen ADC作为一个独立的、最高速(可达6.579kHz)的通用ADC使用,用于采样其他模拟传感器。
3.2 采样率计算:不仅仅是公式
采样率的配置是平衡数据新鲜度、功耗和系统负载的关键。手册中给出���不同模式下的输出数据率公式(表11-3),但理解其背后的时钟树更为重要。
Pen ADC的采样时钟路径如下:系统时钟(如16.58MHz)->PADC_CLK分频器->ACLK(模拟时钟,最大12MHz)->/1260(固定抽取滤波器)->fclk(核心采样时钟)
以系统时钟16.58MHz,PADC_CLK[4:0]=0x01(二分频)为例:ACLK = 16.58MHz / 2 = 8.29MHzfclk = ACLK / 1260 ≈ 6.579kHz这个fclk是ADC转换器能够完成一次转换的最高速率。但实际输出到FIFO的数据率(Output Data Rate)还受到三个可编程参数的影响:
- DSCNT(数据建立计数):开关切换后,模拟信号需要时间稳定。这个参数就是给信号留的“冷静期”。对于X/Y通道,由于触摸屏和模拟开关的RC时间常数,DSCNT必须至少为1。对于纯U通道,可以设为0。
- DMCNT(抽取计数):控制第二级FIR滤波器的抽取比(1-8)。增大此值可以提高信噪比,但会降低有效采样率。
- IDLECNT(空闲计数):在一次采样序列完成后,插入的额外空闲时钟数。这是调节输出数据率最主要、最灵活的手段,也是实现低功耗的关键。在两次采样之间让ADC和部分电路进入空闲状态,可以显著降低平均功耗。
举例:如何配置得到200Hz的触摸采样率?假设我们需要在MOD[1:0]=10(X,Y,U模式),AZE=1(使能自动归零)下,让每个通道(X, Y, U)的数据率都达到200Hz。 查表11-3,对应公式为:输出数据率 = fclk / [4 * (DSCNT+DMCNT+1) + IDLECNT]假设我们设置DSCNT=1(最小值),DMCNT=7(最大抽取比8,以提高抗噪性),fclk=6.579kHz。 代入公式:200Hz = 6579Hz / [4*(1+7+1) + IDLECNT]解得:IDLECNT ≈ 17因此,配置DSCNT=1,DMCNT=7,IDLECNT=17,即可让每个通道以约200Hz的速率输出数据。这意味着每5ms就能得到一组新的(X, Y, U)数据,对于大多数手写输入应用已经足够流畅。
实操心得:在项目初期,可以先将
IDLECNT设小,获得最高采样率进行测试,评估系统性能和CPU负载。然后逐步增大IDLECNT,在满足响应速度的前提下,找到功耗最低的平衡点。切忌盲目追求高采样率,过高的数据率会频繁中断CPU,增加系统功耗,而带来的体验提升可能微乎其微。
4. 笔尖抬起检测的硬件实现与软件策略
笔尖抬起(Pen Up)检测是触摸输入中的一个经典难题。软件轮询IO口状态不仅浪费CPU资源,还可能因为响应不及时而漏检。MC68SZ328的ASP模块提供了一种巧妙的硬件解决方案。
4.1 检测原理:利用U通道采样间隙
其核心思想如图11-5所示。在自动采样模式(XYU或AZXYU)下,硬件在U通道的采样时间隙里,会自动将开关配置切换到空闲状态(SW[8:1] = 0010 0000)。在这个状态下,X1引脚通过一个内部上拉电阻连接到QVDD。
- 笔尖按下时:触摸笔将X1引脚与地(GND)接通,
TOUCH_INT信号为低电平。 - 笔尖抬起时:X1引脚被上拉电阻拉高,
TOUCH_INT信号变为高电平。
硬件会在每个U通道采样周期内,检测TOUCH_INT信号的电平。一旦检测到高电平(笔尖抬起),且笔尖抬起中断使能(PUIRQE=1),就会产生COMP_INT中断。
4.2 处理延迟与数据有效性
手册图11-6和图11-7揭示了笔尖抬起检测的一个关键时序问题:物理延迟。由于触摸屏和上拉电阻构成的RC电路,X1引脚从低到高的上升过程需要大约5ms。而U通道的采样窗口可能只有1ms左右。
这就导致了两种可能的情况:
- 笔尖在当前U采样周期开始时抬起。由于上升时间(5ms)远大于采样窗口(~1ms),本次U周期内可能检测不到上升沿,需要等到下一个U周期才能确认笔尖抬起。
- 笔尖在当前U采样周期结束后、下一个U周期开始前抬起。这样在下一个U周期就能可靠检测到。
因此,从笔尖实际离开屏幕,到硬件产生COMP_INT中断,可能会有最多一个完整采样周期(X-Y-U)的延迟。对于200Hz的采样率,这个周期是15ms(5ms per channel * 3)。这个延迟对于用户体验(如笔迹尾部的“小尾巴”)是需要注意的。
更重要的影响是数据有效性:在笔尖抬起动作发生前最后一个采样周期里采集的X、Y坐标,可能是在笔尖已经部分离开或接触不稳定的状态下采样的,这些数据是不可靠的。
软件处理策略:因此,软件在收到
COMP_INT中断后,不能简单地处理FIFO中的所有数据。一个稳健的做法是:丢弃FIF中最后完整的一组(X, Y)数据。例如,如果采样模式是X,Y,U,那么收到笔尖抬起中断后,应该丢弃最后一次采样的X和Y值。这样可以避免在笔迹末尾出现一个“飞点”或错误的笔画终点。在驱动程序中,这通常通过维护一个比FIFO深度稍大的软件缓冲区,并在收到抬起中断后回退一个数据点来实现。
5. 自动归零与自动校准配置详解
5.1 自动归零:消除系统误差
任何ADC都存在零点误差和温漂。自动归零功能就是用来测量并抵消这个系统误差的。当AZE=1时,在每次测量X或Y坐标之前,硬件会先将开关配置为0000 0000(所有输入端短接到地),进行一次ADC转换,得到一个“零点读数”(AZ值)。
随后测量到的真实坐标值(X或Y),在软件处理时应该减去这个AZ值:坐标真值 = 采样值 - AZ值。这个过程由硬件自动插入到采样序列中(如AZ, X, Y, AZ, X, Y...),软件只需要按顺序读取FIFO中的数据并做减法即可。这能有效消除由ADC内部偏移、参考电压波动等引起的共模误差,特别是在电池供电设备中,随着电压缓慢下降,自动归零能保持坐标读数的长期稳定性。
5.2 自动校准:扩展动态范围
自动校准(ACE=1)是一个更高级的功能,用于在AZ,X,Y自动模式下优化测量。它与普通模式的区别在于测量X和Y时的开关配置:
- 普通模式:测X时
SW[8:1]=1100 0110,测Y时SW[8:1]=0011 1001。 - 自动校准模式:测X时
SW[8:1]=1100 1100,测Y时SW[8:1]=0011 0011。
这种配置的改变,实际上改变了触摸屏驱动和测量回路的电阻网络。其目的是让ADC在测量X和Y坐标时,能读到更接近其满量程的值。在普通模式下,由于触摸屏本身的分压,ADC读到的电压范围可能只占其量程的一部分。自动校准模式通过调整开关,试图将触摸屏产生的电压范围“拉伸”到更接近ADC的参考电压范围,从而提高ADC的有效分辨率和信噪比。
手册中提到,此模式下得到的X、Y值是“该样本中X和Y的最大值”,而AZ值是最小值。这里的“最大值”和“最小值”指的是在一次自动校准的测量周期内,ADC输出的原始码值范围。软件可以利用这个信息进行动态的缩放校准。这个功能通常用于出厂前的系统级校准,或者在检测到坐标读数范围异常时进行动态调整,以补偿触摸屏老化或环境变化的影响。
6. 增强型ADC与语音处理应用
增强型ADC(EADC)是一个相对独立的子系统,其核心是一个固定采样率为8.29kHz的16位ADC。这个频率是早期语音编解码(如G.711)的标准采样率8kHz的近似值(由16.58MHz系统时钟分频得到)。
6.1 操作特点
- 独立FIFO:深度为8x16位。对于8kHz单声道语音,这只能缓存1ms的数据,因此必须依赖频繁的中断或DMA来清空FIFO,否则会迅速溢出。
- 专用控制:拥有独立的使能位(
EADE)、中断使能位(EADFFE)和状态位(EADFF,EOV)。 - DMA支持:
EADMAE位允许在EADC FIFO满时产生DMA请求,这是实现高效、低CPU占用的语音数据搬运的关键。DMA控制器可以直接将FIFO中的数据搬移到内存的环形缓冲区中。
6.2 语音处理链路搭建
一个典型的语音采集链路如下:
- 硬件连接:将麦克风模拟信号通过耦合电容和偏置电路,连接到
AIN引脚(对应EADCP和EADCN差分输入)。 - 软件配置:
- 使能Bandgap(
BGE=1),等待BGR状态位置1。 - 配置EADC控制寄存器,使能EADC(
EADE=1)。 - 使能EADC FIFO满中断(
EADFFE=1)或DMA(EADMAE=1)。
- 使能Bandgap(
- 数据处理:在中断服务程序或DMA完成中断中,从EADC数据寄存器(地址
0xFFFE0220)读取16位数据。注意其有效精度为8位,因此通常取高8位或进行适当的缩放即可。数据为有符号格式,需要根据硬件设计判断是偏移二进制码还是二进制补码。
注意事项:语音信号是交流信号,而ADC输入通常是单端或差分对地电压。必须确保麦克风电路提供的信号在ADC的输入电压范围(0~QVDD)内,并且有合适的直流偏置。通常会在麦克风放大电路输出端添加一个QVDD/2的偏置电压,使交流信号以中间电平为中心摆动。错误的偏置会导致信号削顶(失真)或幅度太小(信噪比低)。
7. 寄存器编程指南与实战配置
理解原理后,最终都需要落实到寄存器配置上。以下是驱动ASP模块进行触摸采样的一个典型初始化序列,我将其称为“四步启动法”。
7.1 第一步:时钟与基础使能
任何模拟电路工作前,都需要稳定的电源和时钟。首先需要使能Bandgap参考源,它是ADC内部所有比较器和放大器的电压基准。
// 假设 ASP_ACNTLCR 寄存器地址为 0xFFFE0210 volatile uint32_t *asp_acntlcr = (volatile uint32_t *)0xFFFE0210; // 1. 使能Bandgap,并等待其稳定 *asp_acntlcr |= (1 << 0); // 设置 BGE=1 // 需要短暂延时,等待Bandgap稳定,通常几个微秒 delay_us(10); // 检查 ASP_ISTATR (0xFFFE021C) 的 BGR 位是否变为1 volatile uint32_t *asp_istatr = (volatile uint32_t *)0xFFFE021C; while(!(*asp_istatr & (1 << 7))); // 等待 BGR=1 // 2. 使能ASP模块时钟 *asp_acntlcr |= (1 << 25); // 设置 CLKE=1为什么先开Bandgap?Bandgap电路启动需要时间,如果先启动ADC而参考电压不稳,最初的采样值将是错误的。先使能并等待稳定是可靠性的保证。
7.2 第二步:配置采样模式与参数
这是核心配置,决定了ADC“如何工作”。
// 3. 配置Pen ADC采样率控制寄存器 ASP_PSMPLRG (0xFFFE0214) volatile uint32_t *asp_psmplrg = (volatile uint32_t *)0xFFFE0214; // 假设我们需要约200Hz每通道,模式为 X,Y,U 自动采样,带自动归零。 // 根据之前计算:DSCNT=1, DMCNT=7, IDLECNT=17, BIT-SELECT=00 (取高16位) uint32_t sample_rate_cfg = 0; sample_rate_cfg |= (7 << 12); // DMCNT[2:0] = 111 (抽取比8) sample_rate_cfg |= (0 << 10); // BIT-SELECT[1:0] = 00 sample_rate_cfg |= (17 << 4); // IDLECNT[5:0] = 10001 (17) sample_rate_cfg |= (1 << 0); // DSCNT[3:0] = 0001 (1) *asp_psmplrg = sample_rate_cfg; // 4. 配置ASP控制寄存器 // 先清除可能的旧配置,然后设置新值 uint32_t ctrl_cfg = *asp_acntlcr; ctrl_cfg &= ~(0xFFFF); // 清除低16位相关控制位 // 设置模式:AUTO=1, MODE[1:0]=10 (X,Y,U), AZE=1 (使能自动归零) ctrl_cfg |= (1 << 14); // AUTO=1 ctrl_cfg |= (2 << 12); // MODE[1:0]=10 (二进制10,即十进制2左移12位) ctrl_cfg |= (1 << 15); // AZE=1 // 注意:此时先不设置 PADE=1 *asp_acntlcr = ctrl_cfg;7.3 第三步:配置中断
决定让硬件在什么情况下“通知”我们。
// 5. 配置中断控制寄存器 ASP_ICNTLR (0xFFFE0218) volatile uint32_t *asp_icntlr = (volatile uint32_t *)0xFFFE0218; uint32_t int_cfg = 0; int_cfg |= (1 << 4); // PIRQE=1,使能笔触中断 int_cfg |= (1 << 3); // PUIRQE=1,使能笔尖抬起中断 int_cfg |= (1 << 0); // PDRE=1,使能笔数据就绪中断(FIFO有数据) // 我们也可以使能FIFO满中断,这里选择数据就绪,响应更快 // int_cfg |= (1 << 1); // PFFE=1,使能FIFO满中断 *asp_icntlr = int_cfg;中断策略选择:PDRE(数据就绪)中断延迟更低,但中断更频繁;PFFE(FIFO满)中断次数少,CPU效率高,但数据延迟可能达到一个FIFO深度的时间。对于实时笔迹,通常选择PDRE。
7.4 第四步:启动采样与中断处理
万事俱备,只欠“使能”。
// 6. 最后,使能Pen ADC,开始自动采样 *asp_acntlcr |= (1 << 1); // 设置 PADE=1 // 7. 在系统中断控制器中,使能来自ASP的TOUCH_INT和PEN_DATA_INT中断线。 // 这部分代码依赖于具体的MCU中断控制器,此处省略。7.5 中断服务程序流程
当TOUCH_INT或PEN_DATA_INT触发时,进入中断服务程序:
void ASP_IRQ_Handler(void) { volatile uint32_t *asp_istatr = (volatile uint32_t *)0xFFFE021C; uint32_t status = *asp_istatr; // 1. 处理笔尖抬起中断 if(status & (1 << 3)) { // PUEN 位被置位 // 清除中断标志 *asp_istatr = (1 << 3); // 写1清除PUEN // 设置标志,通知主程序笔划结束 g_pen_up_flag = 1; // 重要:丢弃FIFO中最后一组无效的(X,Y)数据 // 可以通过读取一次Pen Sample Register但不使用来实现“丢弃” // volatile uint16_t *pen_data_reg = (volatile uint16_t *)0xFFFE0224; // uint16_t dummy = *pen_data_reg; // 读一次,指针前移 // dummy = *pen_data_reg; // 再读一次(假设是X,Y模式) } // 2. 处理笔数据就绪中断 if(status & (1 << 0)) { // PDR 位被置位 // 此位会在读取数据后自动清除 // 循环读取,直到PDR位变为0 volatile uint16_t *pen_data_reg = (volatile uint16_t *)0xFFFE0224; while(*asp_istatr & (1 << 0)) { uint16_t raw_data = *pen_data_reg; // 根据采样序列(AZ,X,Y,U...)解析raw_data // 将解析后的坐标数据存入软件缓冲区 process_pen_data(raw_data); } } // 3. 处理笔触中断(按下) if(status & (1 << 4)) { // PEN 位被置位 // 清除中断标志 *asp_istatr = (1 << 4); // 写1清除PEN // 可以在此处进行一些初始化,如清空软件缓冲区 g_pen_down_flag = 1; reset_pen_buffer(); } // 注意:检查溢出错误 if(status & (1 << 5)) { // POV 位被置位 // Pen FIFO溢出,数据丢失!需要处理错误,可能重启采样 *asp_istatr = (1 << 5); // 写1清除POV handle_overflow_error(); } }8. 常见问题排查与调试技巧实录
即使按照手册配置,在实际硬件调试中依然会遇到各种问题。以下是我在多个项目中总结出的常见故障点及排查手段。
8.1 问题一:无触摸中断或中断频繁误触发
- 现象:触摸屏幕,
TOUCH_INT中断不产生;或者未触摸时,中断频繁发生。 - 排查步骤:
- 硬件检查:首先用万用表测量触摸屏接口X1引脚的对地电阻。未触摸时应为高阻态(上拉至QVDD)。触摸时,X1-X2或Y1-Y2之间应呈现一个较低的电阻(通常几百欧姆)。检查外部上拉电阻(典型100kΩ)是否焊接正确,这是产生中断信号的关键。
- 中断极性配置:检查
ASP_ICNTLR寄存器的POL位。触摸按下时,X1被拉低,因此通常应配置为下降沿或低电平有效(POL=0)。如果配置反了(POL=1),则抬起时产生中断,按下时无中断。 - 触发方式配置:检查
EDGE位。如果配置为电平触发(EDGE=0),则只要笔按下,中断会持续产生。这通常用于唤醒深度休眠的CPU。如果配置为边沿触发(EDGE=1),则只在按下或抬起的瞬间产生一次中断。根据应用场景选择。 - 软件去抖:电阻屏在按下瞬间可能有抖动,导致多次边沿中断。可以在中断服务程序中加入简单的延时去抖(如10-20ms内忽略后续中断)。
8.2 问题二:ADC采样值不稳定或偏差大
- 现象:读取的坐标值跳动大,或者整体偏移,线性度差。
- 排查步骤:
- 电源与参考电压:这是最常见的原因。用示波器测量
QVDD(ASP模拟电源)和GND的纹波。模拟电源的噪声会直接叠加到采样值上。确保电源滤波电容(通常为0.1uF和10uF并联)靠近芯片引脚且接地良好。 - 自动归零:确保
AZE位已使能,并且软件正确执行了采样值 - AZ值的运算。可以在初始化后,连续读取几组AZ值,观察其稳定性。如果AZ值本身跳动大,说明模拟地或参考源不稳定。 - 采样率与建立时间:DSCNT设置过小是导致读数跳动的元凶之一。如果
DSCNT设为0(对于X/Y通道是不允许的),模拟开关切换后信号未稳定就被采样,结果必然不准。务必确保DSCNT >= 1。可以尝试逐步增大DSCNT和DMCNT(牺牲速度换取稳定),观察读数是否变得平滑。 - 触摸屏本身:用专业校准软件或简单的线性测试,检查触摸屏的电阻均匀性。老化的触摸屏四角线性度可能变差,这不是ASP模块能解决的。
- 电源与参考电压:这是最常见的原因。用示波器测量
8.3 问题三:FIFO溢出(POV/EOV置位)
- 现象:
ASP_ISTATR寄存器的POV或EOV位被置1,数据丢失。 - 排查步骤:
- 中断响应速度:这是最主要的原因。检查CPU是否及时响应了
PEN_DATA_INT或ENHANCED_ADC_INT。可能被更高优先级的中断阻塞。优化中断服务程序,只做最必要的数据搬运,将复杂处理放到主循环。 - FIFO深度与采样率:计算数据产生速率和消费速率。例如,Pen ADC在200Hz每通道、X,Y,U三通道模式下,数据产生速率为600组/秒。12深的FIFO最多缓存20ms的数据。这意味着中断服务程序必须在20ms内被调用并清空一次FIFO。如果系统繁忙导致中断延迟超过20ms,就会溢出。考虑提高中断优先级,或改用DMA方式搬运数据。
- DMA配置:对于EADC(语音),强烈建议使用DMA。检查DMA通道是否正确配置,传输完成中断是否正常,目标缓冲区是否足够大。
- 中断响应速度:这是最主要的原因。检查CPU是否及时响应了
8.4 问题四:笔尖抬起检测不准确
- 现象:笔画结束后,末尾有多余的点,或者抬起动作延迟感明显。
- 排查步骤:
- 确认模式:笔尖抬起检测仅在
MOD[1:0]=10(X,Y,U模式)下工作,因为需要利用U通道的采样间隙。确认配置正确。 - 软件后处理:如前所述,硬件检测有延迟。务必在软件中实现“丢弃最后一组数据”的逻辑。这是消除“小尾巴”的最有效方法。
- 上拉电阻:检查原理图中连接到X1引脚的外部上拉电阻(典型100kΩ)是否准确。电阻值过大会导致上升时间变长,延迟更明显;过小则会增加功耗。
- 中断处理顺序:在中断服务程序中,应先处理
PUEN(抬起中断),再处理PDR(数据就绪中断)。因为抬起中断意味着最后一点数据可能无效,如果先处理了数据,再看到抬起标志就晚了。
- 确认模式:笔尖抬起检测仅在
8.5 调试辅助技巧
- 寄存器打印:在初始化关键阶段(如使能Bandgap后、启动ADC前),将所有ASP相关寄存器的值通过串口打印出来,与预期配置对比,能快速发现配置错误。
- 信号测量:如果条件允许,用示波器测量触摸屏的X1, X2, Y1, Y2引脚波形。在自动采样模式下,应能看到周期性的电压驱动脉冲。这能直观验证开关电路是否正常工作。
- 数据可视化:将ADC采样的原始坐标值实时发送到PC,用绘图工具显示轨迹。这是评估采样率、线性度、抖动和抬起检测效果的最直接方法。一个平滑、跟手的轨迹是硬件和软件协同工作良好的最终证明。