当前位置: 首页 > news >正文

DSP_TMS320F28377D_ADC学习笔记

前言

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 /4AdcSetMode(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 A0AdcaRegs.ADCSOC0CTL.bit.ACQPS       = 63;   // Sample window is 64 SYSCLK cyclesAdcaRegs.ADCSOC0CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA  触发源的选择AdcaRegs.ADCSOC1CTL.bit.CHSEL       = 2;    // SOC1 will convert internal connection A2AdcaRegs.ADCSOC1CTL.bit.ACQPS       = 63;   // Sample window is 65 SYSCLK cyclesAdcaRegs.ADCSOC1CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA 触发源的选择AdcaRegs.ADCINTSEL1N2.bit.INT1SEL   = 1;    // End of SOC1 will set INT1 flagAdcaRegs.ADCINTSEL1N2.bit.INT1E     = 1;    // Enable INT1 flagAdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Make sure INT1 flag is clearedEDIS;

 

首先我们来解释这三行

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){// ADCEALLOW;     // 设置中断入口函数PieVectTable.ADCA1_INT = &ADCaHandler;EDIS;PieCtrlRegs.PIEIER1.bit.INTx1   = 1;    // 使能PIE中断  ADCaIER |= M_INT1;
}interrupt void ADCaHandler(void){// AdcaResultRegs.ADCRESULT0
// AdcaResultRegs.ADCRESULT1AdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Clear INT1 flagPieCtrlRegs.PIEACK.all  = PIEACK_GROUP1;
}void adc_register_init(void){EALLOW;AdcaRegs.ADCCTL2.bit.PRESCALE       = 6;    // Set ADCCLK divider to /4AdcSetMode(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 A0AdcaRegs.ADCSOC0CTL.bit.ACQPS       = 63;   // Sample window is 64 SYSCLK cyclesAdcaRegs.ADCSOC0CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA  触发源的选择AdcaRegs.ADCSOC1CTL.bit.CHSEL       = 2;    // SOC1 will convert internal connection A2AdcaRegs.ADCSOC1CTL.bit.ACQPS       = 63;   // Sample window is 65 SYSCLK cyclesAdcaRegs.ADCSOC1CTL.bit.TRIGSEL     = 0x5;  // Trigger on ePWM1 ADCSOCA 触发源的选择AdcaRegs.ADCINTSEL1N2.bit.INT1SEL   = 1;    // End of SOC1 will set INT1 flagAdcaRegs.ADCINTSEL1N2.bit.INT1E     = 1;    // Enable INT1 flagAdcaRegs.ADCINTFLGCLR.bit.ADCINT1   = 1;    // Make sure INT1 flag is clearedEDIS;
}

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

相关文章:

DSP_TMS320F28377D_ADC学习笔记

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

springcloud3 Nacos中namespace和group,dataId的联系

一 Namespance和group和dataId的联系 1.1 3者之间的联系 话不多说,上答案,如下图: namespance用于区分部署环境,group和dataId用于逻辑上区分两个目标对象。 二 案例:实现读取注册中心的不同环境下的配置文件 …...

[YOLO] yolo理解博客笔记

YOLO v2和V3 关于设置生成anchorbox,Boundingbox边框回归的过程详细解读 YOLO v2和V3 关于设置生成anchorbox,Boundingbox边框回归的个人理解https://blog.csdn.net/shenkunchang1877/article/details/105648111YOLO v1网络结构计算 Yolov1-pytorch版 …...

清华源pip安装Python第三方包

一、更换PIP源PIP源在国外,速度慢,可以更换为国内源,以下是国内一些常用的PIP源。豆瓣(douban) http://pypi.douban.com/simple/ (推荐)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/阿里云 http://mirrors.aliyun.com/pypi/simple/中…...

python线程池【ThreadPoolExecutor()】批量获取博客园标题数据

转载:蚂蚁学python 网址:【【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行】 https://www.bilibili.com/video/BV1bK411A7tV/?p8&share_sourcecopy_web&vd_sourced0ef3d08fdeef1740bab49cdb3e96467实战案…...

LearnOpenGL-入门-8.坐标系统

本人刚学OpenGL不久且自学,文中定有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网:https://learnopengl-cn.github.io/ 文章目录坐标系统概述局部空间世界空…...

windows10使用wsl2安装docker

配环境很麻烦,想利用docker的镜像环境跑一下代码整个安装过程的原理是:windows使用docker,必须先安装一个linux虚拟机,才可运行docker,而采用wsl2安装虚拟机是目前最好的方法第一步 windows安装wsl2控制面板->程序-…...

Javascript的API基本内容(六)

一、正则表达式 1.定义规则 const reg /表达式/ 其中/ /是正则表达式字面量正则表达式也是对象 2.使用正则 test()方法 用来查看正则表达式与指定的字符串是否匹配如果正则表达式与指定的字符串匹配 ,返回true,否则false 3.元字符 比如&#xff0…...

电压放大器和电流放大器的区别是什么意思

在日常电子实验测试中,很多电子工程师都会使用到电压放大器和电流放大器,但是很多新手工程师却无法区分两者的区别,下面就让安泰电子来为我们讲解电压放大器和电流放大器的区别是什么意思。 一、电压放大器介绍: 电压放大器是一种…...

cast提前!最简单有效的神经网络优化方法,没有之一!

做优化有时候真的很头疼,绞尽脑汁的想怎么做算法等价,怎么把神经网络各层指令流水起来,在确保整网精度的同时,又有高性能。 但有时做了半天,却发现流水根本就流不起来,总是莫名其妙地被卡住。 真的是一顿…...

LeetCode刷题——动态规划(C/C++)

文章目录[简单]买股票的最佳时机[简单]爬楼梯[中等]最长递增子序列[中等]最大连续子数组和[简单]买股票的最佳时机 原题链接 题解 min:今天之前买股的最低价 res:最大利润 每一天比较今天和往前的最低价差值能否比最大利润还大 class Solution { publ…...

车载智能终端TBOX

YD886 终端设备是基于GSM/WCDMA全网通讯方式的GPS定位移动终端,车载设备具有强大的车辆监控管理、CAN总线数据采集等功能,可以满足不同用户的需求,同时具备汽车行驶记录功能扩展应用。具体功能请以终端实际情况为准! 一、移动管家 车载智能终…...

技术分担产品之忧(上):挑选有业务专家潜力的人

你好,我是王植萌,去哪儿网的高级技术总监、TC主席。从2014年起,担任一个部门的技术负责人,有8年技术总监经验、5年TC主席的经验。这节课我会从去哪儿网产研融合的经验出发,和你聊一聊怎么让技术分担产品之忧。 技术分…...

UVa 12569 Planning mobile robot on Tree (EASY Version) 树上机器人规划(简单版) BFS 二进制

题目链接:Planning mobile robot on Tree (EASY Version) 题目描述: 给定一棵树,树上有一个位置存在一个机器人,其他mmm个位置存在石头,保证初始状态一个结点最多一个物体(一个石头或者一个机器人或者为空…...

intel的集成显卡(intel(r) uhd graphics) 配置stable diffusion

由于很多商务本没有独立显卡,只有Intel的集成显卡,在配置安装stable diffusion 时候需要特殊对待,参考不少帖子,各取部分现稍加整合。整体思路分两个部分:第一步是先配置环境,主要是安装Anaconda Pytorch&…...

【数据库的基础知识(2)】

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...

Docker部署实战

文章目录Docker部署应用准备制作容器镜像启动容器上传镜像docker exec数据卷(Volume)声明原理实践Docker部署 应用准备 这一次,我们来用 Docker 部署一个用 Python 编写的 Web 应用。这个应用的代码部分(app.py)非常…...

RestTemplate 相关使用

RestTemplate介绍简单接口调用(getForObject)添加 Header 和 Cookie(exchange)介绍 在项目中,当我们需要远程调用一个 HTTP 接口时,我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工…...

新手小白亚马逊注册最全教程在此

自从龙哥出了Walmart注册教程后,立刻看到私信有兄弟问这个亚马逊的注册。亚马逊是跨境电商的鼻祖,资源和流量是无容置疑的。作为一个重产品,轻店铺的平台,是比较看中客户体验的,要求卖家要有好的资源。而且亚马逊有强大…...

二分查找重复情况 找最左边或最右边的位置下标

目录二分找最左边二分找最右边综合应用(剑指offer)二分找最左边 核心思想: 先mid (lr)/2每次向左取整; 然后命中target的时候,右边界逼近到mid; 因为每次mid向左取整,mid命中target时l代替mid位置,则循环迭代最后会卡出重复数字最左侧的位置…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

LangFlow技术架构分析

🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...