i.MX23 LRADC模块深度解析:硬件调度与触摸屏驱动实战

发布时间:2026/6/13 22:58:01

i.MX23 LRADC模块深度解析:硬件调度与触摸屏驱动实战 1. 项目概述从模拟信号到数字世界的桥梁在嵌入式系统开发中我们常常需要处理来自物理世界的模拟信号比如电池电压、温度传感器输出或者一个简单的电阻式触摸屏的触点位置。这些连续的、电压值不断变化的信号对于只认识0和1的处理器来说是无法直接理解的。这时模数转换器ADC就扮演了至关重要的“翻译官”角色。它负责将连续的模拟电压按照一定的精度和速度转换成处理器可以处理的离散数字值。今天我想和大家深入聊聊飞思卡尔现恩智浦i.MX23处理器中一个非常实用且灵活的模块——低分辨率ADCLRADC及其触摸屏接口。这个模块虽然名字叫“低分辨率”但在许多成本敏感、对精度要求并非极致的应用场景中比如便携式设备的电池电量检测、机械按键或触摸按键的检测尤其是四线电阻式触摸屏的坐标采样它绝对是性价比和灵活性的典范。我接触过不少基于i.MX23的方案尤其是在一些需要低成本触控交互的工业HMI或消费电子设备上。很多工程师在初次配置LRADC时往往会被其相对复杂的寄存器结构和灵活的调度机制搞得有点头疼。手册上密密麻麻的位域描述如果只是生搬硬套很容易掉进坑里导致采样数据跳动、触摸响应不灵敏或者功耗异常。这篇文章我就结合自己的踩坑经验把i.MX23 LRADC的核心寄存器配置和采样控制逻辑掰开揉碎了讲清楚特别是如何利用其强大的延迟触发Delay Channel机制来构建高效、可靠的触摸屏采样序列。无论你是正在为项目调试触摸屏驱动还是想深入理解一款MCU的ADC模块设计思路相信接下来的内容都能给你带来实实在在的帮助。2. LRADC整体架构与核心设计思路在深入寄存器细节之前我们得先搞清楚i.MX23 LRADC模块的“脾气秉性”。它不是一个传统意义上简单的、按固定频率轮询所有通道的ADC。它的设计哲学更偏向于“按需调度”和“硬件协同”旨在以最小的CPU干预和功耗完成复杂的、多通道的、有时序依赖的采样任务。2.1 模块核心特性与通道分配i.MX23的LRADC模块集成了一个8通道、12位精度的逐次逼近型SARADC。12位分辨率意味着它能将参考电压范围通常是VDDIO划分为4096个等级对于测量0-3.3V的电压理论分辨率约为0.8mV这对于触摸屏坐标检测通常要求精度在几个像素以内和电池电压监控精度到0.01V来说已经足够。这8个通道CH0-CH7并非完全等同它们有各自预设的输入源CH0-CH5通用的外部模拟输入通道可以连接任何需要采样的模拟信号。CH6固定连接至VDDIO电源电压。这是一个非常巧妙的设计允许系统在不增加外部电路的情况下实时监测供电电压用于电池电量计算或系统电压监控。CH7固定连接至BATT引脚通常用于直接测量电池电压。此外模块内部还集成了两个温度传感器TEMP0/1和一个触摸屏检测比较器。触摸屏检测比较器是一个独立于ADC转换的硬件电路它可以直接监测触摸屏的按压事件通过检测屏体电阻的变化并产生快速中断从而让系统能够从低功耗睡眠模式中被“唤醒”这是实现低功耗触摸待机的关键。2.2 核心设计思路硬件调度器与延迟通道我认为LRADC最精髓的部分在于其内置的硬件调度器和4个延迟通道Delay0-Delay3。这彻底改变了我们驱动ADC的方式。在传统MCU的ADC使用中我们通常这样做配置ADC参数 - 启动一次转换 - 等待转换完成查询或中断 - 读取数据 - 如果需要连续采样再重复启动。这个过程频繁占用CPU效率不高。i.MX23 LRADC的思路是你只需要告诉硬件“做什么”和“什么时候做”剩下的交给硬件自动完成。做什么通过配置各个通道的NUM_SAMPLES采样次数和ACCUMULATE累加使能定义单次触发的采样行为是单次采样还是多次采样累加。什么时候做通过配置延迟通道来定义复杂的触发时序。每个延迟通道就像一个可编程的定时触发器你可以设置一个以2kHz为基准的延迟值DELAY并指定延迟结束后要触发哪些ADC通道TRIGGER_LRADCS和/或其他延迟通道TRIGGER_DELAYS。举个例子实现一个触摸屏的X、Y坐标采样通常需要以下步骤以四线电阻屏为例施加X方向驱动电压测量Y板的电压得到X坐标。施加Y方向驱动电压测量X板的电压得到Y坐标。为了抗干扰每个坐标可能需要采样多次并取平均。如果没有延迟通道你需要用CPU精确地控制每一步的时序打开驱动MOSFET - 等待稳定 - 启动ADC - 等待完成 - 读取数据 - 关闭MOSFET - 切换方向 - 重复... CPU被牢牢绑在这个过程上。而利用LRADC的延迟通道你可以这样设计Delay0触发后延迟T1时间然后触发CH0假设接Y板电压开始采样并同时触发Delay1。Delay1被Delay0触发后延迟T2时间足够CH0完成采样然后关闭X方向驱动打开Y方向驱动并触发Delay2。Delay2被Delay1触发后延迟T3时间让驱动电压稳定然后触发CH1假设接X板电压开始采样。这样你只需要在初始化时配置好这一系列延迟通道的“剧本”然后“踢一脚”Kick启动Delay0整个采样流程就会由硬件自动、精准地执行完毕最后通过中断通知CPU来读取CH0和CH1的结果寄存器即可。CPU在此期间完全可以去处理其他任务或者进入低功耗状态。这种“硬件自动化”的思想对于提高系统效率和实现低功耗至关重要。3. 关键寄存器深度解析与配置实战理解了整体架构我们再来啃寄存器手册这块“硬骨头”。手册里的描述比较零散我会结合实战需求把关键寄存器串起来讲。3.1 控制寄存器3HW_LRADC_CTRL3时钟与模拟电源管理这个寄存器是LRADC的“总开关”和“节拍器”控制着最底层的时钟和模拟部分。// 示例配置LRADC时钟为4MHz高电平时间83.33ns不反转时钟 HW_LRADC_CTRL3_WR(BF_LRADC_CTRL3_CYCLE_TIME(1) | // 01 4MHz BF_LRADC_CTRL3_HIGH_TIME(1) | // 01 83.33ns (当CYCLE_TIME01时有效) BF_LRADC_CTRL3_INVERT_CLOCK(0) | // 0 正常模式 BF_LRADC_CTRL3_DISCARD(1)); // 01 丢弃首次上电后的第1个样本CYCLE_TIME[9:8] HIGH_TIME[5:4]ADC核心时钟配置这是最容易出错的地方之一。CYCLE_TIME选择的是LRADC模块的工作时钟频率2/3/4/6 MHz而采样率是这个频率的1/13。例如选择4MHZ则实际采样率约为4MHz / 13 ≈ 307.7 kHz。这个采样率决定了ADC转换一位所需的时间对于12位SAR ADC单次转换时间大约是13个时钟周期。HIGH_TIME配置的是时钟高电平的持续时间它会影响内部开关电容电路的充电时间。手册中明确指出了约束关系当CYCLE_TIME006MHz时HIGH_TIME只能选00或01。这是因为频率越高留给高电平的时间窗口越短必须选择更短的高电平时间41.66ns或83.33ns以确保电路正常工作。配置心得在满足采样速度要求的提下优先选择较低的频率如2MHz或3MHz可以获得更好的噪声性能。对于触摸屏应用307.7kHz的采样率已经绰绰有余。DISCARD[25:24]样本丢弃策略这是一个非常重要的抗扰设计。ADC的模拟部分在上电瞬间内部电路如采样保持电容需要一段时间达到稳定状态。这段时间内采样的数据是不可靠的。DISCARD位域允许你丢弃前1、2或3个样本。强烈建议在每次启动ADC模拟部分或从低功耗唤醒后至少丢弃1个样本。在触摸屏驱动中我通常设置为丢弃前2个样本DISCARD2以获取更稳定的读数。INVERT_CLOCK[0] DELAY_CLOCK[1]时钟相位调整这两个位用于微调ADC时钟与系统内其他数字电路尤其是DCDC转换器时钟边沿的相对关系。DCDC转换器在开关时会产生较大的电源噪声如果ADC的采样点刚好落在噪声尖峰上就会引入误差。INVERT_CLOCK反转输入到模拟部分的时钟DELAY_CLOCK则插入约400ps的延迟。实战技巧如果你的系统在ADC采样时观察到周期性的、与DCDC开关频率相关的噪声可以尝试设置INVERT_CLOCK1将ADC的转换点移动到数字时钟的下降沿远离DCDC的主要上升沿噪声。这通常比软件滤波更有效。3.2 通道结果寄存器HW_LRADC_CHn采样、累加与状态监控每个ADC通道CH0-CH7都有一个独立的结果寄存器结构完全相同。它不仅仅是存放结果更是一个控制单通道采样行为的“任务单元”。// 示例配置通道0进行4次过采样累加 HW_LRADC_CH0_WR(BF_LRADC_CH0_ACCUMULATE(1) | // 使能累加模式 BF_LRADC_CH0_NUM_SAMPLES(4) | // 累加4次后再产生中断 BF_LRADC_CH0_VALUE(0)); // 清零累加器准备开始VALUE[17:0]转换结果值这是12位的ADC转换结果。但注意在累加模式ACCUMULATE1下这里存放的是N次采样值的和。由于是12位数据最大值为4095累加N次后最大可能值为4095 * N。手册提到当N32时最大累加值可达256K约2^18所以这个字段是18位宽的。关键点软件必须在启动一轮新的累加采样前手动将此字段写0来清除旧的累加值。这是一个常见的遗漏点会导致后续采样数据错误。NUM_SAMPLES[28:24] ACCUMULATE[29]过采样与累加控制这是提升有效分辨率、抑制随机噪声的利器。NUM_SAMPLES设定了在报告“转换完成”中断前需要连续进行多少次采样。如果ACCUMULATE1则这N次采样的结果会被自动累加到VALUE字段中如果ACCUMULATE0则VALUE中只保留最后一次采样的结果但中断仍然在N次采样后产生。过采样原理假设噪声是白噪声通过累加N个样本再求平均可以将信噪比SNR提高10*log10(N)dB等效分辨率也能增加0.5*log2(N)位。例如累加4次N4再除以4求平均理论上可以增加1位有效分辨率从12位到13位。注意事项NUM_SAMPLES设置为0表示单次采样N1。在触摸屏应用中通常设置N4或8进行过采样能有效平滑因触摸压力不均或电源噪声导致的坐标抖动。TOGGLE[31]样本同步状态位这是一个非常实用的调试位。每次该通道完成一次转换注意是完成一次NUM_SAMPLES定义的采样集而不是单个时钟周期这个位就会翻转一次0-1或1-0。软件可以轮询或记录这个位的变化来确认ADC是否按预期的节奏在采样。如果发现TOGGLE位变化的频率远高于或低于预期说明你的调度Delay Channel配置可能有问题或者发生了样本丢失/重复。3.3 延迟通道寄存器HW_LRADC_DELAYn硬件调度器的核心延迟通道是实现复杂采样序列的“导演”。每个延迟通道有四个关键部分DELAY延时、LOOP_COUNT循环次数、TRIGGER_LRADCS触发哪些ADC通道、TRIGGER_DELAYS触发哪些延迟通道。// 示例配置Delay0延时100ms后触发CH0和CH1采样并循环执行2次 // 2kHz时钟下的延时计数 延时(秒) * 2000 0.1 * 2000 200 #define DELAY_COUNT_100MS 200 HW_LRADC_DELAY0_WR(BF_LRADC_DELAY0_TRIGGER_LRADCS(0x03) | // 二进制00000011触发CH0和CH1 BF_LRADC_DELAY0_TRIGGER_DELAYS(0x00) | // 不触发其他延迟通道 BF_LRADC_DELAY0_LOOP_COUNT(1) | // 循环1次注意0表示1次1表示2次 BF_LRADC_DELAY0_DELAY(DELAY_COUNT_100MS) | BF_LRADC_DELAY0_KICK(0)); // 先配置暂不启动DELAY[10:0]延时计数器这是一个11位的递减计数器基于一个独立的2kHz时钟工作。这意味着其延时分辨率是0.5ms1/2000 Hz最大延时约为2^11 / 2000 ≈ 1.024秒。计算延时值公式DELAY 所需延时(秒) * 2000。重要提醒这个2kHz时钟来源于晶振时钟分频务必确保系统时钟配置正确否则实际延时会产生偏差。LOOP_COUNT[15:11]循环次数这个字段定义了该延迟通道计数到零并触发目标后自动重复的次数。这里有一个极易混淆的点设置值为0表示执行1个循环即触发一次。设置值为1表示执行2个循环触发两次。以此类推。如果你想让它无限循环例如用于周期性监控需要将其设置为0x1F最大值31并结合TRIGGER_DELAYS触发自身来实现。在上面的例子中LOOP_COUNT(1)意味着整个“延时-触发”的过程会执行2次。TRIGGER_LRADCS[31:24] TRIGGER_DELAYS[19:16]触发目标这两个位图字段定义了延迟结束时触发的对象。TRIGGER_LRADCS的bit0对应CH0bit1对应CH1以此类推。TRIGGER_DELAYS的bit0对应DELAY0bit1对应DELAY1以此类推。强大之处在于可以同时触发多个目标。例如你可以设置TRIGGER_LRADCS0xFF来同时启动所有8个ADC通道的采样如果它们已预先配置好这在需要同步采集多个传感器时非常有用。KICK[20]启动位向该位写1立即启动该延迟通道的计数。这是启动整个硬件调度流程的“发令枪”。3.4 状态寄存器HW_LRADC_STATUS与控制寄存器2HW_LRADC_CTRL2HW_LRADC_STATUS主要用来查询硬件状态。最有用的位是TOUCH_DETECT_RAW它直接反映了触摸屏检测比较器的输出。当有人触摸屏幕时该位变为1。你可以配置中断让该位的变化唤醒CPU从而实现极低功耗的触摸唤醒功能。其他位如CHANNELx_PRESENT是只读的用于确认芯片是否支持该通道在i.MX23上通常都为1。HW_LRADC_CTRL2主要用于控制温度传感器和中断。例如TEMP_SENSOR_IENABLE位用于使能温度传感器的中断。在触摸屏应用中我们更关注的是各个ADC通道的中断使能这些通常在HW_LRADC_CTRL0/1中配置手册未在此片段中给出但实际存在。HW_LRADC_CTRL0中的SCHEDULE位域是只写的由硬件根据延迟通道的TRIGGER_LRADCS设置自动置位用于真正将ADC通道加入调度队列。4. 触摸屏接口驱动实战从配置到坐标计算现在我们把所有知识点串联起来实现一个完的四线电阻触摸屏驱动框架。假设硬件连接如下XPX和YPY通过MOSFET驱动电压XMX-和YMY-接地或接ADC。CH0接YM用于测X坐标CH1接XM用于测Y坐标。4.1 初始化配置流程时钟与基础配置// 1. 配置LRADC时钟假设系统主频24MHz HW_LRADC_CTRL3_WR(BF_LRADC_CTRL3_CYCLE_TIME(2) | // 3MHz时钟采样率~230.8kHz BF_LRADC_CTRL3_HIGH_TIME(2) | // 125ns高电平时间 BF_LRADC_CTRL3_DISCARD(2)); // 丢弃前2个样本 // 2. 配置触摸检测中断如果需要 // 通常将触摸检测比较器输出连接到GPIO中断或LRADC自身的中断配置ADC通道// 配置CH0和CH1为4次过采样累加模式 HW_LRADC_CH0_WR(BF_LRADC_CH0_ACCUMULATE(1) | BF_LRADC_CH0_NUM_SAMPLES(4) | BF_LRADC_CH0_VALUE(0)); HW_LRADC_CH1_WR(BF_LRADC_CH1_ACCUMULATE(1) | BF_LRADC_CH1_NUM_SAMPLES(4) | BF_LRADC_CH1_VALUE(0)); // 使能CH0和CH1的中断假设在CTRL1寄存器中 HW_LRADC_CTRL1_SET(BM_LRADC_CTRL1_LRADC0_IRQ_EN | BM_LRADC_CTRL1_LRADC1_IRQ_EN);构建采样序列使用延迟通道 这是最核心的一步。我们需要一个序列驱动X采样Y- (CH0) - 驱动Y采样X- (CH1)。假设每一步采样需要稳定时间1ms采样本身约需0.1ms。// Delay0: 触发后等待1ms让X驱动稳定然后触发CH0采样并触发Delay1 HW_LRADC_DELAY0_WR(BF_LRADC_DELAY0_TRIGGER_LRADCS(0x01) | // 触发CH0 (bit0) BF_LRADC_DELAY0_TRIGGER_DELAYS(0x02) | // 触发Delay1 (bit1) BF_LRADC_DELAY0_LOOP_COUNT(0) | // 执行1次 BF_LRADC_DELAY0_DELAY(2000)); // 1ms延时 (2000 ticks 2kHz) // Delay1: 被触发后先关闭X驱动打开Y驱动等待1ms稳定然后触发CH1采样 // 注意切换驱动IO是GPIO操作延迟通道无法直接控制。这里需要配合中断。 // 一种常见做法在CH0的中断服务程序ISR中切换驱动方向然后启动Delay1。 // 另一种更硬件化的做法使用两个延迟通道第一个延时后触发一个GPIO通过其他外设第二个延时后触发ADC。 // 为简化本例假设在Delay1的触发动作里我们通过其他方式如PWM或GPIO事件切换了驱动。 // 这里Delay1仅负责延时后触发CH1。 HW_LRADC_DELAY1_WR(BF_LRADC_DELAY1_TRIGGER_LRADCS(0x02) | // 触发CH1 (bit1) BF_LRADC_DELAY1_TRIGGER_DELAYS(0x00) | BF_LRADC_DELAY1_LOOP_COUNT(0) | BF_LRADC_DELAY1_DELAY(2000)); // 再延时1ms更优的实践为了完全解放CPU可以使用一个额外的延迟通道Delay2来模拟“切换驱动”的延时。或者利用芯片的引脚中断或定时器在ADC中断中快速切换驱动方向由于中断响应和软件开销通常在微秒级远小于触摸屏稳定的毫秒级时间所以也是可行的。启动采样// 首先设置驱动方向XP上拉XM高阻YP高阻YM接地通过低阻通路。 set_touch_drive_x_positive(); // 然后“踢一脚”启动Delay0 HW_LRADC_DELAY0_SET(BM_LRADC_DELAY0_KICK);4.2 中断服务程序与坐标计算当CH0和CH1的采样累加完成时会产生中断。void LRADC_IRQ_Handler(void) { uint32_t status HW_LRADC_CTRL1.B; // 读取中断状态 if (status BM_LRADC_CTRL1_LRADC0_IRQ) { // CH0中断X坐标采样完成 HW_LRADC_CTRL1_CLR(BM_LRADC_CTRL1_LRADC0_IRQ); // 清除中断标志 uint32_t raw_x_sum HW_LRADC_CH0.B.VALUE; // 读取累加值 // 切换驱动方向为Y set_touch_drive_y_positive(); // 清除CH0累加器为下次做准备可选因为下次启动前会清 // HW_LRADC_CH0_CLR(BM_LRADC_CH0_VALUE); // 启动Delay1开始Y坐标采样 HW_LRADC_DELAY1_SET(BM_LRADC_DELAY1_KICK); } if (status BM_LRADC_CTRL1_LRADC1_IRQ) { // CH1中断Y坐标采样完成 HW_LRADC_CTRL1_CLR(BM_LRADC_CTRL1_LRADC1_IRQ); uint32_t raw_y_sum HW_LRADC_CH1.B.VALUE; // 一次完整的触摸采样结束恢复触摸屏到空闲状态所有驱动关闭 set_touch_drive_idle(); // 计算坐标 // 假设我们设置了4次过采样NUM_SAMPLES4 uint16_t raw_x (uint16_t)(raw_x_sum / 4); uint16_t raw_y (uint16_t)(raw_y_sum / 4); // 调用坐标转换函数通常需要校准参数 convert_to_pixel(raw_x, raw_y); } }坐标转换与校准ADC读出的原始值raw_x, raw_y需要转换为屏幕像素坐标。这通常需要一个校准过程采集屏幕四个角或五个点的ADC值通过线性插值或更复杂的公式如仿射变换来计算。这是另一个话题但核心是像素X A * raw_x B * raw_y C像素Y D * raw_x E * raw_y F。系数A-F通过校准获得。5. 常见问题排查与调试技巧实录即使按照手册配置在实际调试中还是会遇到各种问题。下面是我总结的一些典型问题和解决方法。5.1 采样数据不稳定或跳动大现象ADC读数值在无输入时也在小范围跳动或有输入时波动远超预期。排查步骤检查电源和参考电压这是首要原因。用示波器测量VDDIO和ADC的参考电压引脚如果有看纹波是否过大。触摸屏驱动电路如上拉电阻、MOSFET的电源也要稳定。确认DISCARD设置确保HW_LRADC_CTRL3.DISCARD至少设置为1。可以尝试设置为2或3观察效果。启用过采样将NUM_SAMPLES设置为4或8并启用ACCUMULATE。这是抑制随机噪声最有效的手段。调整时钟相位如果跳动有规律例如周期与系统主频或DCDC频率相关尝试设置HW_LRADC_CTRL3.INVERT_CLOCK1。检查采样时序对于触摸屏驱动电压施加后需要足够的稳定时间DELAY才能进行采样。稳定时间不足会导致采样值处于变化中。增加延迟通道的DELAY值。硬件滤波在ADC输入引脚增加一个小的RC滤波电路如1kΩ电阻串联100pF电容对地可以滤除高频噪声。注意电阻不能太大以免影响ADC输入阻抗。5.2 延迟通道不触发或触发逻辑错误现象设置了延迟通道并Kick了但预期的ADC通道没有开始转换或者触发顺序混乱。排查步骤确认KICK位KICK位是启动键。写1后硬件会在当前周期结束时将其清0。如果你在循环中不断写1可能会干扰硬件状态。确保只在需要启动时写一次。检查TRIGGER_LRADCS映射TRIGGER_LRADCS的bit0对应CH0bit7对应CH7。确认你设置的位图正确。例如要触发CH1和CH2应设置TRIGGER_LRADCS (11) | (12) 0x06。理解LOOP_COUNT行为记住LOOP_COUNT0是循环1次。如果你希望无限循环需要设置LOOP_COUNT为一个非零值并且TRIGGER_DELAYS要包含自身自触发。例如TRIGGER_DELAYS的bit0置1可以触发自己。检查ADC通道是否已“武装”延迟通道的触发只是将对应的ADC通道加入一个“调度队列”。ADC通道本身必须预先配置好NUM_SAMPLES,ACCUMULATE等并且其对应的中断可能也需要使能取决于你是否用中断。一个常见的错误是配置了延迟通道但忘了配置目标ADC通道的NUM_SAMPLES默认为0即单次采样但需要软件手动启动另一种调度导致ADC通道并未进入自动调度模式。确保目标ADC通道的NUM_SAMPLES字段被设置为一个非零值如果你希望硬件自动完成多次采样。使用TOGGLE位调试在ADC通道的中断服务程序里或者在一个定时任务里读取HW_LRADC_CHn.TOGGLE位并记录其变化。如果它从不翻转说明该通道从未完成过一次完整的采样集可能未被触发。如果翻转频率异常说明调度时序有问题。5.3 触摸检测中断不响应或误触发现象触摸屏幕时无法唤醒系统或者没触摸时误唤醒。排查步骤确认比较器阈值触摸检测比较器有一个内部阈值。如果触摸屏的等效电阻变化范围太小可能无法超过阈值。需要检查触摸屏的硬件参数如材质、线阻和驱动电压。检查中断使能和路由触摸检测中断通常关联TOUCH_DETECT_RAW状态位需要在相应的中断控制器如i.MX23的PINCTRL或LRADC自身的控制寄存器中使能并正确映射到CPU的IRQ或FIQ。查阅芯片的中断交叉开关Interrupt Crossbar配置。消抖处理触摸检测是模拟比较容易受噪声影响产生毛刺。应在软件中断处理程序中加入简单的消抖逻辑例如连续检测到几次有效触摸后才确认为一次真实事件。休眠下的电源配置在系统休眠时确保LRADC模块和触摸屏电路的供电域Power Domain没有关闭。同时触摸检测比较器本身可能有一个独立的使能位在进入低功耗模式前需要确认其已开启。5.4 过采样累加结果计算错误现象使能了累加模式ACCUMULATE1NUM_SAMPLES4但读出的VALUE除以4后结果明显不对。排查步骤忘记清除累加器这是最最常见的错误在启动一轮新的累加采样之前必须将VALUE字段写0。硬件不会自动清零。一个好的做法是在配置通道参数ACCUMULATE和NUM_SAMPLES的同时就写0清除累加器。累加溢出虽然VALUE是18位但如果你设置NUM_SAMPLES很大比如32并且输入电压接近满量程32个4095相加结果是131040仍在18位范围内2^18262144。一般不会溢出但也要注意。中断时机理解中断是在完成了NUM_SAMPLES次采样后产生的。在中断产生时VALUE中已经是累加和。不要在中断产生前就去读VALUE。调试这类硬件模块逻辑分析仪和示波器是最好的朋友。用逻辑分析仪抓取ADC的时钟、触发信号和中断信号可以清晰地看到整个调度时序是否符合预期。用示波器观察ADC输入引脚和触摸屏驱动引脚上的波形可以确认模拟部分是否工作正常。

相关新闻