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/TMS320F2.8069万:ADC程序不适用于TMS320F2.8069万

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/618059/ccs-tms320f28069-adc-program-is-not-working-with-tms320f28069

部件号:TMS320F2.8069万
主题:controlSUITE中讨论的其他部件

工具/软件:Code Composer Studio

大家好,

我正在使用TMS320F28x的EVAL套件。 我正在尝试在 我的开发板中实施PWM+ADC。  我的开发板上的ADC引脚无法正常工作。 PWM在同一开发板上工作。  

我的代码:

   //配置ADC
   EALLOW;
   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;   // ADC
   AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;  //使用内部bandgap
   AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;   //加电带间隙
   AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;  //启动参考
   AdcRegs.ADCCTL1.bit.ADCPWDN = 1;   //为ADC的其余部分加电
   AdcRegs.ADCCTL1.bit.ADCENABLE = 1;  //启用ADC
   AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;//不允许样本重叠

   (i = 0;i < 5000;I++)
   {
   }//                  等待6万个周期=1ms (每次迭代为12个周期)

   AdcRegs.ADCCTL1.bit.INTPULSEPOS =1;//在输出锁存之前创建1个周期的int脉冲

   //将S/H窗口设置为6个clk周期(112.5ns)
   AdcRegs.ADCSOC0CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC1CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC2CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC4CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC5CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC6CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC9CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC8CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC10CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC12CTL.bit.ACQPS = 8;
   AdcRegs.ADCSOC14CTL.bit.ACQPS = 8;

   // AdcRegs.INTSEL1N2.bit.INT1SEL = 12;       // ADCCH12 (ADC-B4) EOC导致ADCInterrupt 1
   //  AdcRegs.INTSEL1N2.bit.INT1CONT = 1;       //将ADCInterrupt 1设置为auto CLR
   AdcRegs.INTSEL1N2.bit.INT1E =0;          //禁用ADC中断

   //请注意,SOC3,7,11,13和15是有效的,但这些SOC未配置
   //因为这些ADC输出在controlSTICK上不存在。 配置
   //配置为可读性。

   //EOC =转换事件结束;SOC =转换事件开始
   AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 0;//没有选择ADC Inrupt 1导致SOC0
   AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
   AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
   AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 0;
   AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 0;
   AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 0;
   AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 0;
   AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 0;
   AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 0;
   AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 0;
   AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 0;

   AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1;// ADC中断中由CPU timer0选择
   AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC8CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC10CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC12CTL.bit.TRIGSEL = 1;
   AdcRegs.ADCSOC14CTL.bit.TRIGSEL = 1;

   //选择接收SOCx时要转换的通道
   AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;//接收到SOC0时转换ADC-A0 (CH0)
   AdcRegs.ADCSOC1CTL.bit.CHSEL = 1;//接收SOC1时转换ADC-A1 (CH1)
   AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;
   AdcRegs.ADCSOC4CTL.bit.CHSEL = 4;
   AdcRegs.ADCSOC5CTL.bit.CHSEL = 5;
   AdcRegs.ADCSOC6CTL.bit.CHSEL = 6;
   AdcRegs.ADCSOC8CTL.bit.CHSEL = 8;
   AdcRegs.ADCSOC9CTL.bit.CHSEL = 9;//接收SOC9时转换ADC-B1 (CH9)
   AdcRegs.ADCSOC10CTL.bit.CHSEL = 10;
   AdcRegs.ADCSOC12CTL.bit.CHSEL = 12;
   AdcRegs.ADCSOC14CTL.bit.CHSEL = 14;
   EDIS;

你们能帮我解决吗?

此致,

Ranjit Chennamchetty

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

    controlSUITE的ADC_SoC示例是否适用于您的主板? 它同时使用PWM和ADC。

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

    感谢您的回复。 我在f2.0869万开发板上编程了ADC_SOC_Example。 ADCResult值非常奇怪。 我没有对代码进行任何更改,也没有应用模拟输入。 (模拟针脚(A0-A7和B0-B7)为浮动)。

    AdcResult.ADCRESULT0 unsigned int 0 0x0万B00@数据
    AdcResult.ADCRESULT1 unsigned int 265 0x0万B01@数据
    AdcResult.ADCRESULT2 无符号int 75 0x0万B02@数据
    AdcResult.ADCRESULT3 无符号int 75 0x0万B03@数据
    AdcResult.ADCRESULT4 无符号int 74 0x0万B04@数据
    AdcResult.ADCRESULT5 无符号int 74 0x0万B05@数据
    AdcResult.ADCRESULT6 无符号int 74 0x0万B06@数据
    AdcResult.ADCRESULT7 无符号int 75 0x0万B07@数据
    AdcResult.ADCRESULT8 无符号int 0 0x0万B08@数据
    AdcResult.ADCRESULT9 无符号int 0 0x0万B09@数据
    AdcResult.ADCRESULT10 无符号int 0 0x0万B0A@数据
    AdcResult.ADCRESULT11 无符号int 0 0x0万B0B@数据
    AdcResult.ADCRESULT12 无符号int 0 0x0万B0C@数据
    AdcResult.ADCRESULT13 无符号int 0 0x0万B0D@数据
    AdcResult.ADCRESULT14 无符号int 0 0x0万B0E@数据
    AdcResult.ADCRESULT15 无符号int 0 0x0万B0F@数据
    添加新表达式

    开发板是否存在该问题或任何其他问题?

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

    当ADC输入引脚浮动时,未定义ADC转换结果。

    您必须在引脚上提供信号才能生成有效的转换结果。

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

    我在坞站上的不同实例上的所有模拟针脚上应用了模拟信号。 在我的表达式窗口中,ADC (AdcResult.ADCRESULT)值没有变化。 (我单击了连续刷新)


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

    ADC_SoC示例将仅转换ADCINA2和ADCINA4,因此您可以专注于这两个信号。 ConversionCount变量是否在执行期间更新?

    您能否确认您正在使用RAM Build配置? 您应该会看到项目文件列表中包含"2.8069万_RAM_lnk.cmd"。

    从RAM执行的代码比从闪存执行的代码更容易调试。

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

    Tommy,

    我真的 是这个微控制器的初学者。 如何将正在执行的程序从闪存更改为RAM,反之亦然?


    这是我的.cmd文件。

    内存

    第0页:
    /* BEGIN用于“引导至SARAM”引导加载程序模式*/

    BEGIN:Origin = 0x0万,length = 0x0.0002万
    RAMM0:原点= 0x0.005万,长度= 0x0003B0
    RAML0_L3:原点= 0x0.8万,长度= 0x0.2万 /* RAML0-3组合为.text */的大小
    /* in example_F2806xSWPrioritezedInterrupts */
    重置:原始= 0x3FFFC0,长度= 0x0.0002万
    FPUTABLES:ORIGIN = 0x3FD860,LENGTH = 0x0006A0 /*引导ROM中的FPU表*/
    IQTABLES:ORIGIN = 0x3FDF00,LENGTH = 0x000B50 /*引导ROM中的IQ数学表*/
    IQTABLES2:原始= 0x3FEA50,长度= 0x0.0008万C /*引导ROM中的IQ数学表*/
    IQTABLES3:Origin = 0x3FEADC,length = 0x0000AA /* IQ Math Tables in Boot ROM */

    BootROM:Origin = 0x3FF3B0,length = 0x000C10


    第1页:

    BOOT_RSVD:Origin = 0x0.0002万,length = 0x0.0004万E /* M0的一部分,boot ROM将对stack */使用此选项
    RAMM1:原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */
    RAML4:原点= 0x00A000,长度= 0x0.2万 /*片上RAM块L4 */
    RAML5:原点= 0x00C000,长度= 0x0.2万 /*片上RAM块L5*/
    RAML6:原点= 0x00E000,长度= 0x0.2万 /*片上RAM块L6*/
    RAML7:原点= 0x1万,长度= 0x0.2万 /*片上RAM块L7 */
    RAML8:原点= 0x1.2万,长度= 0x0.2万 /*片上RAM块L8 */
    USB_RAM:原始= 0x4万,长度= 0x0.08万 /* USB RAM */
    }


    章节

    /*“引导至SARAM”模式的设置:
    codegstart部分(可在DSP28_CodeStartBranch.asm中找到)
    将执行重定向到用户代码的开头。 */
    codegstart:> begin,page =0
    ramfuncs:> RAMM0,页=0
    text:> RAML0_L3,页=0
    .cinit:> RAMM0,page =0
    .Pinit:> RAMM0,页=0
    .switch:> RAMM0,page =0
    .reset:> reset,page =0,type = DSECT /* not used,*/

    .stack:> RAMM1,页= 1
    .ebss:> RAML4,页= 1
    econst :> RAML4, page =1
    esysmem:> RAML4,页面= 1

    IQMath:> RAML0_L3,页=0
    IQmathTables:> IQTABLES,page =0,type = NoLoad

    /*分配FPU数学区域:*/
    FPUmathTables:> FPUTABLES,page =0,type = NoLoad

    DMARAML5:> RAML5,页面= 1
    DMARAML6:> RAML6,页面= 1
    DMARAML7:> RAML7,页面= 1
    DMARAML8:> RAML8,页面= 1

    /*如果调用IQNexp()或IQexp(),则取消注释以下部分
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */
    /*
    IQmathTables2:> IQTABLES2,page =0,type = NoLoad


    IQMath.lib<IQNexpTable.obj>(IQmathTablesRam)

    }
    */
    /*如果调用IQNasin()或IQasin(),请取消对以下部分的注释
    从IQMath.lib库中执行函数,以便利用
    引导ROM中的相关IQ Math表(这可节省空间和引导ROM
    为1等待状态)。 如果此部分未取消注释,请使用IQmathTables2.
    将加载到其他存储器(SARAM,闪存等)中并将占用
    打开空间,但0等待状态是可能的。
    */
    /*
    IQmathTables3:> IQTABLES3,page =0,type = NoLoad


    IQMath.lib<IQNasinTable.obj>(IQmathTablesRam)

    }
    */

    }

    /*
    //===========================================================================================================================================
    //文件结束。
    //===========================================================================================================================================
    */


    Ranjit

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

    兰吉特

    在我看来,您的RAM似乎已不足。  使用controlSUITE示例进行区分的简单方法是,"_RAM"位于.CMD文件的名称中,用于执行RAM外的操作。  另一种方法是将.CMD文件中的"原始"地址位置与数据表中的内存映射位置进行比较。

    从RAM切换到闪存的常用方法是:

    1. 使用项目文件视图中的右键单击上下文菜单从生成中排除RAM CMD文件
    2. 将所需的闪存CMD文件添加到项目中
    3. 清理和构建项目

    汤米

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

    Tommy,

    清理RAM空间的解决方案是什么?

    此致,

    Ranjit

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

    兰吉特

    您能否详细说明您的问题?  “清理”RAM空间是什么意思?

    如果由于程序无法装入内存而出现编译错误,可以尝试优化CMD文件和变量放置:  

    汤米