This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28335:28335 ADC "序列发生器启动/停止操作"不起作用

Guru**** 2549940 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/628618/ccs-tms320f28335-28335-adc-sequencer-start-stop-operation-not-work

器件型号:TMS320F28335

工具/软件:Code Composer Studio

大家好。

在启动/停止模式下、我对 F283335的 ADC 工作有一些疑问。

我需要 ADC 模块的工作方式如下:

1.双序列发生器模式;

2.顺序采样模式;

SEQ1触发器为 SOCA、SEQ2触发器为 ePWM1形式的 SOCB;

4、ePWM1计数器模式为递增/递减计数模式;

5、当 TBCTR = 0时产生 ePWM1SOCA; 当 TBCTR = TBPRD 时产生 ePWM1SOCB;

SOCA 触发 AD 转换 I1、I2、I3和 SOCB 触发 AD 转换 V1、V2、V3、如文档"TMS320x2833x 模数转换器(ADC)模块"第21页和第22页 所述;

如下图所示:

我 的程序结果是"I1、I2、I3 "可以很好地转换、但"V1、V2、V3"始终为零;

我的代码如下所示:

有人可以帮助我、让我知道我如何处理它。

===================================================================================================

#include "DSP2833x_Device.h"  // DSP2833x 头文件包含文件

#include "DSP2833x_examples.h" // DSP2833x 示例包含文件

//此文件中找到的函数的原型语句。

中断空 ADC_ISR (空);

uint16 VoltageA[3];

uint16 VoltageB[3];

uint16 upDownFlag = 0;

uint16 PWMDuty = 0;

void main (void)

InitSysCtrl();

Dint;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

EALLOW;

PieVectTable.ADCINT =&ADC_ISR;//ADC 中断

PieVectTable.EPWM1_INT =&EPWM1_INT_ISR;//ePWM1零中断

EDIS;

AdcRegs.ADCTRL1.All = 0;

  AdcRegs.ADCTRL2.all = 0;

  AdcRegs.ADCTRL3.ALL = 0;

  //config adc

  AdcRegs.ADCTRL1.bit.ACQ_PS = 2;

  AdcRegs.ADCTRL3.bit.ADCCLKPS=2;

  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;

  AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;

  AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;

  AdcRegs.ADCTRL1.bit.CONT_RUN = 0;

  AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;

  AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;

  AdcRegs.ADCMAXCONV.ALL = 0x22;

  //config SEQ1

  AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;

  AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;

  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

  AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;

  AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;

  AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02;

  //config SEQ2

  AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;

  AdcRegs.ADCTRL2.bit.ePWM_SOCB_SEQ2 = 1;

  AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1;

  AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x08;

  AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x09;

  AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0A;

InitAdc();

InitEPwm1Gpio();

/*ePWM config*/

EPwm1Regs.TBPRD = 6000;

EPwm1Regs.CMPA.half.CMPA = 1500;

EPwm1Regs.TBPHS.ALL = 0;

EPwm1Regs.TBCTR = 0;

EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;

EPwm1Regs.TBCTL.bit.PRDLD = TB_Immediate;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;

EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;

EPwm1Regs.DBRED = 100;

EPwm1Regs.DBFED = 100;

EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;

EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;

EPwm1Regs.ETSEL.bit.SOCAEN = 0x1;

EPwm1Regs.ETSEL.bit.SOCBEN = 0x1;

EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;

EPwm1Regs.ETSEL.bit.INTEN = 0x1;

EPwm1Regs.ETPS.bit.SOCACNT = 0x1;

EPwm1Regs.ETPS.bit.SOCAPRD = 0x1;

EPwm1Regs.ETPS.bit.SOCBCNT = 0x1;

EPwm1Regs.ETPS.bit.SOCBPRD = 0x1;

EPwm1Regs.ETPS.bit.INTCNT = 0x1;

EPwm1Regs.ETPS.bit.INTPRD = 0x1;

EPwm1Regs.ETCLR.bit.INT = 0x1;

EPwm1Regs.ETCLR.bit.SOCA = 0x1;

EPwm1Regs.ETCLR.bit.SOCB = 0x1;

//启用中断

  PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//向量启用

  PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//启用 ADC

  PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//启用 ePWM1零中断

  IER |= M_INT1;

  IER |= M_INT3;

EINT;

ERTM;

  while (1)

  {

  DELAY_US (10000);

  }

中断空 ADC_ISR (空)

//在此处插入 ISR 代码

VoltageA[0]= AdcRegs.ADCRESULT0 >>4;

VoltageA[1]= AdcRegs.ADCRESULT1 >>4;

VoltageA[2]= AdcRegs.ADCRESULT2 >>4;

VoltageB[0]= AdcRegs.ADCRESULT3 >>4;

VoltageB[1]= AdcRegs.ADCRESULT4 >>4;

VoltageB[2]= AdcRegs.ADCRESULT5 >>4;

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;     //重置 SEQ1

AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;     //重置 SEQ1

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;   //清除 INT SEQ1位

AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1;   //清除 INT SEQ1位

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //确认 PIE 中断

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您似乎正在读取 VoltageB[]的错误 ADCRESULT 寄存器。  它应该是 ADCRESULT8-ADCRESULT10。

    此外:

    1. 您可以使用 AdcMirror 寄存器消除>4移位
    2. AdcRegs.ADCTRL2.bit.SOC_SEQn 位用于通过 CPU 立即触发 SOC、在初始化期间不应置位