【DSP】TMS320F28335的ADC模块

2023-10-27

一、功能说明

  • 12位内建采样保持的模数转换器
  • 模拟输入电平:0~3V
  • 16个转换通道
  • 最快转换时钟频率12.5MHz(奈奎斯特定则,25MHz最高能采样12.5MHz的信号)
  • 多触发源:软件、ePWM和GPIO
  • 两种采样模式:级联和双通道模式

软件设置流程

//1.ADC时钟使能
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//在InitSysCtrl()函数里
//2.时钟分频
EALLOW;
SysCtrlRegs.HISPCP.all = 0x3;//HSPCLK = SYSCLKOUT/2*HISPCP = 150/(2*3)   = 25.0 MHz
ADC_cal();
EDIS;
AdcRegs.ADCTRL3.all = 0x00E0;  // Power up bandgap/reference/ADC circuits
DELAY_US(ADC_usDELAY);         // Delay before converting ADC channels
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0;//Fclk = HSPCLK/(2*ADCCLKPS),但当ADCCLKPS=0时,Fclk = HSPCLK
AdcRegs.ADCTRL1.bit.CPS = 0x0;//ADCCLK = Fclk / (CPS+1)
//3.通道设置
//4.触发源设置
//5.中断源设置

二、模式说明

2.1 级联模式

//3.通道设置
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x1;//0-dual, 1-Cascaded
AdcRegs.ADCMAXCONV.all = 0x000F;       // Setup 16 conv's on SEQ
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // Setup ADCINA2 as 3rd SEQ conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // Setup ADCINA3 as 4th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // Setup ADCINA4 as 5th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // Setup ADCINA5 as 6th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // Setup ADCINA6 as 7th SEQ conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // Setup ADCINA7 as 8th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8; // Setup ADCINB0 as 9th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9; // Setup ADCINB1 as 10th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA; // Setup ADCINB2 as 11th SEQ conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB; // Setup ADCINB3 as 12th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC; // Setup ADCINB4 as 13th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD; // Setup ADCINB5 as 14th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE; // Setup ADCINB6 as 15th SEQ conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF; // Setup ADCINB7 as 16th SEQ conv.

2.2 双通道模式

//3.通道设置
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x0;//0-dual, 1-Cascaded
AdcRegs.ADCMAXCONV.all = 0x0077;       // Setup 8 conv's on SEQ1 and 8 conv's on SEQ2
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA1 as 2nd SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // Setup ADCINA2 as 3rd SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // Setup ADCINA3 as 4th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // Setup ADCINA4 as 5th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // Setup ADCINA5 as 6th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // Setup ADCINA6 as 7th SEQ1 conv.
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // Setup ADCINA7 as 8th SEQ1 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8; // Setup ADCINB0 as 1st SEQ2 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9; // Setup ADCINB1 as 2nd SEQ2 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA; // Setup ADCINB2 as 3rd SEQ2 conv.
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB; // Setup ADCINB3 as 4th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC; // Setup ADCINB4 as 5th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD; // Setup ADCINB5 as 6th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE; // Setup ADCINB6 as 7th SEQ2 conv.
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF; // Setup ADCINB7 as 8th SEQ2 conv.

三、触发源

//4.触发源设置
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;//软触发(用于级联、双通道1#)
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;//软触发(用于双通道2#)
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;//ePWM触发(用于双通道1#)
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 1;//ePWM触发(用于双通道2#)
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ = 1;//ePWM触发(用于级联)

四、中断源

//5.中断源设置
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //用于级联、双通道1#
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; //双通道2#

五、接收转换结果

5.1 中断式

/*
 * AD的外部中断程序【中等优先级】
 * 中断触发信号:EPWM
*/
interrupt void ADC_ISR(void)
{
  Voltage[0] = AdcRegs.ADCRESULT0 >>4;
  Voltage[1] = AdcRegs.ADCRESULT1 >>4;
  Voltage[2] = AdcRegs.ADCRESULT2 >>4;
  Voltage[3] = AdcRegs.ADCRESULT3 >>4;
  Voltage[4] = AdcRegs.ADCRESULT4 >>4;
  Voltage[5] = AdcRegs.ADCRESULT5 >>4;
  Voltage[6] = AdcRegs.ADCRESULT6 >>4;
  Voltage[7] = AdcRegs.ADCRESULT7 >>4;
  Voltage[8] = AdcRegs.ADCRESULT8 >>4;
  Voltage[9] = AdcRegs.ADCRESULT9 >>4;
  Voltage[10] = AdcRegs.ADCRESULT10 >>4;
  Voltage[11] = AdcRegs.ADCRESULT11 >>4;
  Voltage[12] = AdcRegs.ADCRESULT12 >>4;
  Voltage[13] = AdcRegs.ADCRESULT13 >>4;
  Voltage[14] = AdcRegs.ADCRESULT14 >>4;
  Voltage[15] = AdcRegs.ADCRESULT15 >>4;

  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  
  return;
}

5.2 查询式

while(AdcRegs.ADCST.bit.INT_SEQ1 == 0);
test[0] = AdcRegs.ADCRESULT0 >>4;
test[1] = AdcRegs.ADCRESULT1 >>4;
test[2] = AdcRegs.ADCRESULT2 >>4;
test[3] = AdcRegs.ADCRESULT3 >>4;
test[4] = AdcRegs.ADCRESULT4 >>4;
test[5] = AdcRegs.ADCRESULT5 >>4;
test[6] = AdcRegs.ADCRESULT6 >>4;
test[7] = AdcRegs.ADCRESULT7 >>4;
test[8] = AdcRegs.ADCRESULT8 >>4;
test[9] = AdcRegs.ADCRESULT9 >>4;
test[10] = AdcRegs.ADCRESULT10 >>4;
test[11] = AdcRegs.ADCRESULT11 >>4;
test[12] = AdcRegs.ADCRESULT12 >>4;
test[13] = AdcRegs.ADCRESULT13 >>4;
test[14] = AdcRegs.ADCRESULT14 >>4;
test[15] = AdcRegs.ADCRESULT15 >>4;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;// Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

六、其他设置

6.1 运行模式
运行模式分为start-stop和continuous两种模式,通过以下代码配置:

AdcRegs.ADCTRL1.bit.CONT_RUN = 0x0; //0-start stop mode; 1-Continuous conversion mode

start-stop模式下,AD转换结束后等待触发信号,才开始进行下一次的AD转换;
continuous模式下,AD转换结束后无需等待触发信号,立即开始下一次的AD转换。
6.2 SOC脉宽设置

AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF;//Acquisition window size

SOC脉宽是(ACQ_PS + 1)倍的ADCLK周期。
6.3 复位启动

AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0x0;

仅用在continuous模式里面,如果该位为0,则新的SOC来时从复位状态启动,如SEQ1和级联模式下,重新从CONV00开始;如果该位为1,则不会从复位状态开始,直接从现在的转换序列开始,直到最后停止。

七、疑问

  1. 什么时候触发中断?
    答:当SEQ_CNTR = 0时,INT_SEQ = 1,且产生中断。否则,INT_SEQ = 0。

  2. ePWM触发双通道ADC,只能转换一个通道,什么原因?
    答:ACQ_PS的值太大,改小后,触发脉冲变小,可实现双通道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【DSP】TMS320F28335的ADC模块 的相关文章

  • python实现文件(夹)剪切

    自己的需求是这样的 有a和b两个目录 a目录下的文件 夹 要剪切到b目录下 我用下面这种形式来表达需求 不然说得比较乱 需求如下 a目录 1 文件 1 是日志文件 1 文件大小 lt 20m 跳过 2 日志文件 gt 20m 复制名加上当天

随机推荐

  • ssh连接不上Linux怎么办

    原因 被防火墙挡掉 ssh服务配置文件中的参数是否拒绝了连接等等 解决方法 一 开启SSH 以root用户登录Linux 打开终端 运行 etc init d sshd restrat 二 关闭防火墙 1 在终端运行 setup 2 选择
  • es6 处理数组的方法汇总

    目录 创建数组静态方法 ES6 Array from Array of 检测数组方法 instanceof Array isArray 迭代器方法 ES6 keys values entries 复制和填充方法 ES6 Array fill
  • 逻辑回归输出的值是真实的概率吗?

    本文只在博客基础上 在三 指数分布族中有所改动 逻辑回归作为被广泛使用的二分类模型 面试中自然是不可缺少的 但要深刻理解逻辑回归又不是那么容易的 比如说 逻辑回归输出的值是0到1之间的值 这个值是真实的概率吗 逻辑回归为什么要选择sigmo
  • layui树形美化_Layui导航树美化 - walkwithdream的个人空间 - OSCHINA - 中文开源技术交流社区...

    左侧导航 使用方法 skin sidebar layui tree skin sidebar li i color rgba 255 255 255 7 display none layui tree skin sidebar li a c
  • 学习Java——为什么java只有值传递

    目录 Java的求值策略 Java中的对象传递 值传递和共享对象传递冲突吗 总结 参考资料 Java的求值策略 前面我们介绍过了传值调用 传引用调用以及传值调用的特例传共享对象调用 那么 Java中是采用的哪种求值策略呢 很多人说Java中
  • 最优乘车问题/dijsktra最短路径算法

    城是一个旅游胜地 每年都有成千上万的人前来观光 为方便游客 巴士公司在各个旅游景点及宾馆 饭店等地都设置了巴士站 并开通了一些单向巴士线路 每条单向巴士线路从某个巴士站出发 依次途径若干个巴士站 最终到达终点巴士站 阿昌最近到 城旅游 住在
  • typora笔记工具使用详解

    Markdown使用笔记 首先本地使用安装教程 百度搜索typora第一个就是官网 地址为 typora下载地址 下载步骤如下 简单使用教程 3 Markdown标题 使用 号可表示 1 6 级标题 一级标题对应一个 号 二级标题对应两个
  • 读取.ini文件乱码的解决办法

    void CGetConfigInfo GetValueByKey QSettings seting const QString key QString value if seting nullptr value seting gt val
  • Memory write error at 0x100000. MMU section translation fault

    在使用vitis2020 2 JTAG调试MZ702P板子的时候会报下面的错误 原因都是启动模式没有设置到JTAG启动或SD启动 记得之前用SDK的时候好像没有这个问题 记录一下 备忘 Downloading Program F FPGA
  • ONVIF对讲功能漫谈

    ONVIF对讲功能漫谈 前言 一 onvif对讲功能和onvif协议关系大吗 二 如何上报设备支持onvif对讲功能呢 三 onvif协议中哪个接口上报音频解码配置 四 献上抓包报文 前言 本篇文章尝试使用提问的方式来分享onvif对讲功能
  • java类型信息与反射

    初步理解 https www cnblogs com xuanlin666 p 10826809 html
  • 使用Electron开发过程中不能使用remote模块解决

    在 electron 渲染进程中引入BrowserWindow报错 const BrowserWindow require electron remote BrowserWindow 报错 Cannot read properties of
  • c++ADO编程-connection对象

    Connection对象的属性有如下几个 1 ConnectionString属性 是连接字符串 通过传递包含一系列由分号分隔的 argument value 语句的详细连接字符串 可指定用于建立连接数据源的信息 连接串格式根据数据源的不同
  • 3.2面向对象

    面向对象与面向过程的区别 面向过程指的是工作过程如何执行 而面向对象指的是工作该让谁来完成 面向对象三大思想 OOA 面向对象分析 Object Oriented Analysis OOD 面向对象设计 Object Oriented De
  • 剑指 Offer 15. 二进制中1的个数(java+python)

    编写一个函数 输入是一个无符号整数 以二进制串的形式 返回其二进制表达式中数字位数为 1 的个数 也被称为 汉明重量 提示 请注意 在某些语言 如 Java 中 没有无符号整数类型 在这种情况下 输入和输出都将被指定为有符号整数类型 并且不
  • 一万字关于java数据结构堆的讲解,让你从入门到精通

    目录 java类和接口总览 队列 Queue 1 概念 2 队列的使用 以下是一些常用的队列操作 1 入队操作 2 出队操作 3 判断队列是否为空 4 获取队列大小 5 其它 优先级队列 堆 1 优先级队列概念 Java中的Priority
  • uvicorn启动fastapi项目实现热部署

    一 创建在不同的文件中 通过import引入 将app对象定义在一个模块中 如app py 在主模块 如main py 中导入app并运行 app py from fastapi import FastAPI app FastAPI mai
  • 真题详解(关系模型)-软件设计(六十六)

    真题详解 ICMP 软件设计 六十五 https blog csdn net ke1ying article details 130475620 2017年下半年 内存按字节编址 若存储容量为32K 8bit的存储芯片构成地址从A0000H
  • C++基础知识 - 子类的析构函数

    子类的析构函数 注意 为了防止内存泄露 最好是在基类析构函数上添加virtual关键字 使基类析构函数为虚函数 目的在于 当使用delete释放基类指针时 会实现动态的析构 如果基类指针指向的是基类对象 那么只调用基类的析构函数 如果基类指
  • 【DSP】TMS320F28335的ADC模块

    一 功能说明 12位内建采样保持的模数转换器 模拟输入电平 0 3V 16个转换通道 最快转换时钟频率12 5MHz 奈奎斯特定则 25MHz最高能采样12 5MHz的信号 多触发源 软件 ePWM和GPIO 两种采样模式 级联和双通道模式