0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DSP28335的ADC模块使用介绍

冬至子 来源:龙一的编程life 作者:龙憨憨 2023-11-08 10:37 次阅读

前言

DSP28335的ADC模块使用介绍:

  • 12位ADC
  • 2个采样保持器
  • 同步采样或顺序采样,使用顺序采样
  • 输入范围0-3V
  • 时钟配置为最高25MHz
  • 级联模式或双排序模式,采用级联模式,8状态排序器SEQ1和SEQ2构成16状态的SEQ
  • 选择EPWMxSOCA作为触发源启动ADC转换,采样频率为10K

主要内容:

1、ADC原理+DSP的ADC原理
2、具体程序

1、ADC转换原理

ADC就是模数转换器,将模拟量转换为数字量,通常就是对电流、电压等进行采样,然后进行转换,得到数字量,再在软件中进行编程换算得到实际的值。

A/D转换一般要经过取样、保持、量化及编码4个过程。28335的ADC模块如Figure1-1所示。采样数据通过通过传输至Analog MUX,然后送到EPWM SOCA处理,然后送至12位ADC转换器模组进行转换,输出到结果寄存器

转换公式如下:

RealValue= SampleValue * 3.0f / 4096.0f

2、触发方式

三种触发方式可以开始ADC转换,具体如下:

  1. S/W软件立即启动
  2. EPWM SOCA、SOCB转换启动
  3. XINT2 ADC转换开始

采用EPWM SOCA启动方式

图片

3、如何触发ADC?

1、使用EPWM的SOCA触发;

AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1 
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)

2、使能EPWMxSOCA信号的产生,以何种方式何时产生;

EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount CTR = CMPA且为向上计数是产生触发事件
EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event  在第一个事件时产生SOCA信号
EPwm1Regs.CMPA.half.CMPA = 0x0080;    // Set compare A value

3、EPWM为up-down模式,触发频率为10K,时钟为150MHz;

EPwm1Regs.TBPRD = 0x1D4C;              // Set period for ePWM1  7500  10K
EPwm1Regs.TBCTR = 0x0000U;        // 
EPwm1Regs.TBCTL.bit.CTRMODE = 2;      // up-down模式
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00;  //   使用系统时钟
EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;

4、ADC初始化配置程序如下:

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "DSP2833x_Adc.h"


#define ADC_usDELAY 5000L


Uint16 Sample_I = 0U;
float Real_I = 0.0f;
float Base_Current = 3.0f / 4096.0f;


void init_28335ADC_CLK(void)
{
  EALLOW;
  #define ADC_MODCLK 0x03
  SysCtrlRegs.HISPCP.all = ADC_MODCLK;
  EDIS;
}
// ADC初始化
void init_adc_config(void)
{
  extern void DSP28x_usDelay(Uint32 Count);


  EALLOW;
  SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
  ADC_cal();
  EDIS;
  AdcRegs.ADCTRL3.all = 0x00E0;  // Power up bandgap/reference/ADC circuits
  DELAY_US(ADC_usDELAY);         // Delay before converting ADC channels


  // Configure ADC
   AdcRegs.ADCMAXCONV.all = 0x000F;       // Setup 1 conv's on SEQ1  16个通道
   AdcRegs.ADCTRL1.bit.ACQ_PS = 0x1;


   AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;  // 顺序采样
   AdcRegs.ADCTRL1.bit.CPS = 0;      // 对外设时钟HSPCLK不分频
   AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x0;  // ADC内核时钟不分频 ADCCLK = HSPCLK / (CPS + 1) = 25MHz
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;  // 级联排序模式
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;  // 连续模式
   AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;  // 排序覆盖


  // 转换顺序
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00U; // Setup ADCINA0 as 1st SEQ1 conv.
   AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01U;
   AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02U;
   AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x03U;


   AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x04U;
   AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x05U;
   AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x06U;
   AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x07U;


   AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x08U;
   AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x09U;
   AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0AU;
   AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0BU;


   AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x0CU;
   AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0x0DU;
   AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0x0EU;
   AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x0FU;


   AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)


   // Assumes ePWM1 clock is already enabled in InitSysCtrl();
   EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group
   EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount CTR = CMPA且为向上计数是产生触发事件
   EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event  在第一个事件时产生SOCA信号
   EPwm1Regs.CMPA.half.CMPA = 0x0080;    // Set compare A value


   // 设置EPWM触发源
   EPwm1Regs.TBPRD = 0x1D4C;              // Set period for ePWM1  7500  10K
   EPwm1Regs.TBCTR = 0x0000U;        // 
   EPwm1Regs.TBCTL.bit.CTRMODE = 2;      // up-down模式
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x00;  //   使用系统时钟
   EPwm1Regs.TBCTL.bit.CLKDIV = 0x00;
}
// 转换计算
interrupt void adc_isr(void)
{
  Sample_I = AdcRegs.ADCRESULT0 > >4;    // 采样数据
  Real_I = (float)Sample_I * Base_Current;// 实际电流
}

注意


1、ADC通道、结果寄存器对应关系:

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x02U; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x03U;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x00U;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x01U;


ADCINA2 - > AdcRegs.ADCRESULT0;
ADCINA3 - > AdcRegs.ADCRESULT1;
ADCINA0 - > AdcRegs.ADCRESULT2;
ADCINA1 - > AdcRegs.ADCRESULT3;

由上面的代码可知,你的通道对应哪个CONVxx,则结果就存在哪个结果寄存器AdcRegs.ADCRESULTxx:
CONV00------------------AdcRegs.ADCRESULT0
CONV01------------------AdcRegs.ADCRESULT1

CONV15------------------AdcRegs.ADCRESULT15

这个对应关系是固定不变的,而A/D输入通道,可以根据自己选择排序控制寄存器的哪四位即CONVxx输入,然后进行转换。

2、为什么结果寄存器的值由进行右移4位

结果寄存器是16位的,而28335的ADC模块是12位的,一般使用的是映射在外设帧2,左对齐方式,,故前4位是保留的,所以需要右移4位才能得到实际值。

图片

ADC结果寄存器是双映射。外设帧2(0x7108-0x7117)中的位置为2等待状态,且为左对齐。外设帧0空间(0x0B00-0x0B0F)的位置对CPU访问是1等待状态和对于DMA访问是0等待状态,右对齐。在ADC的高速/连续转换使用期间,使用0等待状态位置进行ADC结果到用户内存的快速转换。

DSP2833x_Headers_nonBIOS.cmd中
ADC_MIRROR : origin = 0x000B00, length = 0x000010 /* ADC Results register mirror /
ADC : origin = 0x007100, length = 0x000020 /
ADC registers */

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117762
  • DSP28335
    +关注

    关注

    22

    文章

    57

    浏览量

    40184
  • 采样保持器
    +关注

    关注

    0

    文章

    5

    浏览量

    8870
  • ADC模块
    +关注

    关注

    1

    文章

    19

    浏览量

    10975
  • EPWM模块
    +关注

    关注

    1

    文章

    4

    浏览量

    1856
收藏 人收藏

    评论

    相关推荐

    DSP28335外部中断的使用

    处理器的外部中断主要用于捕抓外部输入的高低电平。本篇文章将介绍DSP28335的外部中断的使用。
    的头像 发表于 07-07 16:41 2592次阅读
    <b class='flag-5'>DSP28335</b>外部中断的使用

    DSP28335的EPWM模块

    DSP28335的EPWM模块周期最长可为多少
    发表于 08-22 15:37

    dsp28335引脚图ADc引脚如何连接

    dsp28335引脚图ADc引脚如何连接
    发表于 03-09 15:51

    Dsp28335中断的方法

    Dsp28335中断的方法Dsp28335中断的方法
    发表于 01-08 14:17 14次下载

    基于DSP28335的三电平SVPWM算法研究

    基于DSP28335的三电平SVPWM算法研究
    发表于 04-15 18:29 46次下载

    DSP28335中文手册

    TI公司 DSP28335中文资料数据手册
    发表于 05-19 11:17 152次下载

    DSP28335研发笔记_ccs5.2

    DSP28335研发笔记
    发表于 12-30 15:04 20次下载

    基于DSP28335的七相感应电机矢量控制_郭冀岭

    基于DSP28335的七相感应电机矢量控制_郭冀岭
    发表于 01-08 10:57 8次下载

    DSP28335串口通信(SCI)的理论,介绍和应用

    DSP28335串口通信(SCI)的理论,介绍和应用
    发表于 09-04 09:28 37次下载
    <b class='flag-5'>DSP28335</b>串口通信(SCI)的理论,<b class='flag-5'>介绍</b>和应用

    基于DSP28335串口通信(SCI)的理论,介绍和应用

    基于DSP28335串口通信(SCI)的理论,介绍和应用
    发表于 09-04 14:07 28次下载
    基于<b class='flag-5'>DSP28335</b>串口通信(SCI)的理论,<b class='flag-5'>介绍</b>和应用

    dsp28335如何入门:程序设计步骤

    本文首先介绍dsp28335的概念,其次介绍dsp28335电气特性及特点,最后详细阐述了关于dsp28335的程序设计步骤。
    发表于 05-23 17:09 1.9w次阅读

    dsp28335开发板中文资料汇总(dsp28335最小系统_引脚图_封装_初始化程序)

    本文主要介绍dsp28335开发板最小应用系统设计、dsp28335引脚图功能和dsp28335封装及dsp28335初始化程序。
    发表于 05-24 17:25 6.1w次阅读
    <b class='flag-5'>dsp28335</b>开发板中文资料汇总(<b class='flag-5'>dsp28335</b>最小系统_引脚图_封装_初始化程序)

    使用DSP28335控制电机的资料合集免费下载

    本文档的主要内容详细介绍的是使用DSP28335控制电机的资料合集免费下载包括了:电机控制原理图,硬件手册,H桥直流电刷电机控制,DSP28335使用程序,DSP28335电机控制开发
    发表于 05-18 08:00 141次下载
    使用<b class='flag-5'>DSP28335</b>控制电机的资料合集免费下载

    DSP28335学习笔记(5):GPIO介绍及使用

    在前面的章节中,我们对DSP28335系统初始化过程有了一个初步的了解,下面的章节我们开始外设的应用。
    的头像 发表于 07-02 15:52 4765次阅读
    <b class='flag-5'>DSP28335</b>学习笔记(5):GPIO<b class='flag-5'>介绍</b>及使用

    研旭DSP28335实用版-硬件测评

    电子发烧友网站提供《研旭DSP28335实用版-硬件测评.pdf》资料免费下载
    发表于 10-09 15:19 2次下载
    研旭<b class='flag-5'>DSP28335</b>实用版-硬件测评