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.
问题一: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采样的交流电压是稳定的,确保输入信号自身不波动。
您是只用了内置参考源对吗 没有设计外部参考源对吗
我不理解您现在为什么会在VREFHI上测到3.0V电压
从这个图理解,如果仅使用了内置参考源,除非是芯片内部在选择使用内置参考源的时候 VREFHI可以作为内置参考源的输出进行测量或者观测
但是从这个图我看不出有这样的信号通道
再有 为什么会是3.0V的 即便是内置参考源 好像应该也是3.3V的