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: ADC时钟,AD采样,AdcOffsetSelfCal()函数和CMD文件等疑问

Part Number: TMS320F28035
Other Parts Discussed in Thread: C2000WARE

问题一:ADC Clock

官方规格书TMS320F2803x Piccolo Technical Reference Manual第510页给出不同ADC Clock采样时间的计算,目前对ADC Clock有疑问

当使用内部10MHZ晶振的时候,经过配置则 SYSCLKOUT为60MHZ,并且SysCtrlRegs.LOSPCP.all = 0x0002;//Low speed clock = SYSCLKOUT/4 (reset default)

Low speed clock =15MHZ,请问这个时候的ADC Clock是60M还是15M?

问题二:ACQPS

此外根据官方勘误手册里面提到,AD采样的时候第一个通道采集数据可能不准确,解决方法是一:ACQPS不设置为6或者7  二:AD时钟30MHZ一下的 For 30-MHz operation and below, this is fixed completely by writing a 1 to the ADCNONOVERLAP and CLKDIV2EN bits in the ADCTRL2 register. This will give a 30-MHz ADC clock when the CPU clock = 60 MHz, and will only allow the sampling of ADC channels when the ADC is finished with any pending conversion.

这条英文是不是针对ACQPS 设置为6或者7 的时候?其他ACQPS是不是就没上述错误

问题三:AdcOffsetSelfCal()

AD采取内部基准,并且CMD文件配置为f28035.cmd即程序文件是在flash存储,但程序会卡在AdcOffsetSelfCal()处,这个问题以前在使用TMS320F2807也遇到过,但没解决掉,故旧的问题重新提出来

AdcOffsetSelfCal()次函数使用到了ADCINT1和ADCINT2 如果不使用   PieVectTable.ADCINT1 = &adc1_isr;PieVectTable.ADCINT2 = &adc2_isr; 这样的语句是否对AD校准结果有影响?如果没这两条语句的话因为已经开了中断是否对中断有影响?

问题四:CMD文件配置为f28034.cmd,但随着代码增多提示flash分配失败,故加大flash,对F28035而言FLASH为64K但分了8个扇区,请问这个时候不同扇区组合是否有地址顺序要求,不同的地址顺序是否对程序有影响?

FLASHH : origin = 0x3E8000, length = 0x002000 /* on-chip FLASH */
FLASHG : origin = 0x3EA000, length = 0x002000 /* on-chip FLASH */
FLASHF : origin = 0x3EC000, length = 0x002000 /* on-chip FLASH */
FLASHE : origin = 0x3EE000, length = 0x002000 /* on-chip FLASH */
FLASHD : origin = 0x3F0000, length = 0x002000 /* on-chip FLASH */
FLASHC : origin = 0x3F2000, length = 0x002000 /* on-chip FLASH */
FLASHA : origin = 0x3F6000, length = 0x001F80 /* on-chip FLASH */

如上则 .text : >> FLASHC | FLASHA  | FLASHD  PAGE = 0 这种配置对不?

谢谢!  F28034.TXT

  • 1、ADC时钟是系统时钟直接分频的,所以是跟系统时钟相关,根据配置可以配置为1个SYSCLK或者SYSCLK/2。

    2、不是,这是两个不同的Advisory,一个是针对采样周期和S/H+转换时间冲突的。一个是正对ADC初始化的。

    3、

    PieVectTable.ADCINT1 = &adc1_isr;PieVectTable.ADCINT2 = &adc2_isr;

    这个是用来初始化PIE vector table的,需要用。关于你的程序会卡在AdcOffsetSelfCal(),卡住之后会有什么提示吗?程序里面有没有加入memcpy?

    另外,这里有一个关于AdcOffsetSelfCal的帖子,不知道会不会对你的问题有所帮助:e2echina.ti.com/.../638956

    4、不可以。扇区分配其实就是把一整块物理上的flash块人为的分成几个扇区,但本质还是连续的。所以你要合并使用的话也需要连续的几个块之间合并,不能跳过。

  • 1.ADC时钟如果为60MHZ的时候AD采集的第一个值的ACQPS为20时 SOC0值是否是正确的?

    2.  参考的是官方Example_2803xAdc_TempSensorConv这个例子,调用函数AdcOffsetSelfCal()并没有 下面语句

    PieVectTable.ADCINT1 = &adc1_isr;PieVectTable.ADCINT2 = &adc2_isr; 难道官方例子有误?

    3.

    扇区分配其实就是把一整块物理上的flash块人为的分成几个扇区,但本质还是连续的。所以你要合并使用的话也需要连续的几个块之间合并,不能跳过。

    既然是这样的为什么官方的F28034.cmd或者F28035.cmd 却把FLASHB放在PAGE1其他FLASH放在PAGE0

    我能否把FLASHB换到PAGE0,此外我的程序形成的.text比较大,请问怎么操作才对?

    PAGE 0: /* Program Memory */
    /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
    RAML0 : origin = 0x008000, length = 0x000800 /* on-chip RAM block L0 */
    RAML1 : origin = 0x008800, length = 0x000400 /* on-chip RAM block L1 */
    OTP : origin = 0x3D7800, length = 0x000400 /* on-chip OTP */
    FLASHH : origin = 0x3E8000, length = 0x002000 /* on-chip FLASH */
    FLASHG : origin = 0x3EA000, length = 0x002000 /* on-chip FLASH */
    FLASHF : origin = 0x3EC000, length = 0x002000 /* on-chip FLASH */
    FLASHE : origin = 0x3EE000, length = 0x002000 /* on-chip FLASH */
    FLASHD : origin = 0x3F0000, length = 0x002000 /* on-chip FLASH */
    FLASHC : origin = 0x3F2000, length = 0x002000 /* on-chip FLASH */
    FLASHA : origin = 0x3F6000, length = 0x001F80 /* on-chip FLASH */
    CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
    BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
    CSM_PWL_P0 : origin = 0x3F7FF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */

    IQTABLES : origin = 0x3FE000, length = 0x000B50 /* IQ Math Tables in Boot ROM */
    IQTABLES2 : origin = 0x3FEB50, length = 0x00008C /* IQ Math Tables in Boot ROM */
    IQTABLES3 : origin = 0x3FEBDC, length = 0x0000AA /* IQ Math Tables in Boot ROM */

    ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */
    RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */
    VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */

    PAGE 1 : /* Data Memory */
    /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
    /* Registers remain on PAGE1 */

    BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
    RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */
    RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
    DRAML0 : origin = 0x008800, length = 0x000800 /* on-chip RAM block L0 */
    FLASHB : origin = 0x3F6000, length = 0x001000 /* on-chip FLASH */

  • 1、ACQPS采样窗的大小跟采样值的正确与否应该没有必然关系,即使考虑问题2的情况,也只需要多做一次SOC就可以避免了。倒是这个采样窗的大小是否影响采样周期,这个要计算一下。就是采样频率高了,采样窗设置太大会不会造成来不及采样的问题。

    2、额,我看我的例程中有这个语句啊,代码127行。

    3、

    我能否把FLASHB换到PAGE0

    可以,说白了PAGE0、PAGE1只不过是人为定义的一个名词,一般默认PAGE0用来存放程序,PAGE1用来存放运行过程中的数据,你可以自己定义。但是这跟flash分区连续性不冲突,如果要把几个分区合并使用,还是要满足合并的是连续的几个分区才行。

    4、.text比较大,要么分区合用增加大小,,要么减小代码量,要么开启代码优化(这个效果未知,而且风险大)。没别的方案我就想不出来了

  • 1)连续的分区合并的话,分区按地址从小到大还是从大到小合并?如下:

           text : >> FLASHH | FLASHG | FLASHF  PAGE = 0

    或  text : >> FLASHF | FLASHG | FLASHH  PAGE = 0

    其中三者地址如下

    FLASHH : origin = 0x3E8000, length = 0x002000 /* on-chip FLASH */
    FLASHG : origin = 0x3EA000, length = 0x002000 /* on-chip FLASH */
    FLASHF : origin = 0x3EC000, length = 0x002000 /* on-chip FLASH */

    2) .cinit   .pinit  能否改为FLASHH?原CMD文件.cinit   .pinit 相关如下

    /* Allocate program areas: */
    .cinit : > FLASHA PAGE = 0
    .pinit : > FLASHA, PAGE = 0
    .text : >> FLASHC | FLASHA  PAGE = 0
    codestart : > BEGIN PAGE = 0

    ramfuncs : LOAD = FLASHD,

    3)IQmath是芯片自己的ROM存储的数据表,为什么要在CMD中做如下操作

    /* Allocate IQ math areas: */
    IQmath : > FLASHA PAGE = 0 /* Math Code */
    IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD

    谢谢!

  • 1、一般都是从地址的开始到结束的顺序,没试过其他顺序合并。

    2、可以的,做二次bootloader的时候boot工程和APP工程都是分配在不同flash sector的

    3、这个我觉得你可以看一下这个文档:ti/c2000/C2000Ware_4_01_00_00/libraries/math/IQmath/c28/docs/IQmath_Quickstart.pdf

  • 现在AD调用和不调用AdcOffsetSelfCal问题如下:

    1.调用AdcOffsetSelfCal函数时,发现VDD电源的一半采集值达到2130左右,全超过2100

    2.未调用AdcOffsetSelfCal函数时,发现VDD电源的一半采集值达到2070左右,不会超过2100

    按道理VDD电源的一半的AD理论值是2048 请问这是什么问题?谢谢!

  • AdcOffsetSelfCal这个函数还是应该调用的,修正AD采集的偏置值,不同的电路设计,可能这个偏置值会有差异

    你现在的ADC参考源 是用的内置的还是外置的

    不管内置外置,按照3.3V的REF计算2070-2048=22

    22/4096*3.3V=0.017724609375V

    也就是采集结果和理论值偏了17mV左右,你看这个偏差有没有可能是REF偏差造成的

  • 采样结果本身是要经过偏置校准和增益校准的,

    偏置校准可以调用函数AdcOffsetSelfCal(),所以AdcOffsetSelfCal还是应该调用的。一般offset校准后,采样结果值的精确度是足够用了。

    增益校准则需要增加多两路精准的输入,比如0V,1.65V。然后根据这两个输入重新修正增益系数。例如1.65V是对应结果值是2000,则增益系数为1.65/2000。后面采样的结果直接乘以这个系数,就是实际的电压值。

    另外还需要确认一点,就是你ADC采样的交流电压是稳定的,确保输入信号自身不波动。

  • ADC参考源 是采用的内置 但硬件上VREFHI电压值是3.0 这样是否有影响?

  • 您是只用了内置参考源对吗 没有设计外部参考源对吗

    我不理解您现在为什么会在VREFHI上测到3.0V电压

    从这个图理解,如果仅使用了内置参考源,除非是芯片内部在选择使用内置参考源的时候 VREFHI可以作为内置参考源的输出进行测量或者观测

    但是从这个图我看不出有这样的信号通道

    再有 为什么会是3.0V的 即便是内置参考源 好像应该也是3.3V的

  • 硬件的同事把VREFHI接在3.3 其他VDD还是3.3 现在改过来了 谢谢您的解答