1. 项目概述:深入理解F2803x的ADC模块
在嵌入式系统,尤其是工业控制、电机驱动和精密电源管理领域,高精度的模拟信号采集是决定系统性能上限的关键一环。TMS320F2803x系列微控制器集成的模数转换器(ADC)模块,正是为此类高要求应用而设计。很多工程师初次接触这个模块时,往往会被其众多的寄存器、复杂的上电时序和校准流程所困扰,直接照搬例程代码虽然能让ADC“跑起来”,但一旦遇到精度不达标、读数跳变或者时序冲突等问题,就会陷入被动调试的困境。
实际上,F2803x的ADC是一个高度可配置且功能强大的模块,其设计哲学在于将灵活的控制权交给开发者,以换取最优的性能。这就像给你一套顶级的手动挡赛车,如果你只懂得踩油门和刹车,永远无法发挥其全部潜力。理解其上电、校准、参考源选择和时序控制的每一个细节,是将其精度和稳定性发挥到极致的前提。本文将从一个资深嵌入式工程师的视角,带你穿透数据手册的繁杂描述,直击F2803x ADC模块配置、校准与寄存器操作的核心要点与实战技巧。
2. ADC模块核心架构与工作模式解析
在深入寄存器之前,我们必须先建立起对F2803x ADC模块整体架构的清晰认知。这个ADC模块是一个12位精度的逐次逼近型(SAR)ADC,其核心特性在于双采样保持(S/H)电路的设计,这直接决定了其两种基本工作模式:顺序采样模式(Sequential Mode)和同步采样模式(Simultaneous Mode)。
2.1 顺序采样模式与同步采样模式
顺序采样模式是大多数应用中的默认选择。在此模式下,ADC核心依次对单个通道进行采样和转换。例如,你可以配置SOC0采样通道A0,SOC1采样通道A1。ADC会先完成对A0的整个采样-转换周期,将结果存入ADCRESULT0,然后再开始对A1的采样-转换周期,结果存入ADCRESULT1。这种模式逻辑简单,时序清晰,适用于对多个信号进行轮流采样的场景。
同步采样模式则是F2803x ADC的一个亮点,它充分利用了其双S/H电路。在此模式下,你可以配置一个SOC同时采样一对A和B通道(例如SOC0配置为采样A0和B0)。ADC会在同一个采样窗口内,同时采集A0和B0的模拟信号,然后依次进行转换,结果分别存入相邻的结果寄存器(如ADCRESULT0和ADCRESULT1)。这种模式对于需要严格同步采集两路信号的应用至关重要,比如三相电机控制中需要同时采集两相电流,以准确计算矢量角度和幅值。
注意:同步采样并非指两路信号同时完成模数转换,而是同时开始采样。转换过程仍然是顺序进行的,先转换A通道结果,再转换B通道结果。但得益于采样时刻的严格同步,其相位信息是准确的。
2.2 采样与转换的时序内核
无论哪种模式,ADC的一次完整操作都包含两个阶段:采样阶段(Acquisition Phase)和转换阶段(Conversion Phase)。采样阶段由采样窗口宽度(ACQPS)控制,即S/H开关保持闭合、对外部采样电容充电的时间。这个时间必须足够长,以确保采样电容上的电压能够跟随并稳定到输入信号电压。ACQPS的值以ADCCLK周期为单位进行设置。
转换阶段则固定需要13个ADCCLK周期(这是SAR ADC逐位比较的固有时间)。在这13个周期内,采样开关断开,ADC核心开始进行逐次逼近计算,外界输入信号的变化不会影响转换结果。理解这两个阶段的分离是分析所有时序图的基础。在顺序模式下,采样下一个通道可以与转换当前通道的结果重叠进行,以提高吞吐率,除非你启用了ADCNONOVERLAP模式来禁止这种重叠。
3. 上电、时钟与参考电压配置详解
让ADC可靠工作的第一步是正确的上电和基础配置。这一步若出错,轻则读数不准,重则ADC完全无法启动。
3.1 严格遵循的上电序列
数据手册中给出的上电序列并非建议,而是必须遵守的硬件启动要求。许多诡异的ADC故障,根源都在于上电顺序不当。
标准上电步骤:
- 使能ADC时钟:在操作任何ADC寄存器之前,必须首先设置系统控制寄存器
PCLKCR0中的ADCENCLK位。没有时钟,ADC寄存器无法写入,模块处于“僵死”状态。这是最容易忽略的第一步。 - 配置参考源:如果需要使用外部参考电压(
VREFHI/VREFLO),此时需设置ADCCTL1.ADCREFSEL = 1。如果使用内部3.3V参考,则保持为0。我个人的习惯是,即使使用内部参考,也在上电序列中显式地将其置0,避免寄存器位处于未知状态。 - 给模拟电路供电:通过设置
ADCCTL1寄存器中的ADCPWDN、ADCBGPWD和ADCREFPWD位,为ADC模拟核心、带隙基准和参考电压缓冲器上电。这三个位可以同时设置。 - 使能ADC模块:设置
ADCCTL1.ADCENABLE = 1。 - 关键延迟:在执行第一次转换之前,必须在完成步骤3(给模拟电路供电)后,插入至少1毫秒的延时。这是F2803x ADC与早期型号的关键区别,旨在让内部模拟电路(尤其是带隙基准)充分稳定。忽略这个延迟会导致首次转换结果严重错误,甚至影响后续转换的精度。
对应的C代码示例:
// 步骤1: 使能ADC外设时钟 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // 步骤2 & 3 & 4: 配置参考源、上电、使能 (可合并操作) EALLOW; // ADCCTL1是EALLOW保护寄存器 AdcRegs.ADCCTL1.all = 0x0000; // 先清零 AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 0=内部参考,1=外部参考 AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // 上电模拟电路 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 上电带隙 AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // 上电参考缓冲 AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // 使能ADC模块 EDIS; // 步骤5: 等待至少1ms,让模拟电路稳定 DELAY_US(1000); // 假设DELAY_US是一个微秒级延时函数下电序列则简单得多,直接清除ADCPWDN、ADCBGPWD和ADCREFPWD位即可,可以同时操作。ADCENABLE位可以在下电前或后清除。
3.2 时钟分频与采样率计算
ADC的时钟源ADCCLK来自系统时钟SYSCLK,可以通过ADCCTL2.CLKDIV2EN位进行2分频。ADCCLK的频率直接决定了ADC的转换速度和采样窗口的最小时间单位。
转换时间计算公式:一次完整的转换所需的最少ADCCLK周期数 =采样窗口周期数 (ACQPS + 1) + 固定转换周期 (13)。
例如,系统时钟SYSCLK为60MHz,CLKDIV2EN=0(即不分频),则ADCCLK=60MHz。若设置ACQPS=14(即15个ADCCLK采样周期),则单次转换时间 = (14+1) + 13 = 28个ADCCLK周期。对应的时间为 28 / 60MHz ≈ 0.467us。这意味着该通道的理论最大采样率约为 1 / 0.467us ≈ 2.14 MSPS(每秒百万次采样)。但这是单个通道连续转换的理想值,实际系统中还需考虑结果读取、中断处理等开销。
实操心得:
ACQPS的设置需要根据信号源阻抗和采样精度要求来权衡。对于高阻抗信号源,需要更长的采样时间(更大的ACQPS值)以确保采样电容充电充分。通常可以从一个较大的值(如63)开始测试,在保证精度的前提下逐步减小,以提升采样率。使用TI提供的AdcSetMode函数或直接配置ADCSOCxCTL.ACQPS位进行设置。
3.3 内部与外部参考电压的选择策略
ADCCTL1.ADCREFSEL位控制参考电压源的选择,这直接决定了ADC的输入量程和转换公式。
内部参考模式 (ADCREFSEL=0):这是最常用的模式。ADC使用内部产生的3.3V(典型值���作为参考高电平VREFHI,VREFLO在片内连接到模拟地。此时,ADC的输入量程固定为0V至3.3V。转换公式为:数字值 = 4096 * (输入电压 / 3.3V),结果取整。 此模式接线简单,无需外部元件,精度取决于芯片内部带隙基准的质量,通常能满足大多数应用。
外部参考模式 (ADCREFSEL=1):此模式下,ADC使用从VREFHI和VREFLO引脚输入的外部电压作为参考。输入量程变为VREFLO至VREFHI。转换公式为:数字值 = 4096 * [(输入电压 - VREFLO) / (VREFHI - VREFLO)]。 这种模式适用于比例式测量。例如,使用一个5V的传感器,但其输出与供电电压成比例(即传感器供电电压变化,输出等比例变化)。此时,可以将传感器的供电电压同时作为ADC的VREFHI,那么无论电源电压如何波动,ADC读数都能准确反映传感器的真实比例,消除了电源波动带来的误差。
重要警告:在数据手册的电气特性章节,明确规定了
VREFHI和VREFLO引脚的电压范围(例如VREFHI不能超过VDDA)。绝对不要超出此范围,否则可能永久损坏ADC模块。此外,在一些封装中,VREFLO可能在内部已连接到VSSA(模拟地),此时它被固定为0V,无法用作可变的参考低电平。
4. ADC校准:从工厂校准到现场自校准
ADC的精度不仅取决于设计,还受制造工艺偏差和温度等环境因素影响。F2803x的ADC在出厂时已经过校准,但为了应对应用现场的独特环境,它提供了用户可调的校准机制。
4.1 工厂校准与Device_cal()函数
芯片在出厂测试时,TI会在特定温度下(通常是30°C)测量每个芯片ADC的零偏置误差和满量程增益误差,并将修正值(Trim值)写入芯片保留的OTP(一次性可编程)存储器中。这些值通过一个名为Device_cal()的C函数封装。
在系统启动时,Boot ROM(引导只读存储器)会自动调用Device_cal()函数,将这些工厂校准值加载到ADCOFFTRIM(偏置调整)和ADCREFTRIM(参考/增益调整)等寄存器中。这是ADC达到数据手册标称精度的前提。
致命陷阱:如果你在代码中通过软件复位ADC(写
ADCCTL1.RESET=1),或者系统发生硬件复位,必须重新调用Device_cal()函数!因为复位操作会清除这些Trim寄存器,导致ADC失去校准。很多工程师在调试时发现复位后ADC精度骤降,根本原因就在于此。在CCS(Code Composer Studio)仿真时,如果跳过了Boot ROM流程,也需要手动在代码初始化阶段调用该函数。
4.2 零偏置误差的现场自校准
工厂校准是在30°C下进行的。当芯片工作温度变化,或者你的PCB板模拟地线布局引入微小偏移时,可能会产生新的零偏置误差。这时,你可以利用ADC自身提供的功能进行现场校准。
零偏置误差是指当输入电压等于VREFLO(通常是0V)时,ADC的输出数字码不为0。可能是正偏移(输出一个正小数字),也可能是负偏移(需要输入一个略高于0V的电压才能让输出从0跳变为1)。
F2803x提供了专门的ADCCTL1.VREFLOCONV位。当此位置1时,它会将内部VREFLO(模拟地)连接到通道B5的输入上,从而可以测量ADC对0V的实际转换值。
自校准步骤详解:
- 设置人工偏置:先将
ADCOFFTRIM寄存器设置为一个中间值,例如0x50(十进制80)。这个操作相当于给ADC增加一个已知的、较大的正向偏置,目的是为了“暴露”可能存在的负偏置(如果存在负偏置,ADC输出可能始终为0,无法测量)。 - 连接内部VREFLO:设置
ADCCTL1.VREFLOCONV = 1。此时,ADC的B5通道不再连接外部引脚,而是直接连接到内部的VREFLO(0V)。 - 采样并平均:配置一个SOC(例如SOC0)对通道B5进行多次采样(比如64或128次),将结果累加后求平均。多次平均是为了消除随机噪声的影响,得到稳定的零偏置测量值,记为
VrefLo_Avg。 - 计算并写入最终偏置值:理想的零偏置输出应为0。现在测出的
VrefLo_Avg包含了ADC固有的误差和我们第一步添加的人工偏置(80)。因此,ADC固有的误差值约为80 - VrefLo_Avg。为了校正这个误差,我们需要向ADC输入其补码。所以,最终的ADCOFFTRIM值应设置为:0x50 - VrefLo_Avg。 - 恢复B5通道:设置
ADCCTL1.VREFLOCONV = 0,将B5通道交还给外部引脚。
TI在头文件F2803x_Adc.c中提供了AdcOffsetSelfCal()函数,其内部实现的就是上述逻辑。在实际项目中,我建议在系统初始化、ADC上电稳定后调用一次这个函数,尤其是在环境温度与室温差异较大时。
// 调用TI提供的自校准函数示例 AdcOffsetSelfCal();4.3 满量程增益与偏置电流校准
与零偏置校准不同,满量程增益误差和ADC偏置电流的校准值通常由工厂校准一次性完成,存储在ADCREFTRIM和另一个偏置电流调整寄存器中。Device_cal()函数会将这些值写入。除非你有极其精密的测量设备和深厚的模拟电路知识,否则强烈不建议用户修改ADCREFTRIM寄存器。错误的修改会扭曲整个ADC的转换线性度,导致所有读数均出现比例错误,且难以恢复。
5. 关键寄存器功能解析与配置实战
寄存器是软件与ADC硬件对话的接口。理解每个关键位的作用,是进行灵活、高效配置的基础。
5.1 控制寄存器1 (ADCCTL1):大脑与开关
ADCCTL1是ADC最核心的控制寄存器,包含电源、使能、模式选择等关键控制位。
- BIT15 - RESET:软件复位位。写1会产生一个同步复位脉冲,将整个ADC模块复位到上电初始状态。这是一个“一次性效应”位,硬件会在你写1后立即自动将其清0。读它永远返回0。前文提到的复位后需重调
Device_cal(),根源就在于此。 - BIT14 - ADCENABLE:ADC总使能位。必须在
ADCPWDN等电源位置1后才能设置此位为1,ADC才能开始转换。 - BIT13 - ADCBSY:ADC忙状态位。只读。当有SOC触发时,此位被置1,表示ADC核心正在忙(采样或转换),无法处理新的SOC。在顺序模式下,它会在S/H脉冲下降沿后4个
ADCCLK周期清0;在同步模式下,则是14个周期后清0。你可以查询此位来确保ADC就绪,但更常见的做法是使用中断或轮询EOC标志。 - BITs 12:8 - ADCBSYCHN:指示当前或上一次正在处理的SOC编号。当
ADCBSY=1时,它显示当前正在处理的SOC;当ADCBSY=0时,它保持为最后一个完成转换的SOC编号。用于高级调试和状态查询。 - BIT7 - ADCPWDN:模拟电路电源开关(低有效)。0关,1开。
- BIT6 - ADCBGPWD:带隙基准电源开关(低有效)。
- BIT5 - ADCREFPWD:参考电压缓冲器电源开关(低有效)。
- BIT3 - ADCREFSEL:参考电压选择,0内部/1外部。
- BIT2 - INTPULSEPOS:中断脉冲位置控制。这是影响中断响应时序的关键位。
0:Late Interrupt。中断脉冲在ADC开始转换时(即S/H脉冲下降沿)产生。1:Early Interrupt。中断脉冲在ADC转换结果锁存到结果寄存器前1个ADCCLK周期产生。- 如何选择?如果你希望在转换一开始就进入中断服务程序(ISR)进行其他操作,而等转换完成后再来读取结果,可以选择Late模式。如果你希望中断产生时,结果已经即将就绪,可以在ISR中立即读取,则应选择Early模式。Early模式可以减少结果就绪的等待时间,但需要确保你的ISR足够快,能在结果锁存后尽快读取。
- BIT1 - VREFLOCONV:前文自校准已详细介绍,用于将内部
VREFLO连接到B5通道。 - BIT0 - TEMPCONV:温度传感器连接控制。置1时,将内部温度传感器连接到A5通道,断开外部ADCINA5引脚。用于测量芯片结温。
5.2 控制寄存器2 (ADCCTL2) 与采样模式寄存器
- ADCCTL2.BIT1 - ADCNONOVERLAP:非重叠模式控制。默认为0,允许采样与转换阶段重叠,以提高吞吐率。设置为1时,禁止重叠,即必须等待上一个通道的转换完全结束后,才能开始下一个通道的采样。这会降低最大采样率,但可以避免在采样高阻抗源时,因转换阶段内部开关噪声而影响采样精度。在驱动能力弱的传感器场景下可以考虑启用。
- ADCCTL2.BIT0 - CLKDIV2EN:ADC时钟2分频使能。
- ADCSAMPLEMODE:采样模式寄存器。每个SOC都可以独立配置为顺序模式或同步模式。这是实现同步采样的关键。你需要为每个SOC对(如SOC0和SOC1用于同步采样一对通道)正确配置此寄存器。
5.3 SOC配置寄存器 (ADCSOCxCTL) 与中断控制
每个SOC(Start-Of-Conversion)都有其独立的控制寄存器ADCSOCxCTL(x=0~15),主要配置两个参数:
- CHSEL:选择本SOC要采样的模拟输入通道(0~15对应A0~A7, B0~B7)。
- ACQPS:设置采样窗口的
ADCCLK周期数,实际采样时间为ACQPS + 1个周期。
中断的配置相对灵活但也稍复杂,涉及多个寄存器:
- INTSELxNy(x=1,3,5,7,9; y=2,4,6,8,10):这些寄存器用于将ADC的16个EOC(End-Of-Conversion)事件映射到9个ADCINT中断线(ADCINT1~ADCINT9)。例如,你可以配置
INTSEL1N2.INT1SEL = 0,让EOC0触发ADCINT1。 - INTxE:对应ADCINTx的中断使能位。
- INTxCONT:连续模式。如果设置为1,即使对应的
ADCINTFLG标志位未清除,新的EOC事件也会持续产生中断脉冲。如果为0,则必须在ISR中清除标志位后,才能响应下一次中断。 - ADCINTFLG:中断标志寄存器。当EOC事件触发中断时,相应位置1。
- ADCINTFLGCLR:中断标志清除寄存器。向某位写1,可清除
ADCINTFLG中的对应标志位。 - ADCINTOVF与ADCINTOVFCLR:中断溢出寄存器及其清除寄存器。如果在
ADCINTFLG已置1(标志未清)的情况下,又发生了新的EOC事件,则ADCINTOVF中的对应溢出位会置1。这通常意味着CPU处理中断的速度跟不上ADC转换的速度,需要检查ISR效率或降低采样率。必须同时清除ADCINTFLG和ADCINTOVF,中断才能恢复正常。
5.4 结果寄存器 (ADCRESULTx) 与读取技巧
转换结果存储在ADCRESULT0~ADCRESULT15这16个寄存器中。需要注意的是,这些寄存器位于与其它ADC配置寄存器不同的外设帧(Peripheral Frame 0)。在C头文件中,它们被定义在AdcResult这个独立的结构体中,而不是AdcRegs。
读取结果时,结果数据是左对齐的12位数据(即高12位有效,低4位为0)。你需要根据应用需求决定是否右移4位。对于提高计算效率,有时保持左对齐格式直接进行后续运算(如与Q格式数相乘)反而更方便。
避坑指南:在同时使用DMA搬运ADC结果和CPU读取结果时,要特别注意数据一致性问题。确保DMA的传输完成中断或CPU的读取操作,发生在对应通道的转换完成之后。通过查询
ADCBSY位或ADCBSYCHN位,或者合理配置中断时序,可以避免读到陈旧或错误的数据。
6. 内部温度传感器的使用与校准
F2803x内部集成了一个温度传感器,用于监测芯片结温,这在过温保护、性能补偿等应用中非常有用。
6.1 温度传感器使用流程
- 配置连接:设置
ADCCTL1.TEMPCONV = 1,将温度传感器输出连接到ADC通道A5。此时外部ADCINA5引脚被断开。 - 配置采样:像配置普通通道一样,配置一个SOC(例如SOC0)来采样通道5(A5)。设置合适的
ACQPS。 - 触发转换并读取:触发该SOC,等待转换完成(通过中断或轮询),从相应的
ADCRESULTx寄存器中读取原始ADC码值sensorSample。 - 转换为温度:利用公式和校准参数将ADC码值转换为温度值。
6.2 温度转换公式与校准参数获取
温度传感器的转换公式为:温度 = (传感器ADC码值 - 零点偏移量) * 斜率。
其中:
- 斜率:单位是 °C/LSB,表示每个LSB变化对应的温度变化。该值通常为负,因为半导体温度传感器的电压输出随温度升高而下降。
- 零点偏移量:在0°C时,温度传感器输出的理想ADC码值。
这些校准参数在芯片出厂时已被测定,并存储在芯片特定的OTP地址中。对于F2803x,你可以通过以下方式获取:
// 方法一:直接访问存储地址(需了解Q格式) #define TEMP_SLOPE_ADDR (*(int (*)(void))0x3D7E82)() #define TEMP_OFFSET_ADDR (*(int (*)(void))0x3D7E85)() int16 tempSlope = TEMP_SLOPE_ADDR; // Q15格式 int16 tempOffset = TEMP_OFFSET_ADDR; // 整数LSB值 // 方法二:使用TI库函数(如果提供) // 通常会有类似 GetTempSlope() 和 GetTempOffset() 的函数转换计算示例(假设使用内部3.3V参考):
int16 rawAdcValue = AdcResult.ADCRESULT0 >> 4; // 读取并右移为12位数据 float temperatureC = (rawAdcValue - tempOffset) * tempSlope; // tempSlope需转换为浮点数或进行定点数运算重要提示:如果ADC工作在外部参考电压模式,由于参考电压变化,从OTP中读出的斜率/偏移参数不能直接使用,需要根据外部参考电压与3.3V的比例进行换算。具体公式需参考数据手册的电气特性章节。
7. 常见问题排查与实战调试技巧
即使理解了所有原理,实际调试中仍会遇到各种问题。下面是一些典型问题的排查思路和我积累的实战技巧。
7.1 ADC读数不准或跳动大
- 检查电源和地:这是首要原因。确保模拟电源
VDDA和数字电源VDD干净、稳定。VSSA和VSS(模拟地和数字地)必须在芯片附近单点连接良好。用示波器查看VDDA上是否有噪声或纹波。 - 检查参考电压:如果使用内部参考,确保
VREFLO引脚已通过一个低ESR的电容(如1uF+0.1uF)良好接地。如果使用外部参考,确保参考源噪声低、驱动能力强。 - 优化采样时间:
ACQPS设置过小是最常见的原因。对于高阻抗信号源(如>1kΩ),需要显著增加ACQPS。一个简单的测试方法是:逐步增大ACQPS,观察读数是否趋于稳定。稳定时的最小值即为安全值。 - 检查校准:确认
Device_cal()函数已被调用。尝试运行AdcOffsetSelfCal()函数进行现场偏置校准。 - 信号调理电路:检查ADC输入引脚前的RC滤波电路。电阻过大会增加源阻抗,电容过大会导致信号响应变慢。需要根据信号频率和采样率折中设计。
- 数字噪声干扰:在ADC转换期间,让CPU进入空闲模式或避免执行大量数字I/O操作,可以减少数字开关噪声通过电源和地耦合到模拟部分。
7.2 ADC无法启动或没有转换结果
- 验证上电序列:严格按照第3.1节的步骤,并确保1ms延时已执行。使用调试器查看
ADCCTL1寄存器的ADCPWDN、ADCBGPWD、ADCREFPWD和ADCENABLE位是否均已置1。 - 检查时钟:确认
PCLKCR0.ADCENCLK已使能。检查ADCCTL2.CLKDIV2EN配置是否符合预期。 - 检查SOC配置与触发:
- 确认
ADCSOCxCTL.CHSEL选择了正确的通道。 - 确认SOC已被触发。触发方式可以是软件触发(写
ADCSOCFRC1寄存器)、ePWM、GPIO定时器等。使用调试器查看ADCSOCFLG1寄存器,看对应的SOC标志位是否在触发后置1。
- 确认
- 检查中断/��询逻辑:如果使用中断,确认
INTSELxNy寄存器已正确将EOC事件映射到ADCINT,并且INTxE已使能,PIE和CPU级中断也已使能。如果使用轮询,确认是在查询正确的EOC标志或结果寄存器的更新。
7.3 同步采样数据不对齐
- 检查
ADCSAMPLEMODE寄存器:确保用于同步采样的一对SOC(如SOC0和SOC1)被正确配置为同步模式。 - 检查通道配对:同步采样要求A和B通道编号相同(如A0与B0,A1与B1)。确认
ADCSOCxCTL.CHSEL设置正确。 - 理解结果寄存器映射:在同步模式下,一个SOC触发会产生两个转换结果。例如,配置SOC0同步采样A0和B0,则A0的结果存入
ADCRESULT0,B0的结果存入ADCRESULT1。需要根据你的SOC配置来正确索引结果寄存器。
7.4 中断响应异常或丢失
- 检查
INTPULSEPOS位:理解你选择的是Early还是Late中断模式,这决定了你在ISR中读取结果时,结果是否已就绪。 - 检查连续模式
INTxCONT:如果设置为0(非连续模式),必须在ISR中清除ADCINTFLG标志,才能接收下一次中断。如果忘记清除,后续中断都会丢失,并可能置位ADCINTOVF溢出标志。 - 清除溢出标志:如果发生了溢出(
ADCINTOVF置位),必须同时清除ADCINTFLG和ADCINTOVF(向ADCINTOVFCLR写1),中断系统才能恢复正常。 - ISR效率:如果ADC采样率很高,而ISR处理时间过长,可能导致中断堆积和溢出。优化ISR代码,只做最必要的操作(如读取数据、清除标志),将数据处理等耗时任务放到主循环中。
调试ADC时,示波器、逻辑分析仪和调试器的寄存器查看窗口是你的三大法宝。通过示波器观察模拟输入信号和采样时刻;通过逻辑分析仪观察SOC触发信号、EOC信号和中断信号之间的时序关系;通过调试器实时查看和修改ADC寄存器,可以快速定位大部分复杂问题。记住,耐心和系统性的排查方法是解决嵌入式硬件接口问题的关键。