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(单端模式)或者 ADCIN0和ADCIN1组合的差分模式。 SOC(start of conversion),相当于:【ADCIN0单端模式】 或【ADCIN0与ADCIN1组合的差分模式】的转换结果,将会保存到 AdcaResultRegs.ADCRESULT0中。
第二行AdcaRegs.ADCSOC0CTL.bit.ACQPS = 63;表示SOC0的捕获预分频设置成了64个周期,主要控制该SOC的采样和保持窗口的时长。此行也是参考Ti官方例程里面的程序。 官方推荐,12位分辨率ACQPS=14,// 75 ns。16位分辨率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; 使能ADCa的INT1中断。
第三行: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_TMS320F28377D_ePWM学习笔记
前言 本人需要使用ePWM来控制一个永磁同步电机(PMSM), 本文记录了对于TMS320F28377D ePWM模块的学习笔记.主要内容是FOC PMSM控制的ePWM配置,同时包含ADC触发源的配 ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
- 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记
计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...
- Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)
Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...
最新文章
- java学习笔记-java中运算符号的优先顺序
- SecureCRT 端口转发连接服务器
- IPv4的核心管理功能/proc/sys/net/ipv4/*
- CV:Visual Studio 2015版本+CUDA8.0+Cudnn8.0+OpenCV 3.1.0版本完美解决的详细攻略
- daterangepicker 日期范围插件自定义 可选 年份
- Leetcode--22. 括号生成
- 实战经验:从内存故障到CPU过高诊断-直播预告
- 依图要修AI语音双学位,左手摸底考第一名成绩单,右手开放平台方案
- 评说SAP Business ByDesign
- android 烟花动画效果图,android利用图片实现烟花效果
- 采用Zigbee和Raspberry Pi的太阳能/燃气热水器自动控制系统
- 基于Netty实现群聊功能
- Ae:时间轴面板(时间线区域)
- STM32开发日记002:KEIL5安装教程
- python获取图片长宽高,Python获取图片的大小/尺寸
- C语言数据结构-程序设计与算法基础II-电大同步进度
- U盘里面空间占用了.但是却不显示任何东西
- xiuno开发文档_大白 · TinyMCE编辑器v1.9_Xiuno Plugin_奇狐插件商店_奇狐网
- CAD图纸显示不全?别慌,有浩辰CAD!
- Centos7 安装Nexus
热门文章
- compareTo()和compare()的详解和区别
- BackTrack5 学习笔记5 扫描 Nmap
- xinetd 服务
- 利用C#写一个模拟的摇号系统
- Flowable 6.6.0 BPMN用户指南 -10	流程实例迁移 - 10.1	简单示例
- 产品机会:痛点,痒点,爽点
- 23种设计模式之抽象工厂模式(Abstract Factory Pattern)
- STM32CubeIDE HAL库操作IIC (二)案例篇(MPU9250)
- Error evaluating expression ‘’. Return value () was not iterable.
- windows 下 nextcloud 的偏保姆级搭建教程