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.

[参考译文] TMS320F28035:F28035 "C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5"ADC_SOC 示例代码不起作用

Guru**** 2529560 points
Other Parts Discussed in Thread: TMS320F28035, TMDSCNCD28035, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/764882/tms320f28035-f28035-c-ti-controlsuite-device_support-f2803x-v130-dsp2803x_examples_ccsv5-adc_soc-example-code-not-working

器件型号:TMS320F28035
主题中讨论的其他器件: TMDSCNCD28035C2000WARE

您好!

我不熟悉 TI 控制器 IC TMS320F28035。 我已下载控制套件并尝试 ADC_SOC 代码以测试 ADC 代码。 在我的实验板套件上、A2和 A4引脚已接地。 因此、我期望 ADC_Results 为零、但始终为4095! 请帮助我了解问题。

代码如下所示:

//######################################################################################################################
//描述:
//! 添加到组 F2803x_example_list
//!

ADC 转换开始(ADC_SoC)


//!
//! 此 ADC 示例使用 ePWM1来生成周期性 ADC SOC - ADCINT1。
//! 两个通道被转换、ADCINA4和 ADCINA2。
//!
//! b 监视\b 变量\n
//! - Voltage1[10]-最后10个 ADCRESULT0值
//! - Voltage2[10]-最后10个 ADCRESULT1值
//! -转换计数-当前结果编号0-9
//! -循环计数-空闲循环计数器
//
//
//######################################################################################################################
//$TI 版本:F2803x C/C++头文件和外设示例 V130 $
//$Release Date:2015年5月8日$
//版权所有:版权所有(C) 2009-2015 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
//此文件中找到的函数的原型语句。
_interrupt void ADC_ISR (void);
void ADC_Config (void);
//此示例中使用的全局变量:
uint16环计数;
UINT16转换计数;
uint16 Voltage1[10];
uint16 Voltage2[10];
MAIN ()

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP2803x_SYSCTRL.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 DSP2803x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP2803x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP2803x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP2803x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT1 =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//步骤4. 初始化所有器件外设:
InitAdc ();//对于此示例,初始化 ADC
AdcOffsetSelfCal();
//步骤5. 特定于用户的代码、启用中断:
//在 PIE 中启用 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
IER |= M_INT1;//启用 CPU 中断1
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
LoopCount = 0;
ConversionCount = 0;
//配置 ADC
//注意:通道 ADCINA4将被双采样以解决修订版0器件勘误表的 ADC 第一个采样问题
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 2;//设置 EOC2以触发 ADCINT1触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4;//将 SOC0通道选择设置为 ADCINA4 (针对修订版0勘误权变措施的虚拟样本)
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4;//将 SOC1通道选择设置为 ADCINA4
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;//将 SOC2通道选择设置为 ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC1启动触发器,因为循环 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC2启动触发器,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;//将 SOC2 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
EDIS;
//假设 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;//设置比较值
EPwm1Regs.TBPRD = 0xFFFF;//为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动
//等待 ADC 中断
for (;;)

LoopCount++;


_interrupt void ADC_ISR (void)

Voltage1[ConversionCount]= AdcResult.ADCRESULT1;//丢弃 ADCRESULT0作为版本0的第1个样本勘误表权变措施的一部分
Voltage2[ConversionCount]= AdcResult.ADCRESULT2;
//如果记录了20次转换,则重新开始
if (ConversionCount = 9)

ConversionCount = 0;

其他

ConversionCount++;

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
返回;

谢谢、

Akshay

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

    Akshay、

    感谢您访问 E2E 论坛。  

    ADCINA2/A4/A6的独特之处在于它们也是片上比较器的同相输入。  为了对该函数进行一些迟滞、在 ADCINA2/4/6和相应比较器的输出之间有一个~100kOhm 的电阻器。

    如果您将 ADCINA2/A4连接到具有类似阻抗的接地端、它可能会解释为什么您在这些引脚上看到4095 (3.3V)作为 ADC 转换。

    这些引脚还有第三个功能、即通用 I/O  如果这是您正在运行的唯一示例、则应在复位时禁用此功能、我怀疑这是问题所在。

    有几种方法可以解决此问题:

    1)在 ADCRegs 结构中有一个寄存器被调用的 COMPHYSTCTL。  如果写入值0x0842、则会禁用反馈电路并消除连接到 COMPOUT 的100kOhm

    EALLOW;
    AdcRegs.COMPHYSTCTL.all = 0x0842;
    EDIS;
    

    2)请勿为比较器供电;如果您不打算使用比较器或仅针对本示例禁用比较器、也会删除反馈。  由于这是一个通用示例、因此很可能所有内容都在主 init 调用中打开。

    如果上述任一项都无法解决问题、我建议尝试不同的 ADC 输入集、以查看问题是否仍然存在或消失。  您可以告诉我上述结果、我们可以根据需要进行更多的工作。

    Matt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    希望跟进、看看上述内容是否能解决您的问题。 我将标记"TI 认为已解决"标志、但请随时跟进、这将通知我您的回复。

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

    我们尝试了这两种解决方案、但没有解决我的问题。
    如需了解相关信息、我们将使用

    www.mouser.in/.../TMDSDOCK28035

    该实验板套件适用于 F28035。 如果您有任何其他建议、请告诉我。 我正在联系当地支持人员以解决此问题。

    谢谢、
    Akshay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    请检查开关 SW3、它控制 VREFHI 和 VREFLO 的连接。 对于示例代码、您希望两个切换都位于向下(对接时)位置。 这会将 VREFHI 连接至3.3V、并将 VREFLO 连接至 VSSA。 如果其中任何一个处于向上位置、则 VREF 将来自默认不驱动的 DIMM 插槽。

    此信息位于以下信息表中:C:\ti\c2000\C2000Ware_1_00_06_00\boards\controlCARDs\TMDSCNCD28035\R1_2\F2803xcontrolCARD_InfoSheet.pdf

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

    您好、Matthew、

    我们尚未对 SW3的默认设置进行任何更改。 我为我们正在使用的设置附加了一个图像。 我希望您可以在图像中看到这一点

    谢谢、

    Akshay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    是否可以尝试不同的 ADC 通道、如 ADCINA3/A5? 如果可能、我想消除对比较器在这里发挥作用的任何怀疑。 由于您使用的是开箱即用示例、因此我们将会考虑典型的关注问题:时钟速率、ADC 采样顺序、ADC 基准加电时间或任何勘误表、因此我不能解释为什么您会看到这种超出规格的性能。

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

    您好、Matthew、

    您是否可以发布您希望我尝试的代码?

    谢谢、

    Akshay

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

    Akshay、

    请在下面的第93-107行开始进行 C/P、以将通道从4和2切换至5和3。

    EALLOW;
    AdcRegs.ADCCTL1.bit.INTPULSEPOS= 1;//ADCINT1在 AdcResults 锁存
    器 AdcRegs.INTSEL1N2.bit.INT1E 之后跳闸 = 1;//启用 ADCINT1
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
    AdcRegs.INTSEL1N2.bit.INT1SEL= 2;//设置 EOC2以触发 ADCINT1以触发 AdcRegs.ADCCO0CTL.ADCCOCL.INT1SEL
    = 0;//设置ADCCOCL.ADCCOCL.ADCCORED0 = 0通道 ADCCOCL.ADCCOSEL = 0;//设置 ADCCORED0通道 ADCCOCL.ADCCOCL.ADCCORED0 = ADCCORED0;ADCCOC.ADCCOC.ADCCOC.OCC3.ADCCOSEL = ADCCORED= ADCCO.ADCCO.ADCCORE
    
    //将 SOC2通道选择设置为 ADCINA2
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL= 5;//设置 SOC0在 EPWM1A 上启动触发器,由于轮询 SOC0先转换,然后 SOC1,接着 SOC2
    AdcRegs.ADC1CTL.bit.TRIGSEL= 5,然后根据 SOC0
    在 SOC0上转换,然后根据 SOC0在 SOC0开始,再根据 ADCSOC0在 SOCSOC0开始。//设置 EPWM1A 上的 SOC2启动触发器、由于循环 SOC0先转换 SOC1、然后 SOC2
    AdcRegs.ADCSOC0CTL.bit.ACQPS= 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS + 1)
    AdcRegs.ADCS1CTPS= 6位;ACCTPS = 6位//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS + 1)
    AdcRegs.ADCSOC2CTL.bit.ACQPS= 6;//将 SOC2 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS + 1个)
    EDIS; 

    最棒的
    Matthew

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

    尊敬的 Mathew:

    仍然是同一问题

    我已附上当前设置的屏幕截图和图像、请进一步帮助我们。

    如果可能、我们可以设置在线呼叫并进行更详细的讨论。  请帮帮我们。

    谢谢、

    Akshay Godase

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

    Akshay、

    您能否添加

    AdcResult.ADCRESULT1
    AdcResult.ADCRESULT2 

    观察窗口以及 Voltage1/2数组?  我想确保我们不会处理内存映射问题与 ADC 结果问题。

    最棒的

    Matthew

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

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

    Akshay、

    回到示例、在第136行、您应该看到以下语句:

    AdcOffsetSelfCal(); 

    请进入此函数并注意(通过观察窗口或悬停在变量上)在第159行(在 DSP2803x_ADC.c 内)写入 AdcConvean 的值之后(在该行中)。

    如果你可以在这个函数返回主函数后将一个观察窗口上拉至 AdcRegs 并在屏幕上捕获这些窗口、这也将有帮助。

    最棒的
    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    希望了解您是否有幸执行上述调试步骤。

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

    Matthew、

    我希望以下图片能为您提供帮助、

    谢谢、

    Akshay Godase

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    感谢您提供的数据、通过本实验、我可以看到、即使连接到内部 VREFLO 通道、ADC 也会转换最大代码。 我们还验证了控制卡上的跳线设置是将 VREFLO 连接到卡上的 VSS。

    我唯一能想到的另一件事是、如果 ADC 时钟超出规格;如果您可以打开 DSP2803x_sysctrl.c 并在第101行确认函数为
    IntOsc1Sel();我们可以知道我们的频率是10MHz。

    我提出这个问题的原因是、示例代码中的所有时钟设置假定内部振荡器在10MHz 时使用。 如果此 SYSCTRL.c 已修改为使用外部振荡器;控制卡上的频率为20MHz、会导致 MCU 运行超出规格。

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

    Matthew、

    我已经完成了该代码、并确保、

    InitSysCtrl();函数从 main 调用

    InitSysCtrl()函数调用 IntOsc1Sel()

    您可以看到 IntOsc1Sel()的函数定义

    我希望这将有所帮助。

    谢谢、

    Akshay Godase

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Akshay、
    您是否有另一个 F28035 CNCD 或基板组合、我们可以尝试使用它来查看问题是否仍然存在? 此时、我认为 ADC 可能已损坏、我们已经介绍了导致此类行为的大多数/所有典型情况。

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

    我也已经尝试过这种方法。

    谢谢、
    Akshay Godase
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经尝试过这个
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthew、  

    这解决了我的问题。 我的 ADC 实验板套件有2个故障。 我订购了一个新的、其中 ADC 工作正常。 我真的很抱歉让你有时间、非常感谢你的所有帮助。

    谢谢、

    Akshay Godase