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.

[参考译文] TMS320F28335 ADC 无法正常工作。

Guru**** 2611705 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/684844/tms320f28335-adc-doesn-t-work

Thread 中讨论的其他器件:controlSUITEC2000WARE

我在 ADC-F28335上工作、但它不起作用、请帮我。 这是我的代码。

#include "DSP2833x_Device.h"
#include "math.h"
extern void InitAdc (void);
extern void InitSysCtrl(void);
extern void InitPieCtrl (void);
extern void InitPieVectTable (void);
中断空 ADC_ISR (空);
unsigned int ap;
unsigned int dong;
浮点环计数;
void main (void)

Loopcount = 0;
InitSysCtrl();
EALLOW;
EDIS;
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCINT =&ADC_ISR;
EDIS;
InitAdc();
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
AdcRegs.ADCTRL1.bit.ACQ_PS = 7;//1.
AdcRegs.ADCTRL1.bit.CPS = 0;

AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;

AdcRegs.ADCTRL3.bit.ADCCLKPS=0;
AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;
AdcRegs.ADCMAXCONV.ALL = 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0000;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0001;

EPwm6Regs.ETSEL.bit.SOCAEN = 1;
EPwm6Regs.ETSEL.bit.SOCASEL = 4;
EPwm6Regs.ETPS.bit.SOCAPRD = 1;
EPwm6Regs.CMPA.half.CMPA = 0x0080;
EPwm6Regs.TBPRD = 0xFFFF;
EPwm6Regs.TBCTL.bit.CTRMODE = 0;

PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER |= 0x0001;
EINT;
ERTM;
for (;;)

Loopcount++;


中断空 ADC_ISR (空)

AP =(AdcRegs.ADCRESULT0)*3/65520;
Dong =(AdcRegs.ADCRESULT1)*3/65520;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
返回;

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

    您能否描述您看到的行为以及它如何偏离您的期望?

    C2000Ware 或 controlSUITE 中的 ADC_SoC 示例是否正常工作?

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、因为我迟到了。
    我将修改 controlSUITE 中示例中的代码。 我将读取数据表 ADC 并配置 ADC 的回电容器。 我想读取传感器的电压。 ADC 输入范围为0至2电压。 我在表达式中看到电压值,但该值不正确,我看到的值为-200,xxx 或2.xxxe-12 (我不记得更正了该值)。
    请帮帮我。 谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这里、我尝试修改代码、但它不起作用。
    main.c:
    #include "DSP28x_Project.h"
    #include "math.h"
    extern void InitSysCtrl(void);
    extern void InitAdc (void);
    extern void InitPieCtrl (void);
    extern void InitPieVectTable (void);
    中断空 ADC_ISR (空);
    uint16环计数;
    浮点值1;
    浮点值2;
    MAIN ()

    LoopCount = 0;
    InitSysCtrl();
    EALLOW;
    #IF (CPU_FRQ_150MHz)
    #define ADC_MODCLK 0x3
    #endif
    EDIS;
    EALLOW;
    SysCtrlRegs.HISPCP。all = ADC_MODCLK;
    EDIS;
    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    EALLOW;
    PieVectTable.ADCINT =&ADC_ISR;
    EDIS;
    InitAdc();
    PieCtrlRegs.PIEIER1.bit.INTx6=1;
    IER |= M_INT1;
    EINT;
    ERTM;
    //假设 ePWM1时钟已在 InitSysCtrl()中启用;
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;
    EPwm1Regs.CMPA.half.CMPA = 0x0080;
    EPwm1Regs.TBPRD = 0xFFFF;
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;
    // for (;;)
    //{
    // LoopCount++;
    //}

    中断空 ADC_ISR (空)

    Voltage1 = AdcMirror.ADCRESULT0;
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
    返回;



    DSP2833x_adc.c
    #include "DSP2833x_Device.h" // DSP2833x 头文件包含文件
    #include "DSP2833x_examples.h"// DSP2833x 示例包含文件
    //
    //定义
    //
    #define ADC_USDELAY 5000L

    无效
    InitAdc (空)

    extern void DSP28x_usDelay (uint32计数);
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
    adc_cal();
    EDIS;
    AdcRegs.ADCTRL3.bit.ADCBGRFDN = 11;
    AdcRegs.ADCTRL3.bit.ADCPWDN = 1;
    AdcRegs.ADCTRL3.bit.ADCCLKPS=1;// ADCLCK = HSPCLK/2*1.
    AdcRegs.ADCTRL3.bit.SMODE_SEL = 1;
    /*
    AdcRegs.ADCTRL3.ALL = 0x00E0;//加电带隙/参考/ADC 电路
    *
    DELAY_US (ADC_USDELAY); //转换 ADC 通道前的延迟
    AdcRegs.ADCMAXCONV.ALL = 0x0001;
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0000;

    AdcRegs.ADCTRL1.bit.ACQ_PS = 0;
    AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
    AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
    AdcRegs.ADCTRL1.bit.CPS = 0;
    AdcRegs.ADCTRL1.bit.SUSMOD = 0;
    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;

    AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0; //SEQ1由 ePWM 模块中的 SOCA 启动
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; 针对 EOS 启用 SEQ1的//中断请求
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1; //将 SEQ1重置为初始预生成状态
    AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1=1; //从 SEQ1的 EPWMA 触发器启用 SOC

    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除中断标志位 INT_SEQ1
    AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1; //清除中断标志位 INT_SEQ2

    AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM = 0; //设置偏移误差校正值
    AdcRegs.ADCREFSEL.bit.REF_SEL =0;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    裴天

    我强烈建议您首先在 controlSUITE 中使用 ADC 示例的未修改版本、因为众所周知、这些示例可以正常工作、因此我们可以使用它来确保您的器件和电路板没有故障。

    我看到、在您的第一个示例中、您尝试直接使用 AdcRegs 的 ADCRESULT0值而不进行位移、但现在您正在使用 AdcMirror、因此您已经确定了一个问题。

    您将电压施加到哪个引脚? 您读取 Voltage1的值的时间点是什么? 配置 EPWM 后,您的 main()函数似乎会运行到完成并退出程序。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我首先使用 controlSUITE 中的 ADC 示例、但它也不起作用。 我在 controlSUITE 中看到代码 ADC_SOC、并重新生成代码不要配置寄存器 ADCTRL2。 为什么?
    I 在引脚 ADCINA0上提供1电压。
    我不理解您说的 main()在配置 ePWM 后立即运行以完成并退出。 我按照 controlSUITE 中的示例 ADC_SoC 中的相同方式配置 ePWM。
    请帮帮我。 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    裴天

    controlSUITE (附 v142)中的 ADC_SoC 示例确实配置 了 ADCTRL2。  请确认您的 ADC_SoC 示例之前未修改。

    e2e.ti.com/.../3443.Example_5F00_2833xAdcSoc.c

    此外、请注意示例顶部说明转换了哪些 ADC 通道的注释:

    //! 此 ADC 示例使用 ePWM1在 SEQ1上生成周期性 ADC SOC。
    //! 转换了 ADCINA3和 ADCINA2两个通道。 

    最后,您将看到 main()的末尾是一个无限 for ()循环,它将使示例程序保持活动状态。  如果没有此循环,main()函数将退出,所需的应用程序将不再处于活动状态。

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。 这是我在 controlSUITE 中使用示例 ADC_SOC 时的结果。 我只需将通道转换从 adcin0修改为 adcin3、并在 adcin0中保留代码和电源1电压。 但我读取的结果是17198。 结果是错误的、对吧? 任何关于该问题的建议。 我看一下代码,看到注释//em以为 ePWM1时钟已在 InitSysCtrl()中启用。 ePWM 的时钟是否已配置。
    请帮帮我。 非常感谢。

    #include "DSP28x_Project.h" //设备头文件和示例包括文件
    _interrupt void ADC_ISR (void);
    uint16环计数;
    // uint16转换计数;
    uint16 Voltage1;
    uint16 Voltage2;

    MAIN ()

    InitSysCtrl();
    EALLOW;
    #IF (CPU_FRQ_150MHz) //默认- 150MHz SYSCLKOUT
    #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0MHz
    #endif
    #IF (CPU_FRQ_100MHz)
    #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2)= 25.0MHz
    #endif
    EDIS;
    EALLOW;
    SysCtrlRegs.HISPCP。all = ADC_MODCLK;
    EDIS;
    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.ADCINT =&ADC_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
    InitAdc ();//对于此示例,初始化 ADC
    PieCtrlRegs.PIEIER1.bit.INTx6=1;
    IER |= M_INT1;//启用 CPU 中断1
    EINT; //启用全局中断 INTM
    ERTM; //启用全局实时中断 DBGM
    LoopCount = 0;
    //配置 ADC
    AdcRegs.ADCMAXCONV.ALL = 0x0001; //在 SEQ1上设置2 conv
    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;//将 ADCINA3设置为第1个 SEQ1转换器
    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;//将 ADCINA2设置为第2个 SEQ1转换器
    AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;//从 ePWM 启用 SOCA 以启动 SEQ1
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS)

    //假设 ePWM1时钟已在 InitSysCtrl()中启用;
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4; //从 CPMA 上数选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
    EPwm1Regs.CMPA.half.CMPA = 0x0080; //设置比较 A 值
    EPwm1Regs.TBPRD = 0xFFFF; //为 ePWM1设置周期
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; //向上计数并启动

    //等待 ADC 中断
    for (;;)

    LoopCount++;



    _interrupt void ADC_ISR (void)

    Voltage1 = AdcRegs.ADCRESULT0 >>4;
    Voltage2 = AdcRegs.ADCRESULT1 >>4;
    /* if (ConversionCount = 9)

    ConversionCount = 0;

    其他

    ConversionCount++;}
    *
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
    返回;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    裴天

    除了简单的通道更改之外、您似乎再次使用 controlSUITE 示例的修改副本。 原始代码使用数组来存储 ADC 转换、而您发布的代码则删除了该代码。 这会减慢进度、因为我们无法为调试建立可靠的基础。

    何时观察 Voltage1值? 是否在 ADC_ISR()的末尾设置断点以观察转换?

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

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

    Tommy