TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用
TMS320F280025 模数转换器ADC原理分析与应用
`
文章目录
- TMS320F280025 模数转换器ADC原理分析与应用
- 逐次比较型ADC和双积分型ADC工作原理
- 逐次比较型 ADC
- 双积分型 ADC
- 280025ADC
- ADC原理分析
- ADC时钟
- SOC
- SOC内部原理
- ADC触发方式
- ADC采集(采样和保持)窗口
- 通道寄生电容
- 基准电压发生器模块
- 外部参考模式
- 内部参考模式
- 选择参考模式
- 后处理模块
- 偏移校正
- 设定值计算误差
- 限制和过零检测
- 触发到采样延迟捕获
- ADC优先级
- 轮转优先级
- 高优先级
- ADC中断
- 中断溢出
- 继续中断模式
- 早期中断配置模式
- ADC模拟引脚
- ADC(定时器触发采样)使用
- AdcDriver.c
- AdcDriver.h
- CPUtimers.c
- CPUtimers.h
逐次比较型ADC和双积分型ADC工作原理
逐次比较型 ADC
采用逐次逼近法的 AD 转换器是有一个比较器、 DA 转换器、 缓冲寄存器和控制逻辑电路组成, 如下图所示:

基本原理是: 从高位到低位逐次试探比较, 就像用天平秤物体, 从重到轻逐级增减砝码进行试探。 逐次逼近法的转换过程是: 初始化时将逐次逼近寄存器各位清零, 转换开始时, 先将逐次逼近寄存器最高位置 1, 送入 DA 转换器, 经 DA转换后生成的模拟量送入比较器, 称为 U0, 与送入比较器的待转换的模拟量 Ux进行比较, 若 U0<Ux, 该位 1 被保留, 否则被清除。 然后再将逐次逼近寄存器次高位置 1, 将寄存器中新的数字量送 DA 转换器, 输出的 U0 再与 Ux 比较, 若 U0<Ux,该位 1 被保留, 否则被清除。 重复此过程, 直至逼近寄存器最低位。 转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器, 得到数字量的输出。 逐次逼近的操作过程是在一个控制电路的控制下进行的。
双积分型 ADC
采用双积分法的 AD 转换器由电子开关、 积分器、 比较器和控制逻辑等部件组成。 如下图所示:

其基本原理: 将输入电压变换成与其平均值成正比的时间间隔, 再把此时间间隔转换成数字量, 属于间接转换。 双积分法 AD 转换的过程是: 先将开关接通待转换的模拟量 Vi, Vi 采样输入到积分器, 积分器从零开始进行固定时间 T 的正向积分, 时间 T 到后, 开关再接通与 Vi 极性相反的基准电压 Vref, 将 Vref输入到积分器, 进行反向积分, 直到输出为 0V 时停止积分。 Vi 越大, 积分器输出电压越大, 反向积分时间也越长。 计数器在反向积分时间内所计的数值, 就是输入模拟电压 Vi 所对应的数字量, 实现了 AD 转换。
280025ADC
TMS32F280025有两个逐次比较型ADC,分别是ADCA和ADCC,每个ADC都具有以下特点:
•12位分辨率
•比率计VREFHI设定的外部引用和VREFLO引脚
•选择内部参考2.5 v和3.3 v
•单端信号转换
•输入多路复用器,最多16个通道
•16单独结果可寻址寄存器
•16 可配置的soc
•多个触发源
•四灵活的PIE中断
•可配置中断位置
•四个PBB后处理模块,每个具有:
-偏移校准
-误差校准
-高,低和过零比较,具有中断和ePWM跳闸能力
-触发到样本延迟捕获
•优先级:轮转/高优先级
•电压处理成转换结果需要大约10.5个ADCCLK
ADC框图如图所示

1.使用ADC时设置好参考电压,配置ADC SOC通道、采样周期、触发方式;
2.当设置的触发方式触发ADC时,模拟信号首先到ADC校准和控制模块,该模块可以直接产生ADC中断;
3.然后模拟信号到输入电路模块,经过采样保持电路进行采样;
4.采样后经过转化器得到数字量;
5.该数字量会保存在对应的ADC结果寄存器中,每个SOC对应一个结果寄存器,读取该寄存器即可得到ADC转化结果,也可以用过后处理模块进行后处理再输出
ADC原理分析
ADC框图分为以下几个模块:模拟数字控制逻辑、后处理模块、模拟-数字核心模块、基准电压发生器模块、模拟系统控制、输入电路、转换、SOCx (0-15)

ADC时钟
基本ADC时钟直接由系统时钟(SYSCLK)提供。SYSCLK用于生成ADC采集窗口。寄存器ADCCTL2有一个决定adccclk的precale字段。ADCCLK用于对转换器进行时钟控制,仅在转换阶段有效。在所有其他时间,包括在采样和保持窗口期间,ADCCLK信号被门控关闭。
核心需要大约10.5个ADCCLK周期来将电压处理成转换结果。用户必须确定所需的获取窗口的持续时间
为ADCCTL2确定一个合适的值。PRESCALE,请参阅设备数据手册以确定SYSCLK和ADCCLK的最大频率
SOC
SOC在框图中的位置

SOC内部原理


每个ADC的SOC都可以设置对应的触发方式、通道和采样周期
ADC触发方式
每个SOC可以配置为在许多输入触发器之一上启动。SOCx的主要触发器选择在ADCSOCxCTL中。TRIGSEL寄存器,可以选择:
• Disabled (software only)
•CPU定时器0/1/2
•GPIO:输入X-Bar INPUT5
•ADCSOCA或ADCSOCB从每个ePWM模块
此外,每个SOC也可以在ADCINT1或ADCINT2标志设置时触发。这是通过配置ADCINTSOCSEL1寄存器(用于SOC0到SOC7)或ADCINTSOCSEL2寄存器(用于SOC8到SOC15)来实现的。
ADC采集(采样和保持)窗口
外部信号源在快速有效地驱动模拟信号的能力上各不相同。为了达到额定分辨率,信号源需要对ADC核心中的采样电容充电至信号电压的0.5 lbs以内。采集窗口是采样电容器允许充电的时间量,可通过ADCSOCxCTL配置为SOCx.ACQPSregister。
ACQPS是一个9位寄存器,可以设置为0到511之间的值,导致采集窗口持续时间:
采集窗口= (ACQPS + 1)∙(系统时钟(SYSCLK)周期时间)
•采集窗口持续时间基于系统时钟(SYSCLK),而不是ADC时钟(ADCCLK)。
•选择的采集窗口持续时间必须至少与一个ADCCLK周期一样长。
•数据表指定最小采集窗口持续时间(以纳秒为单位)。用户负责选择满足此要求的获取窗口持续时间。
通道寄生电容


每个通道的寄生电容不一样,所以如果采样速率过高的话,注意选用的通道的寄生电容是否会影响采样
基准电压发生器模块

ADC的基准电压可以位内部电压也可以位外部电压
外部参考模式
ADC模块共享VREFHI和VREFLO输入。在外部参考模式下,这些引脚用作比率参考,以确定ADC转换输入范围。
•在没有外部VREFLO引脚的设备上,VREFLO内部连接到设备模拟地,VSSA。
•请参阅设备数据表以确定VREFHI和VREFLO的允许电压范围。
•外部参考模式需要VREFHI引脚上的外部电容。具体数值请参见设备数据手册。
内部参考模式
在内部参考模式下,器件驱动电压到VREFHI引脚上。然后,VREFHI和VREFLO引脚设置ADC转换范围。
内部参考电压可配置为2.5V或1.65V。当选择1.65V内部参考电压时,在转换前将ADC输入信号内部除以2,有效地使ADC转换范围从VREFLO到3.3V。
内部参考模式还需要VREFHI引脚上的外部电容。具体数值请参见设备数据手册。
选择参考模式
电压参考模式必须通过使用ADC_setVREF()或SetVREF()函数来配置,具体取决于使用的头文件,在C2000Ware中提供。使用这些函数中的任何一个都可以确保在ADC修剪寄存器中加载正确的修剪。此函数必须在设备复位后至少调用一次。
不要通过直接写入ANAREFCTL寄存器来配置电压参考模式。
后处理模块

作用如下:
偏移校正
去除可能由外部传感器和信号源引起的与ADCIN通道相关的偏移量零开销;保存周期
设定值计算误差
减去一个参考值,该参考值可用于从设定点或预期值自动计算误差,减少样本输出延迟和软件开销
限制和过零检测
自动执行高/低限制或过零检查,可以产生一个行程到ePWM和/或中断减少样本到ePWM的延迟和减少软件开销;在没有CPU干预的情况下,基于超出范围的ADC转换触发ePWM
触发到采样延迟捕获
能够记录SOC被触发和开始采样之间的延迟,允许软件技术减少延迟错误
ADC优先级
轮转优先级
当同时设置多个SOC标志时,优先级的两种形式之一决定转换顺序。默认的优先级方法是轮循。在这个方案中,没有SOC具有比其他SOC更高的固有优先级。优先级取决于轮循指针(RRPOINTER)。反映在ADCSOCPRIORITYCTL寄存器中的RRPOINTER指向最后转换的SOC。最高优先级的SOC被分配给下一个比RRPOINTER值大的值,在SOC15之后绕回SOC0。在重置时,该值为16,因为0表示已经发生了转换。当RRPOINTER等于16时,优先级最高的是SOC0。当ADC模块复位或复位值被写入SOCPRICTL寄存器时,RRPOINTER复位。通过写入和清除与ADC实例对应的SOFTPRES位来复位ADC模块。

高优先级
ADCSOCPRIORITYCTL寄存器中的SOCPRIORITY字段可用于从单个soc分配高优先级到所有soc。当配置为高优先级时,SOC在任何当前转换完成后中断轮询轮,并插入作为下一个转换。转换完成后,在转换中断的地方继续轮询轮。如果同时触发两个高优先级的SOC,则优先级低的SOC。
高优先级模式首先分配给SOC0,然后按数字顺序递增。写入SOCPRIORITY字段的值定义了第一个优先级不高的SOC。换句话说,如果将值4写入SOCPRIORITY,则将SOC0、SOC1、SOC2和SOC3定义为高优先级,其中SOC0最高。

ADC中断
每个SOC都有相应的转换结束(EOC)信号。此EOC信号可用于触发ADC中断。ADC可以配置为在采集窗口的末端或电压转换的末端产生EOC脉冲。这是使用ADCCTL1寄存器中的INTPULSEPOS位配置的。参见15.12节了解EOC脉冲的准确位置。
每个ADC模块有4个可配置的ADC中断。这些中断可以由16个EOC信号中的任何一个触发。可以直接读取每个ADCINT的标志位,以确定相关的SOC是否完成,或者中断是否可以传递给PIE
ADCCTL1.ADCBSY位清楚并不表示一组soc中的所有转换都已完成,仅表示ADC准备处理下一个转换。要确定一个SOC序列是否完成,将ADCINT标志链接到序列中的最后一个SOC,并监视该ADCINT标志

中断溢出
如果EOC信号在ADCINTFLG寄存器中设置了一个标志,但该标志已经设置,则会发生中断溢出。
默认情况下,溢出中断不传递给PIE模块。当ADCINTFLG寄存器中的给定标志发生溢出时,将设置ADCINOVF寄存器中的相应标志。此溢出标志仅用于检测是否发生溢出;该标志不会阻止进一步的中断传播到PIE模块。
当ADC中断溢出发生时,应用程序必须检查ISR内或后台循环中适当的ADCINTOVF标志,并在检测到溢出时采取适当的行动。下面的代码片段演示了在尝试清除ADCINT标志后,如何在ISR内检查ADCINTOVF标志。
// Clear the interrupt flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag for ADC-A
// Check if an overflow has occurred
if(1 == AdcaRegs.ADCINTOVF.bit.ADCINT1) //ADCINT overflow occurred
{AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1 //Clear overflow flag AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1 //Re-clear ADCINT flag
}
//
// Clear the interrupt flag
//
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
//
// Check if an overflow has occurred
//
if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
{ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
继续中断模式
ADCINTSEL1N2和ADCINTSEL3N4寄存器中的INTxCONT位配置了当ADCINTFLG尚未从先前中断中清除时如何处理中断。默认情况下禁用此模式,并且不会向PIE发出额外的重叠中断。通过激活此模式,ADC中断总是到达PIE。如果在设置ADCINTFLG时发生中断,那么无论INTxCONT位的配置如何,ADCINTOVF寄存器都保持设置。
早期中断配置模式
启用早期中断模式可以允许应用程序在ADC结果准备好之前进入ADC中断服务程序。这允许应用程序做任何必要的前期工作,以便应用程序可以在ADC结果可用时立即对ADC结果采取行动。如果早期中断的时机太早,则应用程序需要浪费时间,直到更新的ADC结果可用为止。为了防止这种情况,ADC中断进入早期中断模式的时间可以通过ADCINTCYCLE寄存器中的DELAY字段进行配置。
•要使用可配置的中断时间,ADC必须处于早期中断模式。为了实现这一点,在ADCCTL1中将位INTPULSEPOS清除为0。
•ADCINTCYCLE寄存器中的DELAY值设置了在ADCINT标志被设置之前SOC脉冲下降沿之后额外的SYSCLK周期数。
•如果DELAY值超过EOC,则ADC中断与EOC一起产生。
•当INTPULSEPOS设置为1时,将值写入DELAY对中断的产生没有任何影响。
ADC模拟引脚
ADC引脚分配如下表

ADC(定时器触发采样)使用
AdcDriver.c
#include "main.h"//
// Defines
//
#define RESULTS_BUFFER_SIZE 5//
// Globals
//
相关文章:
TI DSP TMS320F280025 Note14:模数转换器ADC原理分析与应用
TMS320F280025 模数转换器ADC原理分析与应用 ` 文章目录 TMS320F280025 模数转换器ADC原理分析与应用逐次比较型ADC和双积分型ADC工作原理逐次比较型 ADC双积分型 ADC280025ADCADC原理分析ADC时钟SOCSOC内部原理ADC触发方式ADC采集(采样和保持)窗口通道寄生电容基准电压发生器模…...
【C++前缀和】2845. 统计趣味子数组的数目|2073
本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode 2845. 统计趣味子数组的数目 难度分:2073 给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k 。 请你找出并统计数组…...
C++入门基础 (超详解)
文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …...
docker零基础入门教程
注意 本系列文章已升级、转移至我的自建站点中,本章原文为:Docker入门 目录 注意1.前言2.docker安装3.docker基本使用4.打包docker镜像5.docker进阶 1.前言 如果你长期写C/C代码,那你应该很容易发现C/C开源项目存在的一个严重问题ÿ…...
【Java SE 题库】移除元素(暴力解法)--力扣
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 题目 2. 解法(快慢“指针”) 3. 源码 4. 小结 1. 题目 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。元素的顺…...
linux文件编程_进程
1. 进程相关概念 面试中关于进程,应该会问的的几个问题: 1.1. 什么是程序,什么是进程,有什么区别? 程序是静态的概念,比如: 磁盘中生成的a.out文件,就叫做:程序进程是…...
java NIO实现UDP通讯
NIO Udp通讯工具类 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.util.Iterator;impo…...
ffmpeg如何实现视频推流?
FFmpeg是一个强大的多媒体框架,用于处理视频和音频数据。它包括了libavcodec(用于解码和编码)、libavformat(用于格式转换)、libavutil(提供一些辅助工具和函数)、libavfilter(用于音视频过滤)等多个库。 以下这些都是FFmpeg的特性 FFmpeg支持大量的音视频编解码器&…...
【HTML5】html5开篇基础(3)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
echarts实现3D柱状图(视觉层面)根据博主改编
https://blog.csdn.net/weixin_57798646/article/details/131067725 这是原贴 在这个基础上我需要实现 一根柱子 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf8"> </hea…...
【一篇文章理解Java中多级缓存的设计与实现】
文章目录 一.什么是多级缓存?1.本地缓存2.远程缓存3.缓存层级4.加载策略 二.适合/不适合的业务场景1.适合的业务场景2.不适合的业务场景 三.Redis与Caffine的对比1. 序列化2. 进程关系 四.各本地缓存性能测试对比报告(官方)五.本地缓存Caffine如何使用1. 引入maven依…...
OpenSource - 开源WAF_SamWaf
文章目录 PreSafeLine VS SamWaf开发初衷软件介绍架构界面主要功能 使用说明下载最新版本快速启动WindowsLinuxDocker 启动访问升级指南自动升级手动升级 在线文档 代码相关代码托管介绍和编译已测试支持的平台测试效果 安全策略问题反馈许可证书贡献代码 Pre Nginx - 集成Mod…...
旅游避坑指南
1.火车站旁白的小摊贩,还有周边的小饭店百分之百是黑店,不仅难吃要死而且巨黑!!! 可以地图上搜索附近的大型商超,例如泰安市的银座商超,里面的东西不仅好吃而且价格透明,还有很多当…...
矩阵系统源码搭建的具体步骤,支持oem,源码搭建
一、前期准备 明确需求 确定矩阵系统的具体用途,例如是用于社交媒体管理、电商营销还是其他领域。梳理所需的功能模块,如多账号管理、内容发布、数据分析等。 技术选型 选择适合的编程语言,如 Python、Java、Node.js 等。确定数据库类型&…...
正则表达式调试工具实战
正则表达式调试工具实战 1、新建工程QWidget工程工程名RegexTool 如果QT不会配置,请参考我的博客,QT配置 Widget.cpp 默认内容如下 2、主界面设计 三行两列,每行采用HBoxLayout作为行布局控件,内部一个Lable控件和一个TextEdit控件,采用VBoxLayout 控件包裹三个HBoxLa…...
SQL:函数以及约束
目录 介绍 函数 字符串函数 数值函数 日期函数 流程函数 约束 总结 介绍 说到函数我们都不陌生,在C,C,java等语言中都有库函数,我们在平时也是经常使用,函数就是一段代码,我们既可以自定义实现,又可以使用库里内置的函数;从来更加简洁方便的完成业务;同样的在SQL中也有…...
在Linux中将设备驱动的地址映射到用户空间
本期主题: MMU的简单介绍,以及如何实现设备地址映射到用户空间 往期链接: Linux内核链表零长度数组的使用inline的作用嵌入式C基础——ARRAY_SIZE使用以及踩坑分析Linux下如何操作寄存器(用户空间、内核空间方法讲解)…...
电脑自带dll修复在哪里,dll丢失的6种解决方法总结
在现代科技日新月异的时代,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们常常会遇到一些常见的问题,其中之一就是dll文件丢失或损坏。当这些dll文件丢失或损坏时,可能会导致某些应用程序无法…...
k8s基于nfs创建storageClass
首先安装nfs #服务端安装 yum install -y nfs-utils rpcbind #客户端安装 yum install -y nfs-utils #启动服务 并设置开启启动 systemctl start rpcbind && systemctl enable rpcbind systemctl start nfs && systemctl enable nfs #创建共享目录 mkdir -p /…...
Chrome无法拖入加载.crx扩展文件(以IDM为例)
问题原因:新版本的Chrome浏览器已不支持加载.crx文件 解决办法:将.crx文件压缩为.zip文件,解压缩后再加载到Chrome中 以IDM的.crx文件作为示例; IDM的.crx文件位于C:\Program Files (x86)\Internet Download Manager; 将IDMGCE…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
