DSP_TMS320F28377D_ADC学习笔记

news2024/9/21 14:49:00

前言

DSP各种模块的使用,基本上就是 GPIO复用配置、相关控制寄存器的配置、中断的配置。本文主要记录本人对ADC模块的学习笔记。TMS320F28377D上面有24路ADC专用IO,这意味着不需要进行GPIO复用配置。 只需要考虑相关控制寄存器和中断的配置。看代码请直接跳到最后。

正文

单端模式/差分模式

在放代码之前,先谈谈TMS320F28377D的ADC里面非常容易搞蒙的一点:单端模式/差分模式

根据TMS320F28377D 的reference的介绍(pg:1554),ADC模块有以下特性 :

差分信号转换 仅限16位模式

单端信号转换 仅限12位模式

单端的话,就能有16通道(12位)|  差分的话,就能有8通道(16位)。

很多人都对差分模式下DSP的代码应该如何编写还不够理解,相信看了下面这个帖子会有启发。TMS320F28388D: 16位差分采样 - C2000™︎ 微控制器论坛 - C2000 微控制器 - E2E™ 设计支持 (ti.com)

我怕帖子被删除了,还是复述点关键的东西吧。 下表不仅给出了单端/差分在16位模式下的解算方式,也间接说明了单端也并非是 12-bit mode only,单端也是可以用16位的。

而下面两条评论,则清晰的解释了差分模式下,如何得到ADC的采集结果 

最后,结合一张硬件原理图,基本上已经一目了然了 

代码理解

下面给出ADC控制寄存器的相关配置代码,并进行解释。

    EALLOW;
    AdcaRegs.ADCCTL2.bit.PRESCALE       = 6;    // Set ADCCLK divider to /4
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_SINGLE);
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS    = 1;
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ       = 1;
    DELAY_US(1000);
    EDIS;

AdcaRegs.ADCCTL2.bit.PRESCALE       = 6;

本行代码是ADC的时钟预分频,参考手册pg1597可以看到,6表示4分频,此行代码是参考Ti的官方例程里面的代码。

 

AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_SINGLE);

此行代码是设置ADC模块的A组ADCA(还有ADCB、ADCC、ADCD)的分辨率,和单端/差分模式。正文开篇也提到了,单端模式也是可以使用16位的分辨率的。 当然我们也可以把ADCA配置成差分模式,然后使用16位的分辨率,

AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_DIFFERENTIAL);

但,后续对ADC转换结果的解算需要做相应的修改,参考前面放的解算表。

关于下面三行代码

AdcaRegs.ADCCTL1.bit.INTPULSEPOS    = 1;
AdcaRegs.ADCCTL1.bit.ADCPWDNZ       = 1;
DELAY_US(1000);

也是参考Ti的官方例程里面的代码。

第一行AdcaRegs.ADCCTL1.bit.INTPULSEPOS    = 1;是配置 ADC中断脉冲位置。Pg1596

 

0采集窗口结束时产生中断脉冲 | 1在转换结束时产生中断脉冲。结果将在1个或多个周期后锁定。 不纠结,抄就完了。

第二行AdcaRegs.ADCCTL1.bit.ADCPWDNZ       = 1;是打开ADC的电源

第三行DELAY_US(1000);是延迟1ms等待ADC上电成功。 

下面给出ADC的SOC及中断相关寄存器的配置代码,并给出解释。


    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL       = 0;    // SOC0 will convert internal connection A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS       = 63;   // Sample window is 64 SYSCLK cycles
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA  触发源的选择

    AdcaRegs.ADCSOC1CTL.bit.CHSEL       = 2;    // SOC1 will convert internal connection A2
    AdcaRegs.ADCSOC1CTL.bit.ACQPS       = 63;   // Sample window is 65 SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA 触发源的选择

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL   = 1;    // End of SOC1 will set INT1 flag
    AdcaRegs.ADCINTSEL1N2.bit.INT1E     = 1;    // Enable INT1 flag
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Make sure INT1 flag is cleared
    EDIS;

 

首先我们来解释这三行

AdcaRegs.ADCSOC0CTL.bit.CHSEL       = 0;    // SOC0 will convert internal connection A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS       = 63;   // Sample window is 64 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA  触发源的选择

 第一行AdcaRegs.ADCSOC0CTL.bit.CHSEL       = 0; 表示ADCa的SOC0信道的选择是ADCIN0(单端模式)或者 ADCIN0ADCIN1组合的差分模式。 SOCstart of conversion),相当于:【ADCIN0单端模式】 或【ADCIN0ADCIN1组合的差分模式】的转换结果,将会保存到 AdcaResultRegs.ADCRESULT0中。

第二行AdcaRegs.ADCSOC0CTL.bit.ACQPS       = 63;表示SOC0的捕获预分频设置成了64个周期,主要控制该SOC的采样和保持窗口的时长。此行也是参考Ti官方例程里面的程序。 官方推荐,12位分辨率ACQPS=14// 75 ns16位分辨率ACQPS=63// 320 ns

第三行AdcaRegs.ADCSOC0CTL.bit.TRIGSEL     = 0x5; 表示SOC0触发源的选择。

 我们的系统要用PWM去控制电机的,所以配置了用PWM去作为SOC0的触发源。也可以直接写某个寄存器(ADCSOCFRC1)触发,写用定时器触发。这些方式可以参考Ti的官方例程。

下面,我们来解释中断相关的这三行代码

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL   = 1;    // End of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E     = 1;    // Enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Make sure INT1 flag is cleared

第一行:AdcaRegs.ADCINTSEL1N2.bit.INT1SEL   = 1;表示当SOC1转换结束后,才给出ADCa INT1的中断信号,然后产生中断, 如果配置成 = 7; 那就得等SOC7转换结束后,才给ADCa INT1的中断信号。

第二行:AdcaRegs.ADCINTSEL1N2.bit.INT1E     = 1;  使能ADCaINT1中断。

第三行:AdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1; 清空中断标志

代码整理

下面将所有代码整理到一起,一便借鉴,其中也包含ADC的中断配置,以及中断处理函数的定义。

void adcinterruptinit(void){
    // ADC
    EALLOW;     // 设置中断入口函数
        PieVectTable.ADCA1_INT = &ADCaHandler;
    EDIS;

    PieCtrlRegs.PIEIER1.bit.INTx1   = 1;    // 使能PIE中断  ADCa

    IER |= M_INT1;
}



interrupt void ADCaHandler(void){

// AdcaResultRegs.ADCRESULT0
// AdcaResultRegs.ADCRESULT1

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Clear INT1 flag
    PieCtrlRegs.PIEACK.all  = PIEACK_GROUP1;
}


void adc_register_init(void){

    EALLOW;
    AdcaRegs.ADCCTL2.bit.PRESCALE       = 6;    // Set ADCCLK divider to /4
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_16BIT, ADC_SIGNALMODE_SINGLE);
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS    = 1;
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ       = 1;
    DELAY_US(1000);
    EDIS;

    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL       = 0;    // SOC0 will convert internal connection A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS       = 63;   // Sample window is 64 SYSCLK cycles
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA  触发源的选择

    AdcaRegs.ADCSOC1CTL.bit.CHSEL       = 2;    // SOC1 will convert internal connection A2
    AdcaRegs.ADCSOC1CTL.bit.ACQPS       = 63;   // Sample window is 65 SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA 触发源的选择

    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL   = 1;    // End of SOC1 will set INT1 flag
    AdcaRegs.ADCINTSEL1N2.bit.INT1E     = 1;    // Enable INT1 flag
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Make sure INT1 flag is cleared
    EDIS;
}

感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年湖北住建厅八大员各岗位题库精准小题库-启程别

2023年湖北住建厅八大员各岗位题库精准小题库-启程别 住建厅八大员(施工员、质量员、资料员、材料员、机械员、标准员、劳务员) 各岗位题库分2种: 1.住建厅八大员报名之后会有培训任务,完成培训任务学习才能安排考试,…

番外10:使用ADS对射频功率放大器进行非线性测试2(使用带宽20MHz的64QAM信号进行ACLR、EVM、CCDF测试)

番外10:使用ADS对射频功率放大器进行非线性测试2(使用带宽20MHz的64QAM信号进行ACLR、EVM、CCDF测试) 1、基本理论 功率放大器的非线性性能十分重要,特别是对于当前广泛使用的移动设备。由于其各种复杂的信号调制,功…

大数据系统重点

第一章 大数据计算系统概述 1 大数据计算框架概述 计算框架: 一种抽象,在其中提供相应的通用功能供用户编写代码以实现具体功能,从而形成面向应用的软件。 大数据计算框架:面向大数据的计算框架。 Hadoop Hadoop的运行过程 Hadoop的详细…

Android 9.0系统源码_通知服务(三)应用发送状态栏通知的流程

前言 应用发送一个显示在状态栏上的通知,对于移动设备来说是很常见的一种功能需求,本篇文章我们将会结合Android9.0系统源码具体来分析一下,应用调用notificationManager触发通知栏通知功能的源码流程。 一、应用触发状态栏通知 应用可以通…

专题:一看就会的C++类模板讲解 (1)

目录 一.类模板的作用 二.类模板的定义: 三.类模板的声明格式: 四.类模板对象 五.再举一个例子 一.类模板的作用 面向对象的程序设计编程实践中,我们可能会面临这样的问题:要实现比较两个数的大小。明明比较两个数的方法都一样…

小米mix2s刷win11和android双系统

在给电脑安装系统的过程中,可能会因为各种原因出现windows无法安装的情况,我在给小米mix2s安装win11时发现出现了“计算机意外地重新启动或遇到错误,windows无法安装”的情况,下面就来教一下大家两种解决方法,希望可以…

进行新类检测以及概念漂移适应的半监督分类框架SACCOS论文阅读笔记

介绍 本文主要想解决基于聚类的概念漂移检测方法中常做出的强假设问题,即假设同类比较接近,异类比较远离,并且还假设新类别出现时通常会连续大量出现。 针对这些问题,本文提出了一种基于数据流的半监督自适应分类框架SACCOS&…

程序员看过都说好的资源网站,看看你都用过哪些?

程序员必备的相关资源网站一.图片专区1.表情包(1)发表情(2)逗比拯救世界(3)搞怪图片生成(4)哇咔工具2.图标库(1)Font Awesome(2)iconf…

基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAwesome

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 目录 六、第三方图标库FontAwesome 1 安装FontAwesome 解决报…

vulnhub靶场NAPPING: 1.0.1教程

靶场搭建靶机下载地址:Napping: 1.0.1 ~ VulnHub直接解压双击ova文件即可使用软件:靶机VirtualBox,攻击机VMware攻击机:kali信息收集arp-scan -l上帝之眼直接来看看网站可以注册账号,那就先试试。注册完后登入哦。要输…

阿里面试之Hr面,这个套路把我坑惨了......

作为技术类的测试工程师面试,往往要经过多次面试才能拿到心仪的offer,这里面有技术一面、二面…,甚至总监面等,还有一个必不可少的就是HR面,一般HR会出现在你面试的最前面和最后面,前面是了解你的基本情况&…

NCRE计算机等级考试Python真题(六)

第六套试题1、算法的时间复杂度是指A.执行算法程序所需要的时间B.算法程序的长度C.算法程序中的指令条数D.算法执行过程中所需要的基本运算次数正确答案: D2、下列关于栈的叙述中正确的是A.在栈中只能插入数据B.在栈中只能删除数据C.栈是先进先出的线性表D.栈是先进…

JavaEE简单示例——MyBatis多对多关联映射

简单介绍: 在实际的开发中,多对多的查询也是非常常见的。比如一个订单可以有很多的商品,而一个商品也可以被很多的订单所包含,而这种时候,如果我们有需求查询某一个订单内包含的所有商品;或者查询购买这个…

本地启动nacos注册服务

1.下载启动nacos(我的路径2.D:\nacos-server-2.0.0\nacos\bin) 2.单点模式启动 startup.cmd -m standalone 3.打开本地服务mysql、redis 4.配置nacos Nacos <1>创建命名空间&#xff0c;名称和项目pom一致 <2>ncaos导入配置或新建配置 <3>修改配置&#x…

Java培训:深入解读函数式接口

函数式编程是一种编程规范或一种编程思想&#xff0c;简单可以理解问将运算或实现过程看做是函数的计算。 Java8为了实现函数式编程&#xff0c;提出了3个重要的概念&#xff1a;Lambda表达式、方法引用、函数式接口。现在很多公司都在使用lambda表达式进行代码编写&#xff0c…

花7000报了培训班,3个月后我成功“骗”进了阿里,月薪拿16K....

“月薪4000元不如报名学IT&#xff0c;挑战年薪百万”这是大多数培训班在互联网上宣传的口号&#xff0c;简单的16个字却戳中了很多人的痛点&#xff0c;同龄人买车买房&#xff0c;自己却拿着微薄的工资连好一点的房子都租不起&#xff0c;这句口号 彻底激起了底层员工的焦虑&…

Spring上下文生命周期

基于入口来分析 import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;Configuration ComponentScan public cl…

飞行机器人专栏(十)-- 异构多视角视觉系统

感知系统架构为满足天空端主控制器的诸如RGB-D图像处理等大容量数据吞吐、高速并行计算、实时运动控制以及通信和可视化任务的计算算力需求&#xff0c;同时优化功耗表现&#xff0c;采用了结构紧凑、功耗表现优异的边缘计算硬件NVIDA IJetson AGXOrin 。该开发者套件包含高性能…

Python学习笔记202302

1、numpy.empty 作用&#xff1a;根据给定的维度和数值类型返回一个新的数组&#xff0c;其元素不进行初始化。 用法&#xff1a;numpy.empty(shape, dtypefloat, order‘C’) 2、logging.debug 作用&#xff1a;Python 的日志记录工具&#xff0c;这个模块为应用与库实现了灵…

可用于标记蛋白质216699-36-4,6-ROX,SE,6-羧基-X-罗丹明琥珀酰亚胺酯

一.6-ROX&#xff0c;SE产品描述&#xff1a;6-羧基-X-罗丹明琥珀酰亚胺酯&#xff08;6-ROX&#xff0c;SE&#xff09;是一种用于寡核苷酸标记和自动DNA测序的荧光染料&#xff0c;可用于标记蛋白质&#xff0c;寡核苷酸和其他含胺分子的伯胺&#xff08;-NH2&#xff09;。西…