DSP28335模块配置模板系列——ADC配置模板

news2024/11/24 0:15:05

一、配置步骤

1.使能并配置高速时钟HSPCLK、ADC校验

	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    
	EDIS;

	EALLOW;
	SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)
    ADC_cal();
	EDIS;

这里ADC_MODCLK=3,所以HSPCLK时钟为150/6=25Mhz

2.配置ADC时钟并给ADC上电

AdcRegs.ADCTRL3.all = 0x00E0;
AdcRegs.ADCTRL1.bit.CPS= 0;

ADCTRL3寄存器的5-7位置1表示内部带隙与参考电路上电和其他模拟电路上电;

4-1位置0表示不对HSPCLK进行分频,0位置0表示顺序采样模式;

ADCTRL1的CPS位置0表示不对HSPCLK进行分频,具体的ADCCLK计算公式由以下给出:

ADCCLK=\frac{SYSCLK}{HISPCP*2^{ ADCTRL3[4:1]}*(CPS+1))}

所以这里的ADCCLK被配置为150/6=25Mhz

3.配置ADC模块的工作方式

SEQ_CASCSMODE_SELCONT_RUNSEQ_OVRD
双序列发生器模式顺序采样连续自动序列化模式固定长度循环模式
单序列发生器模式/级联模式并发采样启动/停止模式自然结束循环模式

这里配置ADC模块的工作模式为双序列发生器模式、顺序采样、连续自动序列化模式、自然结束循环模式:

AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; 
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; 

至于如何选择ADC模块的工作方式,需要根据实际情况选择,若采样通道不大于8个可以使用双序列发生器模式、顺序采样,这里比较重要的一点是分清楚连续自动序列化模式和启动/停止模式之间的区别。

        当选择连续自动序列化模式且选择自然结束循环模式时,序列发生器完成一个序列的转换时,转换序列将自动重复开始,且不需要等到SOC信号的到来,所以使用连续自动序列化模式时,只需要触发一次SOC信号用于启动第一个转换序列即可,之后的每个序列转换将自动进行,而不需要额外的SOC信号触发。

        当选择启动/停止模式时,序列发生器完成一个序列的转换后,状态指针停留在当前转换的状态,手动复位序列发生器后,状态指针才会重新指向初始位置,且需要等待SOC信号到来才会开始转换。

        实际应用中,如果采用软件触发SOC则需要搭配连续自动序列化模式使用,如果采用Epwm周期性触发SOC则需要搭配启动/停止模式使用。

4.配置序列发生器的最大采样通道数和采样顺序

        这里以采样A0-A7八个通道为例,按A0、A1、A2、...、A7的顺序采样:

  AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7;
  AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 采样ADCA0
  AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // 采样ADCA1
  AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // 采样ADCA2
  AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // 采样ADCA3
  AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // 采样ADCA4
  AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // 采样ADCA5
  AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // 采样ADCA6
  AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // 采样ADCA7

5.选择SOC触发方式

         对于两个序列发生器SEQ1、SEQ2,启动方式有以下几种:

SEQ1SEQ2
软件立即启动(S/W)软件立即启动(S/W)
ePWMx SOCAePWMx SOCB

以软件启动且搭配连续自动序列化模式为例:

AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//软件启动方式

 epwm触发:

AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;

6.配置ADC中断 

        根据需要可以选择是否配置ADC中断,这里需要在采样完成A7后发送中断申请,所以禁止SEQ1发送中断申请,允许SEQ2发送中断申请,配置步骤如下:

	EALLOW;  
	PieVectTable.ADCINT = &adc_isr;    //配置adc中断服务函数地址
	EDIS;    
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;    //开启INT1.6中断
	IER |= M_INT1;                     // 开启第一组中断
	EINT;         
	ERTM; 
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0; //禁用SEQ1发送中断申请
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; //允许SEQ2发送中断申请
    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2 = 0; //每个SEQ2序列转换完成后发送一次中断申请
        

中断服务函数为:

interrupt void  adc_isr(void)
{
    sampleTable[0] = (AdcRegs.ADCRESULT0) >> 4;
    sampleTable[1] = (AdcRegs.ADCRESULT1) >> 4;
    sampleTable[2] = (AdcRegs.ADCRESULT2) >> 4;
    sampleTable[3] = (AdcRegs.ADCRESULT3) >> 4;
    sampleTable[4] = (AdcRegs.ADCRESULT4) >> 4;
    sampleTable[5] = (AdcRegs.ADCRESULT5) >> 4;
    sampleTable[6] = (AdcRegs.ADCRESULT6) >> 4;
    sampleTable[7] = (AdcRegs.ADCRESULT7) >> 4;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    for(i = 0; i < 8; i++)
    {
        I[i] = (float)sampleTable[i] * 3.0 / 4095.0;
    }
}

 

二、配置模板

1.采集A0-A7通道,选择顺序采样模式、双序列发生器模式、连续自动序列化模式、自然结束循环模式,配置ADC时钟为25Mhz,软件触发SOC方式,且每次在完成A7转换后进入一次中断服务函数读取结果寄存器的值,完整的配置模板如下:

void InitAdc()
{
    EALLOW;
	SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    
	EDIS;

	EALLOW;
	SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)
    ADC_cal();
	EDIS;

    AdcRegs.ADCTRL3.all = 0x00E0;
    AdcRegs.ADCTRL1.bit.CPS= 0;
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;
    AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
    AdcRegs.ADCTRL1.bit.CONT_RUN = 1; 
    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;
    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 采样ADCA0
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // 采样ADCA1
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // 采样ADCA2
    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // 采样ADCA3
    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // 采样ADCA4
    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // 采样ADCA5
    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // 采样ADCA6
    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // 采样ADCA7
    AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//软件启动方式
	EALLOW;  
	PieVectTable.ADCINT = &adc_isr;    //配置adc中断服务函数地址
	EDIS;    
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;    //开启INT1.6中断
	IER |= M_INT1;                     // 开启第一组中断
	EINT;         
	ERTM; 
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0; //禁用SEQ1发送中断申请
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; //允许SEQ2发送中断申请
    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2 = 0; //每个SEQ2序列转换完成后发送一次中断申请
}
interrupt void  adc_isr(void)
{
    sampleTable[0] = (AdcRegs.ADCRESULT0) >> 4;
    sampleTable[1] = (AdcRegs.ADCRESULT1) >> 4;
    sampleTable[2] = (AdcRegs.ADCRESULT2) >> 4;
    sampleTable[3] = (AdcRegs.ADCRESULT3) >> 4;
    sampleTable[4] = (AdcRegs.ADCRESULT4) >> 4;
    sampleTable[5] = (AdcRegs.ADCRESULT5) >> 4;
    sampleTable[6] = (AdcRegs.ADCRESULT6) >> 4;
    sampleTable[7] = (AdcRegs.ADCRESULT7) >> 4;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    for(i = 0; i < 8; i++)
    {
        I[i] = (float)sampleTable[i] * 3.0 / 4095.0;
    }
}

2.采集A0-A7通道,选择顺序采样模式、双序列发生器模式、启动/停止模式、配置ADC时钟为25Mhz,Epwm触发SOC方式,且每次在完成A7转换后进入一次中断服务函数读取结果寄存器的值,完整的配置模板如下:

void EPWM6_SOCA_Init(Unit16 tbprd,Unit16 cmpa,Unit cmpb)
{
    EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   
	SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1;  
	EDIS;


	EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;  
	EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;
	EPwm6Regs.TBPHS.half.TBPHS = 0;
	EPwm6Regs.TBCTR = 0x0000;                  
	EPwm6Regs.TBPRD = tbprd;
	EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;   
	EPwm6Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1; 
	EPwm6Regs.TBCTL.bit.CLKDIV=TB_DIV1;    

	EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
	EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
	EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
	EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
	EPwm6Regs.CMPA.half.CMPA = cmpa;    
	EPwm6Regs.CMPB = cmpb;   
           
	EPwm6Regs.ETSEL.bit.SOCAEN = 1;  //使能EPwm6SOCA信号产生
 	EPwm1Regs.ETSEL.bit.SOCASEL = 2;  //当TBCTR=TBPRD时产生SOCA信号      
 	EPwm1Regs.ETPS.bit.SOCAPRD = 1;   //在第一个事件来到时产生SOCA信号	 
      
	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         
	EDIS; 
}
void InitAdc()
{
    EALLOW;
	SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    
	EDIS;

	EALLOW;
	SysCtrlRegs.HISPCP.all = ADC_MODCLK;	// HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)
    ADC_cal();
	EDIS;

    AdcRegs.ADCTRL3.all = 0x00E0;
    AdcRegs.ADCTRL1.bit.CPS= 0;
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;
    AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
    AdcRegs.ADCTRL1.bit.CONT_RUN = 0; //启动/停止模式
    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // 采样ADCA0
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // 采样ADCA1
    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; // 采样ADCA2
    AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3; // 采样ADCA3
    AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4; // 采样ADCA4
    AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5; // 采样ADCA5
    AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6; // 采样ADCA6
    AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7; // 采样ADCA7
    AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;//EPWM_SOCA启动方式
	EALLOW;  
	PieVectTable.ADCINT = &adc_isr;    //配置adc中断服务函数地址
	EDIS;    
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;    //开启INT1.6中断
	IER |= M_INT1;                     // 开启第一组中断
	EINT;         
	ERTM; 
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0; //禁用SEQ1发送中断申请
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1; //允许SEQ2发送中断申请
    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2 = 0; //每个SEQ2序列转换完成后发送一次中断申请
}
interrupt void  adc_isr(void)
{
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //初始化状态指针位置
    sampleTable[0] = (AdcRegs.ADCRESULT0) >> 4;
    sampleTable[1] = (AdcRegs.ADCRESULT1) >> 4;
    sampleTable[2] = (AdcRegs.ADCRESULT2) >> 4;
    sampleTable[3] = (AdcRegs.ADCRESULT3) >> 4;
    sampleTable[4] = (AdcRegs.ADCRESULT4) >> 4;
    sampleTable[5] = (AdcRegs.ADCRESULT5) >> 4;
    sampleTable[6] = (AdcRegs.ADCRESULT6) >> 4;
    sampleTable[7] = (AdcRegs.ADCRESULT7) >> 4;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    for(i = 0; i < 8; i++)
    {
        I[i] = (float)sampleTable[i] * 3.0 / 4095.0;
    }
}

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

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

相关文章

C语言基础——数组(2)

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言 一、二维数组的创建 1.1 二维数组的概念 1.2二维数组的创建 二、二维数组…

javascript导入excel文件

导入文件用到一个 xlsx.core.js 的包。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><script type"tex…

晶振时钟外设总线

如果芯片只有一个时钟信号脚怎么接晶振&#xff1f; 答&#xff1a;如果芯片只有一个时钟信号引脚&#xff0c;说明这是一个时钟输入脚&#xff08;OSC IN&#xff09;&#xff0c;为有源晶振&#xff08;晶体振荡器&#xff09;应用方案&#xff0c;请选择有源晶振并连接其时…

AMD显卡和英伟达显卡哪个好?

显卡是计算机中负责处理图形和视频输出的硬件设备&#xff0c;主要分为两种类型&#xff1a;AMD的A卡和NVIDIA的N卡。那么AMD显卡和英伟达显卡哪个好&#xff1f;怎么选&#xff1f; 答&#xff1a;不能一概而论地说哪个好&#xff0c;因为它们各有优势&#xff0c;选择应基于…

echaerts图例自动滚动并隐藏翻页按钮

效果图 代码 legend: {itemHeight: 14,itemWidth: 14,height: "300", //决定显示多少个// 通过 CSS 完全隐藏翻页按钮pageButtonItemGap: 0,pageButtonPosition: end,pageIconColor: transparent, // 隐藏翻页按钮pageIconInactiveColor: transparent, // 隐藏翻页按…

2024050501-重学 Java 设计模式《实战命令模式》

重学 Java 设计模式&#xff1a;实战命令模式「模拟高档餐厅八大菜系&#xff0c;小二点单厨师烹饪场景」 一、前言 持之以恒的重要性 初学编程往往都很懵&#xff0c;几乎在学习的过程中会遇到各种各样的问题&#xff0c;哪怕别人那运行好好的代码&#xff0c;但你照着写完…

【计算机网络基础知识】

首先举一个生活化的例子&#xff0c;当你和朋友打电话时&#xff0c;你可能会使用三次握手和四次挥手的过程进行类比&#xff1a; 三次握手&#xff08;Three-Way Handshake&#xff09;&#xff1a; 你打电话给朋友&#xff1a;你首先拨打你朋友的电话号码并等待他接听。这就…

LeetCode刷题之HOT100之组合总和

2024/6/3 周一&#xff0c;工作日的第一天。昨晚梦到被导师说去实验室不积极哈哈哈&#xff0c;风扇开到二级&#xff0c;早上被吹醒。买的书马上快要到了。上午刚来准备刷题&#xff0c;结果去搞了一下数据库sql&#xff0c;做的差不多了&#xff0c;还差点格式转换就差不多出…

【WP】猿人学_13_入门级cookie

https://match.yuanrenxue.cn/match/13 抓包分析 抓包分析发现加密参数是cookie中有一个yuanrenxue_cookie 当cookie过期的时候&#xff0c;就会重新给match/13发包&#xff0c;这个包返回一段js代码&#xff0c;应该是生成cookie的 <script>document.cookie(y)(u)(a…

【Text2SQL】评估 LLM 的 Text2SQL 能力

论文&#xff1a;Evaluating the Text-to-SQL Capabilities of Large Language Models ⭐⭐⭐⭐ arXiv:2204.00498 一、论文速读 本论文尝试了多种 prompt 结构&#xff0c;并且评估了他们在 Codex 和 GPT-3 上的表现。下面介绍这些 prompt 结构&#xff1a; 二、不同的 prom…

VsQt单元测试目录的管理方式

正常项目的文件管理方式 正常项目的目录&#xff0c;是由文件系统中实际的文件夹进行分类管理的。 但是如果单元测试用实际文件夹管理的话&#xff0c;会出现问题&#xff0c;就是被测类太多了&#xff0c;用文件系统管理的话&#xff0c;不太方面查看&#xff0c;如下图所示。…

AI数字人本地算力直播怎么做?青否数字人教您快速搭建直播间!

一、青否数字人直播分为两种&#xff0c;一种是云端渲染另外一种就是本地渲染 使用本地算力来进行直播间互动&#xff0c;本地算力能够使商家拥有更低成本运营 在独立部署数字人SaaS系统后&#xff0c;其他的数字人厂商是【云服务器】【算力服务器】相结合的方式&#xff0c;以…

31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络

前面两篇文章我们分析了HTTP/1和HTTP/2&#xff0c;在HTTP/2出现之前&#xff0c;开发者需要采取很多变通的方式来解决HTTP/1所存在的问题&#xff0c;不过HTTP/2在2018年就开始得到了大规模的应用&#xff0c;HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是…

App Inventor 2 复制屏幕功能,界面设计更便捷,避免误删组件

“复制屏幕”功能全新上线&#xff0c;中文网独有&#xff08;MIT没有此功能&#xff09;&#xff0c;可以复制屏幕中的普通组件、图片、附件、拓展、代码块。更多升级详情可查看发布日志。 下面演示一下屏幕的复制效果&#xff1a; 1、Screen1屏幕上有若干组件、及一个SQLit…

支付宝小众玩法 爱溜达的人不容错过

创建一个简单的程序来帮助用户管理他们的图片&#xff0c;例如筛选分辨率合适、尺寸适中的图片来准备上传&#xff0c;这是一个技术上合理且有益的方向。例如&#xff0c;一个Python脚本使用Pillow库来检查文件夹中图片的尺寸&#xff1a; from PIL import Image import os# 根…

如何永久擦除Android手机中的所有个人数据?

在这个数字化的时代&#xff0c;确保您的个人数据的安全和隐私至关重要。如果您计划出售或回收您的Android手机&#xff0c;了解如何正确擦除Android手机是至关重要的。本综合指南将引导您通过安全擦除Android手机的分步过程&#xff0c;以保护您的敏感信息。 手机是极其敏感的…

冲刺面试加油

1、HTML语义化&#xff1f; 对于开发者而言&#xff0c;语义化标签有着更好的页面结构&#xff0c;有利于代码的开发编写和后期的维护。 对于用户而言&#xff0c;当网络卡顿时有良好的页面结构&#xff0c;有利于增加用户的体验。 对于爬虫来说&#xff0c;有利于搜索引擎的…

vue中使用svg图像

一 、svg图像是什么 SVG&#xff08;可缩放矢量图形&#xff09;是一种图像格式&#xff0c;它以XML文档的形式存在&#xff0c;用以描述图像中的形状、线条、文本和颜色等元素。由于其基于矢量的特性&#xff0c;SVG图像在放大或改变尺寸时能够保持图形质量不受影响。这种格式…

【Altium】AD-原理图中使用多通道问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决在原理图主图中&#xff0c;对子图使用多通道命令后&#xff0c;子图未形成多个通道的问题。 2、 问题场景 客户手中的工程文件&#xff0c;主图中对子图使用了多通道命令&#xff0c;子图图纸并未形成多通道…

反转链表的三种方法--面试必考(图例超详细解析,小白一看就会!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 头插法 --- 创建新的链表 ⭐ 迭代法 --- 三指针 ⭐ 递归法 四、总结与提炼 五、共勉 一、前言 反转链表这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&…