第 19 集《ADC 的中断》学习笔记
来源:B站视频 BV18h411B7Fz 第 19 集《ADC 的中断》,UP 主 Study-Charging(系列《DSP 自学视频(顾老师)从入门到编写(C2000)》)。
本文整理自视频字幕逐字稿(共 367 条、约 21 分钟),按讲解逻辑重新分节、修正了口语和语音识别的口误,技术结论以视频为准。本集实际讲了三块内容:ADC 参考电压选择、ADC 信号调理电路、ADC 的中断。
一、ADC 参考电压怎么选
参考电压是 ADC 把模拟量转换成数字量时的参照标准,它准不准,直接决定转换结果准不准。可以说,参考电压是影响 ADC 转换精度最重要的因素之一。
F28335 内部 ADC 通过寄存器 ADCREFSEL (参考电压选择,位域 REF_SEL)来决定用内部还是外部参考电压:
| REF_SEL 值 | 参考电压来源 |
|---|---|
00 |
内部参考电压(默认) |
01 |
外部参考电压 2.048 V |
10 |
外部参考电压 1.5 V |
11 |
外部参考电压 1.024 V |
关于"选择外部"的含义 :你把 REF_SEL 配成 01,只是告诉 DSP「我现在用的是外部参考电压、值是 2.048 V」 ;这个 2.048 V 本身得靠你自己的硬件电路做出来,再接到 ADCREFIN 引脚上。另外两种(1.5 V / 1.024 V)同理。
1.1 用内部参考电压
最简单的方式。选内部参考时,ADCREFIN 引脚可以悬空 ,也可以按手册接法处理。除此之外,另外三个引脚 ADCRESEXT、ADCREFP、ADCREFM 的接法是固定的(具体看芯片手册):
ADCRESEXT:接一个 20 kΩ 电阻;ADCREFP、ADCREFM:各接一个 2.2 μF 电容。
还有一个 ADCL0,它相当于一个偏置电压,通常让它偏置为 0(即接地或按手册处理)。
1.2 用外部参考电压
为满足工业应用需求,通常外部参考电压选 2.048 V 。视频推荐使用 TI 的 REF3020 这颗芯片来产生精确的 2.048 V,送进 ADCREFIN 引脚。
转换比例关系 :F28335 的 ADC 输入引脚信号范围是 0 ~ 3 V。若你选 2.048 V 作为参考定义,那么当输入信号达到 3 V 时,内部实际参照检测到的是 2.048 V------两者之间存在一个固定的对应/缩放关系,写程序算实际物理量时要留意这个缩放。
二、ADC 信号调理电路(把 ±5 V 变成 0~3 V)
前面反复强调:F28335 内部 ADC 的输入电压范围必须在 0 ~ 3 V 内。但现实里传感器输出的信号往往不满足这个区间(比如常见的 ±5 V ),这时候就需要信号调理电路,把传感器输出"搬"到 ADC 允许的范围里(例如调理成 0~3 V)。
视频里举了一个具体例子:设计一个电路,把 −5 V ~ +5 V 转成 0 ~ 3 V。
2.1 电路结构(思路)
信号 Vin(传感器输出)先经过:
- 前级
R11 + C11低通滤波,把传感器信号里的毛刺/高频噪声滤掉; - 再经过运放电路 ,最终输出
Vout,送到 ADC 引脚。
2.2 用「虚短、虚断」推导
运放工作的两个基本假设:虚断 (输入端不取电流)和虚短(同相/反相输入端等电位)。视频带着从这两个原则出发,把电路的传递函数推出来。
-
在 2 号点 ,由虚断推出其电压
v1与输入的关系:v1 = Vin / 16; -
在 3 号点 ,由虚断推出
v2:v2 = Vin / 53 + 5; -
再由虚短 (
v1 = v2)联立,得到最终的输出表达式:Vout = (16 / 53) × (Vin + 5 V)
2.3 验证
- 当
Vin = −5 V:Vout = (16/53) × 0 = 0 V; - 当
Vin = +5 V:Vout = (16/53) × 10 ≈ 3.02 V ≈ 3 V。
一条线性关系,正好把 −5 V ~ +5 V 映射成 0 ~ 3 V,满足 ADC 输入要求,可以放心送进 ADC 引脚。
留给你思考 :如果传感器电压范围是 −10 V ~ +10 V,这个调理电路又该怎么改(电阻网络、比例关系如何调整)?
三、ADC 的中断
进入正题。看 28335 的中断向量表,里面跟 ADC 相关的有三个中断:
| 中断名 | PIE 位置 | 含义 |
|---|---|---|
SEQ1INT |
INT1.1 | 序列发生器 SEQ1 完成一次序列转换时产生 |
SEQ2INT |
INT1.2 | 序列发生器 SEQ2 完成一次序列转换时产生 |
ADCINT |
INT1.6 | 由上面两者"或"出来(见下) |
3.1 SEQ1INT 与 SEQ2INT
SEQ1INT:序列发生器 SEQ1 完成一个序列的转换时,可以产生一个中断。通过寄存器可以选**「每次转换完成都中断」还是「隔一次中断一次」**------一般用的是每次完成都中断。SEQ2INT:序列发生器 SEQ2 完成一个序列转换时产生的中断。
跟工作模式的关系(呼应前面讲过的 ADC 工作模式):
- 两个序列发生器独立工作 → 可以分别产生
SEQ1INT和SEQ2INT; - 级联(cascade)模式 → 两个序列发生器合成一个 SEQ1,此时就只有
SEQ1INT了。
所以实际用中断时,一定要结合当前 ADC 的工作模式,判断哪个中断才会真正产生中断事件。
3.2 一个必须先厘清的概念
ADC 中断不是用来「启动」ADC 转换的。 前面讲过 ADC 的启动方式(软件触发、ePWM 的 SOC 触发、外部引脚/定时器触发等)。这里的中断,指的是:
转换完成之后 才产生
SEQ1INT/SEQ2INT这样的中断事件,然后 CPU 进中断去取结果、做处理(滤波、计算、控制等)。
别把"中断触发转换"和"转换完进中断"搞反了。
3.3 ADCINT = SEQ1INT OR SEQ2INT(28335 的新设计)
向量表里除了 SEQ1INT、SEQ2INT,还有个 ADCINT,而且很特别 ------你翻寄存器会发现,没有任何专门描述 ADCINT 的使能/标志/状态位。那它怎么用?
这是 28335(以及后续新 C2000 处理器)跟老芯片(如 2812)在 ADC 中断上的一个区别:
ADCINT其实就是SEQ1INT和SEQ2INT的「或(OR)」;- 只要
SEQ1INT使能了,当 SEQ1 产生中断事件时,ADCINT事件也跟着产生; - 同理,
SEQ2INT使能后,SEQ2 的中断事件也会让ADCINT产生; - 换句话说,只要 SEQ1 或 SEQ2 之一被使能并产生中断事件,
ADCINT就被使能、也产生中断事件。
所以它不需要单独的寄存器去控制 ,是硬件直接"或"出来的。理解这一点,就不会因为找不到 ADCINT 的使能位而困惑。
四、小结
本集虽然叫《ADC 的中断》,但顺带把 ADC 前端的两个关键问题也讲清了:
- 参考电压 :
ADCREFSEL选内部(默认)/外部(2.048/1.5/1.024 V);外部常用 2.048 V(TI REF3020),注意 0~3 V 输入范围与参考电压的缩放关系。 - 信号调理 :传感器信号常不在 0~3 V 内,用运放 + 虚短虚断把它搬进 ADC 量程(例:±5 V → 0~3 V,
Vout = 16/53·(Vin+5))。 - ADC 中断 :向量表三兄弟
SEQ1INT(1.1)、SEQ2INT(1.2)、ADCINT(1.6);其中ADCINT = SEQ1INT OR SEQ2INT,无独立控制寄存器;中断是转换完成后 才进,用来取数处理,不是用来启动转换;级联模式下只有SEQ1INT。
下一集(第 20 集)才会把 ePWM 触发 + ADC 转换 + ADC 中断 真正写成一个能跑的「ADC 采样程序」。