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/TMS320F2808:TMS320F2808

Guru**** 2609695 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/673919/ccs-tms320f2808-tms320f2808

器件型号:TMS320F2808

工具/软件:Code Composer Studio

我已经编写了一个用于转换9个 ADC 通道的代码。 我使用了级联转换模式。 ADC 由软件触发。 触发源被放置在每1ms 执行一次的 timer0 ISR 中。 timer0运行正常、但未进行 ADC 转换。 我已尝试对其进行调试、但问题仍然存在。 有人可以提供帮助吗? 代码如下所示。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#include "DSP280x_Device.h"
#include "DSP280x_examples.h"

_interrupt void CPU_timer0_ISR (void);
中断空 ADC_ISR (空)

void main (void)

InitSysCtrl();

Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

InitAdc();

AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;//ADC 初始化以级联模式运行。 9通道转换。
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x5;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x6;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8;
AdcRegs.ADCMAXCONV.BIT.MAX_CONV1 = 0x8;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1;

EALLOW;
SysCtrlRegs.HISPCP。all = ADC_MODCLK;
EDIS;

EALLOW;
PieVectTable.TINT0 =&CPU_timer0_ISR;
PieVectTable.ADCINT =&ADC_ISR;
EDIS;

InitCpuTimer();

ConfigCpuTimer (&CpuTimer0、100、1000);
CpuTimer0Regs.TCR.ALL = 0x4000;


IER |= M_INT1;


PieCtrlRegs.PIEIER1.bit.INTx6=1;
PieCtrlRegs.PIEIER1.bit.INTx7=1;


EINT;
ERTM;

for (;;)

_asm ("NOP");

_interrupt void CPU_timer0_ISR (void)//计时器每1ms 执行一次

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;//启用 SEQ1的软件触发器
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;//启用 SEQ2的软件触发
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

中断空 ADC_ISR (空)

A[0]=AdcRegs.ADCRESULT0>>4;
A[1]=AdcRegs.ADCRESULT1 >>4;
A[2]=AdcRegs.ADCRESULT2 >>4;
A[3]=AdcRegs.ADCRESULT3 >>4;
A[4]=AdcRegs.ADCRESULT4 >>4;
A[5]=AdcRegs.ADCRESULT5 >>4;
A[6]= AdcRegs.ADCRESULT6 >>4;
A[7]= AdcRegs.ADCRESULT7 >> 4;
A[8]=AdcRegs.ADCRESULT8 >> 4;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//为下一个 ADC 序列重新初始化
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;//为下一个 ADC 序列重新初始化
AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

返回;

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

    Ashwin、

    您能否在示例中定义"ADC 转换未发生"的行为?  结果寄存器是否从未更新、或者您是否未触发 ADC 中断?

    根据您的描述、您可能需要考虑:

    1. 清除 SEQ_OVRD、以便 ADC 转换自动回绕到 CONV00、而不是使用 RST_SEQ 位手动回绕
    2. 如果 INT_SEQ1是级联模式中的主中断信号、则启用 INT_SEQ1

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    未发生中断。 因此、如果我在发生中断后使用 INT_SEQ1来清除标志、则如果我设置该标志、则会发生该情况
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;单独使用? ADC 是否会从 A0、A1、A2转换... 分别是 B0? 还是像 A0、B0、A1… A7?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ashwin、

    INT_SEQx 位不会对序列发生器操作产生任何影响。  它们只控制到 CPU /系统的中断信号是如何生成的以及它们在 ISR 中的处理方式。

    我看到您已启用 INT_SEQ2 (AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1)、但我看不到 INT_SEQ1已启用。

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已启用它、但它仍然无法正常工作。 我考虑了一个不同的代码。 在这里、我要做的是感应三个值并进行一些计算并更新 PWM。 ADC 中断正在发生、但转换值始终为0。

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    #include "DSP280x_Device.h"
    #include "DSP280x_examples.h"
    #include "math.h"

    int i=0;
    浮点 VA、Vb、Vc;


    #define ADC_MODCLK 0x4
    #define ADC_CKPS 0x0
    #define ADC_SHCLK 0x1

    typedef 结构

    volatile struct ePWM_regs * EPwmRegHandle;
    }ePWM_INFO;

    void InitEPwm1Examples(void);
    void InitEPwm2Examples(void);
    void InitEPwm3Examples(void);
    void InitEPwm4Examples(void);

    _interrupt void CPU_timer0_ISR (void);
    _interrupt void epwm1_ISR (void);
    void setup_ADC (void);
    中断空 ADC_ISR (空);

    INT EPWM1_CMPA=0;
    int EPWM2_CMPA=0;
    int EPMW3_CMPA=0;
    int EPWM4_CMPA=0;


    void main (void)

    InitSysCtrl();

    InitEPwm1Gpio();
    InitEPwm2Gpio();
    InitEPwm3Gpio();
    InitEPwm4Gpio();

    Dint;

    InitAdc();
    Setup_adc();

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;
    PieVectTable.EPWM1_INT =&epwm1_ISR;
    PieVectTable.TINT0 =&CPU_timer0_ISR;
    PieVectTable.ADCINT =&ADC_ISR;
    EDIS;

    InitCpuTimer();


    ConfigCpuTimer (&CpuTimer0、100、1000);
    CpuTimer0Regs.TCR.ALL = 0x4000;

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
    GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;
    EDIS;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;

    InitEPwm1Examples();
    InitEPwm2Examples();
    InitEPwm3Examples();
    InitEPwm4Examples();

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

    IER |= M_INT3;
    IER |= M_INT1;


    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
    PieCtrlRegs.PIEIER3.bit.INTx3=1;
    PieCtrlRegs.PIEIER1.bit.INTx6=1;
    PieCtrlRegs.PIEIER1.bit.INTx7=1;


    EINT;
    ERTM;

    //步骤6. 空闲循环。 只需坐下来循环(可选):
    for (;;)

    _asm ("NOP");




    _interrupt void CPU_timer0_ISR (void)

    AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    _interrupt void epwm1_ISR (void)


    EPwm1Regs.CMPA.half.CMPA = w;
    EPwm2Regs.CMPA.half.CMPA = x;
    EPwm3Regs.CMPA.half.CMPA = y;
    EPwm4Regs.CMPA.half.CMPA = z;

    //清除此计时器的 INT 标志
    EPwm1Regs.ETCLR.bit.INT = 1;

    //确认此中断以接收来自组3的更多中断
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;




    空 InitEPwm1Examples()

    //设置 TBCLK
    EPwm1Regs.TBPRD = 2500;
    EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm1Regs.TBCTR = 0x0000;

    //设置比较值
    EPwm1Regs.CMPA.half.CMPA = EPWM1_CMPA;

    //设置计数器模式
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置操作
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.DBCTL.bit.out_mode=DB_full_enable;
    EPwm1Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;
    EPwm1Regs.DBCTL.bit.in_mode=DBA_all;
    EPwm1Regs.DBRED=100;
    EPwm1Regs.DBFED=100;

    //中断,我们将在其中更改比较值
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
    EPwm1Regs.ETSEL.bit.INTEN = 1;
    EPwm1Regs.ETPS.bit.INTPRD = et_1st;


    空 InitEPwm2Examples()

    EPwm2Regs.TBPRD = 2500;
    EPwm2Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm2Regs.TBCTR = 0x0000;

    //设置比较值
    EPwm2Regs.CMPA.half.CMPA = EPWM1_CMPA;

    //设置计数器模式
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置操作
    EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm2Regs.DBCTL.bit.out_mode=DB_full_enable;
    EPwm2Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;
    EPwm2Regs.DBCTL.bit.in_mode=DBA_all;
    EPwm2Regs.DBRED=100;
    EPwm2Regs.DBFED=100;


    空 InitEPwm3Examples(空)

    EPwm3Regs.TBPRD = 2500;
    EPwm3Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm3Regs.TBCTR = 0x0000;

    //设置比较值
    EPwm3Regs.CMPA.half.CMPA = EPWM1_CMPA;

    //设置计数器模式
    EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置操作
    EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm3Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm3Regs.DBCTL.bit.out_mode=DB_full_enable;
    EPwm3Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;
    EPwm3Regs.DBCTL.bit.in_mode=DBA_all;
    EPwm3Regs.DBRED=100;
    EPwm3Regs.DBFED=100;


    空 InitEPwm4Examples(空)

    EPwm4Regs.TBPRD = 2500;
    EPwm4Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm4Regs.TBCTR = 0x0000;

    //设置比较值
    EPwm4Regs.CMPA.half.CMPA = EPWM1_CMPA;

    //设置计数器模式
    EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //设置操作
    EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm4Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm4Regs.DBCTL.bit.out_mode=DB_full_enable;
    EPwm4Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;
    EPwm4Regs.DBCTL.bit.in_mode=DBA_all;
    EPwm4Regs.DBRED=100;
    EPwm4Regs.DBFED=100;


    中断空 ADC_ISR (空)


    GpioDataRegs.GPATOGGLE.bit.GPIO14=1;

    A[0]= AdcRegs.ADCRESULT0 >> 4;
    A[1]=AdcRegs.ADCRESULT1 >> 4;
    A[2]=AdcRegs.ADCRESULT2 >> 4;

    \\Space Vector 调制代码

    //为下一个 ADC 序列重新初始化
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
    返回;


    void setup_ADC (void)

    EALLOW;
    SysCtrlRegs.HISPCP。ALL = 0x4;
    EDIS;

    //配置 ADC
    AdcRegs.ADCMAXCONV.ALL = 0x0002;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ashwin、

    读回所有零都是非常奇怪的。  您使用的是 TI EVM 还是定制板?  像"ADC_SoC"这样的标准示例是否起作用?  您能否确认 InitAdc()是否按预期设置加电位?   AdcMirror ()寄存器是否也读回零?

    Tommy

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

    您仍有问题吗?

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

    为了测试 ADC 的正常工作、我尝试了以下代码。 我基本上在 ADC 引脚1中读取一个值、并相应地更改 epwm1中的占空比。 ePWM 的输出为零。

    正在发生 ADC 中断、我使用 GPIO14引脚对其进行了检查。

    当我将线路 w=2500*V/4095改为 w=1250时;在 ADC 服务例程中、我得到一个占空比为50%的脉冲、这是正确的。 所以,问题是它为什么不适用于 w=2500*V/4095;我怀疑 ADC 读数为0。 有没有关于如何解决这个问题的想法?

    我为 ADC 引脚提供1.5V 电压。

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    #include "DSP280x_Device.h"
    #include "DSP280x_examples.h"
    int w=0;

    typedef 结构

    volatile struct ePWM_regs * EPwmRegHandle;
    }ePWM_INFO;

    void InitEPwm1Examples(void);

    _interrupt void CPU_timer0_ISR (void);

    中断空 ADC_ISR (空);

    void main (void)


    InitSysCtrl();

    InitEPwm1Gpio();\\Setup 引脚作为 PWM

    Dint;

    InitPieCtrl();



    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;
    PieVectTable.ADCINT =&ADC_ISR;
    EDIS;

    EALLOW;
    PieVectTable.TINT0 =&CPU_timer0_ISR;
    EDIS;

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
    GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;
    EDIS;

    InitCpuTimer(); \\设置1kHz 的定时器
    ConfigCpuTimer (&CpuTimer0、100、1000);
    CpuTimer0Regs.TCR.ALL = 0x4000;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;

    InitEPwm1Examples();

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

    IER |= M_INT3;
    IER |= M_INT1;

    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    PieCtrlRegs.PIEIER1.bit.INTx6=1;

    \\Initializing ADC (正在初始化 ADC)
    EALLOW;
    SysCtrlRegs.HISPCP。ALL = 0x4;
    EDIS;
    InitAdc();
    AdcRegs.ADCMAXCONV.ALL = 0x0001; //在 SEQ1上设置2 conv
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

    EINT;
    ERTM;

    for (;;)

    _asm ("NOP");



    _interrupt void CPU_timer0_ISR (void)\\Interrupt after every 1ms


    EPwm1Regs.CMPA.half.CMPA = w;\\updation of CMPA

    AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;\\正在 强制进行 ADC 转换

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    空 InitEPwm1Examples()

    EPwm1Regs.TBPRD = 2500;
    EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm1Regs.TBCTR = 0x0000;

    EPwm1Regs.CMPA.half.CMPA = 0;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.DBCTL.bit.out_mode=DB_full_enable;
    EPwm1Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;
    EPwm1Regs.DBCTL.bit.in_mode=DBA_all;
    EPwm1Regs.DBRED=10;
    EPwm1Regs.DBFED=10;


    中断空 ADC_ISR (空)


    GpioDataRegs.GPATOGGLE.bit.GPIO14=1;\\检查 ADC 中断的发生
    v= AdcRegs.ADCRESULT0>>4;
    W=(int) 2500*V/4095;

    //为下一个 ADC 序列重新初始化
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

    返回;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、能不能帮助我摆脱了想法!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ashwin、

    当您说结果都为0时、您在哪里查看? 您是否尝试直接从 CCS 存储器或表达式窗口观察 ADCRESULT 或 ADCMIRROR 寄存器?

    此外、您的 ADC 结果变量(如 V 或 a[]或 a[])在哪里声明? 我无法验证变量范围。

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

    请单独遵守以下代码。 我正在观察表达式窗口中的值、它为零。

    此外、我正在使用 ADC 读取值更新 epwm1的 CMPA。以下是用于提升的代码。
    v= AdcRegs.ADCRESULT0>>4;
    W=(int) 2500*V/4095;
    EPwm1Regs.CMPA.half.CMPA = w;

    我发现 ePWM 输出也为零、证明 ADC 转换为零。

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    #include "DSP280x_Device.h"
    #include "DSP280x_examples.h"
    int w=0、V=0;

    typedef 结构

    volatile struct ePWM_regs * EPwmRegHandle;
    }ePWM_INFO;

    void InitEPwm1Examples(void);

    _interrupt void CPU_timer0_ISR (void);

    中断空 ADC_ISR (空);

    void main (void)


    InitSysCtrl();

    InitEPwm1Gpio();\\Setup 引脚作为 PWM

    Dint;

    InitPieCtrl();



    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW;
    PieVectTable.ADCINT =&ADC_ISR;
    EDIS;

    EALLOW;
    PieVectTable.TINT0 =&CPU_timer0_ISR;
    EDIS;

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
    GpioCtrlRegs.GPADIR.bit.GPIO14 = 1;
    EDIS;

    InitCpuTimer();\\设置1kHz 的计时器
    ConfigCpuTimer (&CpuTimer0、100、1000);
    CpuTimer0Regs.TCR.ALL = 0x4000;

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;

    InitEPwm1Examples();

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

    IER |= M_INT3;
    IER |= M_INT1;

    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    PieCtrlRegs.PIEIER1.bit.INTx6=1;

    \\Initializing ADC (正在初始化 ADC)
    EALLOW;
    SysCtrlRegs.HISPCP。ALL = 0x4;
    EDIS;
    InitAdc();
    AdcRegs.ADCMAXCONV.ALL = 0x0001;//在 SEQ1上设置2 conv
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x1;
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

    EINT;
    ERTM;

    for (;;)

    _asm ("NOP");



    _interrupt void CPU_timer0_ISR (void)\\Interrupt after every 1ms


    EPwm1Regs.CMPA.half.CMPA = w;\\updation of CMPA

    AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;\\正在 强制进行 ADC 转换

    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    空 InitEPwm1Examples()

    EPwm1Regs.TBPRD = 2500;
    EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;
    EPwm1Regs.TBCTR = 0x0000;

    EPwm1Regs.CMPA.half.CMPA = 0;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;

    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.DBCTL.bit.out_mode=DB_full_enable;
    EPwm1Regs.DBCTL.bit.POLSEL=DB_ACTV_HIC;
    EPwm1Regs.DBCTL.bit.in_mode=DBA_all;
    EPwm1Regs.DBRED=10;
    EPwm1Regs.DBFED=10;


    中断空 ADC_ISR (空)


    GpioDataRegs.GPATOGGLE.bit.GPIO14=1;\\检查 ADC 中断的发生
    v= AdcRegs.ADCRESULT0>>4;
    W=(int) 2500*V/4095;

    //为下一个 ADC 序列重新初始化
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//复位 SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 INT SEQ1位
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断

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

    Ashwin、

    您能否从 软件支持包中运行未经修改的 ADC_SoC 示例 、以查看是否获得预期的 ADC 结果?  我想确保您的设备没有缺陷。

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我检查了输出是否相同、它给出了零。 然后、我切换到另一个 controlCARD F28044、并在其中尝试了 ADC_SoC 程序、同样的问题也在出现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我交叉参考了 F2808和 F28335的 adcinit()函数。
    语句 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;在 F28335中、F2808和 F28044中缺少该语句。
    这是问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ashwin、

    是的、如果 ADCENCLK 未设置、这将是一个问题。 这肯定会导致从 ADCRESULT 寄存器中读取所有0、但也无法访问 ADC 配置寄存器。 由于您报告 ADC 中断正常工作、我不认为 ADCENCLK 位是可能的因素。

    您是否能够确认您的软件中是否设置了此位?

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我的程序中设置了它。 但转换仍然没有发生。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ashwin、

    让我们仔细检查您的设置。

    确认这些组件已组装在 controlCARD 上:

    • C30 (ADC-REFP)
    • C31 (ADC-REFM)
    • R2 (ADC-RESEXT)

    然后在扩展坞上强制施加以下电压:

    • 1.5V 至 A2 (对接引脚61)
    • 0V 至 GND (对接引脚62)
    • 1.5V 至 A3 (对接引脚63)

    测量 controlCARD 上的强制电压电平:

    • C25端子(A2和 GND)
    • C24端子(A3和 GND)

    如果一切正常、请提取一个全新的未修改的 F2808 ADC_SoC 示例副本、以查看1.5V 强制电压下的转换是否约为2048。

    Tommy

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

    自您上次更新以来已超过两周。 我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案并回复此主题。 如果此主题已锁定、请制作一个描述问题当前状态的新主题。

    Tommy