2812,版本ccs3.3,编译时没错,下载程序是出现错误:data verfication failed at address 0x3FFFC0。please verify target memory and memory map,望大神解答!谢谢!
下载程序是出现:data verfication failed at address 0x3FFFC0。please verify target memory and memory map
关于询问ADC中断寄存器的问题
INTSELxNy这个寄存器中的x和y分别指的是什么?
ti移相全桥PCMC发波疑问
如题,看了一下ti提供的例程,有两个疑问,请帮忙看下:
1.初始化中pwm2被pwm1在过零点同步,同时也会被峰值电流比较产生的同步信号同步,这两个同步不会打架吗,过零同步的目的是什么2.pwm2的周期是prd,但是从波形看,有时会发出比prd宽的脉冲,怎么实现的
LUANCHXL-F28027F + BOOSTXL-DRV8301 使用问题
目前状况是这样的,我已经在通过proj_lab05b可以识别电机的参数了。但是我将识别出来的参数改入user.h后,生成的out文件。在加载到gui中,无法enable system。也就不能继续运行。主要是Rs、Ls_d、Ls_q、rated_flux这四个参数。但是改回原始参数就可以enable system。
CCS编写了28335程序,编译出现没有安装'XDAIS' v1.0.0的错误,具体错误报告如下,请问怎么解决
**** Clean-only build of configuration Debug for project LED ****
"F:\\tiCCS\\ccsv6\\utils\\bin\\gmake" -k clean
DEL /F "CMD\28335_RAM_lnk.exe" "CMD\DSP2833x_Headers_nonBIOS.exe" "LED.out" "LED.hex"
DEL /F "SRC\DSP2833x_CpuTimers.d" "SRC\DSP2833x_DefaultIsr.d" "SRC\DSP2833x_GlobalVariableDefs.d" "SRC\DSP2833x_PieCtrl.d" "SRC\DSP2833x_PieVect.d" "SRC\DSP2833x_SysCtrl.d" "SRC\DSP2833x_Xintf.d" "SRC\LED.d"
DEL /F "DSP2833x_ADC_cal.obj" "DSP2833x_CodeStartBranch.obj" "DSP2833x_CpuTimers.obj" "DSP2833x_DefaultIsr.obj" "DSP2833x_GlobalVariableDefs.obj" "DSP2833x_PieCtrl.obj" "DSP2833x_PieVect.obj" "DSP2833x_SysCtrl.obj" "DSP2833x_Xintf.obj" "DSP2833x_usDelay.obj" "LED.obj"
DEL /F "SRC\DSP2833x_ADC_cal.d" "SRC\DSP2833x_CodeStartBranch.d" "SRC\DSP2833x_usDelay.d"
找不到 F:\tiCCS\workspace_v6_2\LED\Debug\CMD\28335_RAM_lnk.exe
找不到 F:\tiCCS\workspace_v6_2\LED\Debug\LED.out
找不到 F:\tiCCS\workspace_v6_2\LED\Debug\SRC\DSP2833x_CpuTimers.d
找不到 F:\tiCCS\workspace_v6_2\LED\Debug\DSP2833x_ADC_cal.obj
找不到 F:\tiCCS\workspace_v6_2\LED\Debug\SRC\DSP2833x_ADC_cal.d
'Finished clean'
' '
**** Build Finished ****
Buildfile generation error occurred..
Product 'XDAIS' v1.0.0 is not currently installed and no compatible version is available. Please install this product or a compatible version.
Build stopped..
我使用的是CCS6.2最新版本,用的是XDS100V3编译器。
28377s DMA传输完成中断标志位在哪?(查询的方式)
我使用28377s做电机控制,PWM触发AD同时触发DMA-SPI通信,AD完成后进入到AD中断中,我想查询下DMA-SPI是否完成了,请问是查哪个标志位?DMA-SPI实际上是有两路DMA,一路给SPI TX由PWM触发,一路是给SPI RX由SPI RX触发。我现在想在AD中断中判断SPI-RX是否完成了。
在lab05b中增加绝对编码器信息
现在需要利用TI的无传感器FOC控制算法,实现伺服控制功能。
对电机的电流、转速和位置进行精确控制,特别是低速性能。
TI的FAST无传感器控制策略显然是无法实现的。这里希望在Instaspin算法的基础上,增加绝对位置编码器信息。
FOC控制的电角度由绝对位置编码器提供。
现在我在28069上通过SPI已经可以读到准确的绝对位置数据,
但我不知道如何将编码器数据,转换为FOC的电角度信息,融合到lab05b的例程中。
实现对电机的平稳控制。
你们是否有过类似应用,该如何实现,是否有一些参考帖子。谢谢
希望得到TI工程师的回复,谢谢~
经电流重构后,PWM写入数据函数怎么理解?
//! \brief Writes PWM data to the PWM comparators for motor control //! \param[in] handle The hardware abstraction layer (HAL) handle //! \param[in] pPwmData The pointer to the PWM data static inline void HAL_writePwmData(HAL_Handle handle,HAL_PwmData_t *pPwmData) { uint_least8_t cnt; HAL_Obj *obj = (HAL_Obj *)handle; PWM_Obj *pwm; _iq period; _iq pwmData_neg; _iq pwmData_sat; _iq pwmData_sat_dc; _iq value; uint16_t value_sat; for(cnt=0;cnt<3;cnt++) { pwm = (PWM_Obj *)obj->pwmHandle[cnt]; period = (_iq)pwm->TBPRD; pwmData_neg = _IQmpy(pPwmData->Tabc.value[cnt],_IQ(-1.0)); pwmData_sat = _IQsat(pwmData_neg,_IQ(1.0),_IQ(-1.0)); pwmData_sat_dc = _IQmpy(pwmData_sat + _IQ(1.0), _IQ(0.5)); value = _IQmpy(pwmData_sat_dc, period); value_sat = (uint16_t)_IQsat(value, period, _IQ(0.0)); // write the PWM data PWM_write_CmpA(obj->pwmHandle[cnt],value_sat); } return; }
在这个函数中,for循环部分,特别是下面这段:
period = (_iq)pwm->TBPRD; pwmData_neg = _IQmpy(pPwmData->Tabc.value[cnt],_IQ(-1.0)); pwmData_sat = _IQsat(pwmData_neg,_IQ(1.0),_IQ(-1.0)); pwmData_sat_dc = _IQmpy(pwmData_sat + _IQ(1.0), _IQ(0.5)); value = _IQmpy(pwmData_sat_dc, period); value_sat = (uint16_t)_IQsat(value, period, _IQ(0.0));
这段怎么理解?求各位大神指教啊!!
求助!关于28377S的CLA使用问题!
我在对CLA进行调试的过程中,分别连接了CPU1以及CLA1,并对CPU1进行load Program,对CLA1进行load symbol,现在有两个问题
1. 我目前使用CLA只是简单的赋值,把a的值通过CLA传给c,a和c都已经定义在CpuToCla1MsgRAM和Cla1ToCpuMsgRAM中,调试时一步一步的走,也能看到程序能进到Task1里,但是就是不执行Task1里的赋值语句,不知道为什么,会不会是还有哪里定义错了???(另外我在load symbol的时候会跳进F2837xS_CodeStartBranch.asm里,停在LB wd_disable处,但是我跑controlsuit的例子不会这样,不知道是不是因为这里不对啊)
2. 还有一个问题,CLA在运算时主核可以干别的事情不耽误么?两者是并行关系么?
感谢诸位大神!!!真的新手一枚啊
IQmath_fpu32.lib compatibility cannot be determined
hi: TI 的工程师你好?
我这边硬件平台是 TMSF28069 加载 的 iqmath_fpu32.lib 打开 fpu32 --opt_level off --opt_for_speed 2 --fp_mode strict
使用中 有几点疑问,麻烦解答一下,谢谢
1:在编译时 MATH_TYPE = FLOAT_MATH 选择浮点时没有问题, 但是在选择 MATH_TYPE = IQ_MATH 定点时就会有如下这样的 warning ,不知是怎么引起的该怎么消除,
2:在出现上面警告时发现 计算上面的 函数的 结果是对的, 但是 计算的时间是有明显的差异的
以_IQsin为例 执行_IQsin 1万次 在MATH_TYPE = FLOAT_MATH 时需要 9.06-1.326 = 7.734ms 在MATH_TYPE = IQ_MATH 时需要 7.160-1.326 = 5.834ms
请问这时我的 IQmath_fpu32.lib 使用的是否有问题
3:在上面的情况下我发现 做 float*float 的时间 几乎 和 long*long的时间 所以 我想请问 在浮点计算时 TI 是否也提供了 对这样 的 _IQsin 等 复杂函数的运算库, 具体要怎么做? 在 motoware 里 的 2806xRevB_FastSpinROMSymbols_fpu32.lib 是干什么用的 添加进工程后, 在工程的.cmd 文件里要修改吗?
28335编译过程中报错怎么解决a value of type "void (*)(long)" cannot be used to initialize an entity of type "float"
之前在编写的时候运行还是正常的,加入了SVPWM模块后,就出现了不能使用类型(*)(long)”来初始化的问题,请问该怎么解决?
以下是附件,谢谢!
280049M中CLA中的.h可以包含CPU的一些函数吗?
各位大神:
280049M中cla文件中能包含CPU的一些头文件,那么这些CPU的头文件的函数声明和CLA是什么关系?
ccs工程配置成下载至flash问题
我想将工程配置成能烧写到板子flash 中,前面都好好的,也编译连接成功并生成了.out文件,但是我将对应的文件烧到板子中后,并不能达到和程序烧至ram里面一样的执行功能,这是为什么呢?望回复?
CCS生成的map文件配置问题
请问,CCS有无相关的配置选项,配置之后,可以在MAP文件中显示变量名称、地址及大小。
PMSM3_4开环跑测量转速问题
PMSM3_4开环跑的,我SpeedRef = 0.5,BaseRpm=3000,理论应该测得转速是1500,但是我测的转速是1500到3000一直跳动,有时会稳定在3000一小段时间。
这会是什么原因呢? 还有我想问下ImeasAOffset和CalibratedAngle怎么测量?
TMS320F28377D双核CPU2无法运行
参考controlsuite例程,编写两个IO灯指示程序,用官方2837xD_FLASH_lnk_cpu1.cmd 2837xD_FLASH_lnk_cpu2.cmd文件,CPU1里的点亮LED程序正常运行,CPU2的程序无法加载,点击DEBUG后会出现如下错误提示:C28xx_CPU2: Error setting the GSxMSEL register for Flash operations
CPU1里的程序:
Int main()
{
_watchdog_reg = WdRegs.WDCR.all;
DisableDog();
InitPeripheralClocks();
IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
// InitFlash();
led_init_gpio();
GPIO_SetupPinOptions(99, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(99, GPIO_MUX_CPU2, 0);
Clock_tickStart();
Clock_start(every2ms_clock_hndl);
BIOS_start(); /* does not return */
return(0);
}
CPU2里的程序:
Int main()
{
_watchdog_reg = WdRegs.WDCR.all;
DisableDog();
InitPeripheralClocks();
Clock_tickStart();
Clock_start(every2ms_clock_hndl);
BIOS_start(); /* does not return */
return(0);
}
void every2ms_clock_func()
{
if(_tasks_counter % 500 == 0)
{
_tasks_counter = 0;
if (ed_status()==0)
GPIO_WritePin(99, 1);
else
GPIO_WritePin(99, 0);
}
_tasks_counter++;
}
关于svgen
TI的例程中关于SVPWM,给出了如下算法:
#define SVGENDQ_MACRO(v) \
v.tmp1= v.Ubeta; \
v.tmp2= _IQdiv2(v.Ubeta) + (_IQmpy(_IQ(0.866),v.Ualpha)); \
v.tmp3= v.tmp2 - v.tmp1; \
\
v.VecSector=3; \
v.VecSector=(v.tmp2> 0)?( v.VecSector-1):v.VecSector; \
v.VecSector=(v.tmp3> 0)?( v.VecSector-1):v.VecSector; \
v.VecSector=(v.tmp1< 0)?(7-v.VecSector) :v.VecSector; \
\
if (v.VecSector==1 || v.VecSector==4) \
{ v.Ta= v.tmp2; \
v.Tb= v.tmp1-v.tmp3; \
v.Tc=-v.tmp2; \
} \
\
else if(v.VecSector==2 || v.VecSector==5) \
{ v.Ta= v.tmp3+v.tmp2; \
v.Tb= v.tmp1; \
v.Tc=-v.tmp1; \
} \
\
else \
{ v.Ta= v.tmp3; \
v.Tb=-v.tmp3; \
v.Tc=-(v.tmp1+v.tmp2); \
} \
尝试着推导了一下这段代码跟传统七段式SVPWM的关系,没有推出来,不知道过来人怎么理解这段代码的,感觉这里的扇区跟传统七段式的分法也不太一样。
求指教。
TI的instaspin foc的FAST算法需要的三相电压采样替代问题
请问下,TI的instaspin foc的FAST算法需要的三相电压采样,可以用母线电压乘以占空比的方法替代三相电压采样吗?急等!!!
sys/bios 28335 can通信
我在28335上面使用sys/bios,进行can初始化的时候,
do
{
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
} while(ECanbShadow.CANES.bit.CCE != 1 ); // Wait for CCE bit to be set
加断点调试,发现一直在这里循环等待。
后来发现can寄存器都无法写入,无论是否有保护的。
C2000上电引导模式解析------【TI FAE 经验分享】
在使用C2000的时候,经常遇到工程师说芯片仿真能够运行,但是单机跑却不能跑起来;或者在调试时,复位芯片 > run,发现程序不能跑起来。这其中的原因主要是没有了解C2000的引导模式设置。另外当我们想通过其他方式去引导芯片启动的时候,往往也需要清楚知道C2000的引导是怎么设置的。因此,在这里跟大家分享一下我对C2000引导模式的理解,希望对各位理解芯片从上电到跑到main这一段芯片运行情况有所帮助。
以C2000 Piccolo系列的引导模式为例,delfino稍微有点区别,concerto系列的引导则更复杂。但理解了Piccolo的引导原理对我们理解后面两个系列的芯片有非常大的帮助。
1.首先我们根据图1来看一下芯片上电后的代码执行流程,当芯片在接收到一个复位信号后,会到0x3FFFC0去复位向量,该复位向量跳到BootROM 0x3FF75C中去执行bootloader的程序,这里主要有initboot, 和SelectBootMode, 以及一些外设引导的函数。SeleteBootMode根据芯片的硬件或软件设置来判断芯片该去哪里寻找程序入口,直接目的是如何找到main,然后执行应用程序。
图1. 芯片的复位流程图
我们最常用到的主要有两种引导模式:
一种是boot to RAM,即跳到0x000000的RAM中,去开始执行指令,主要针对程序加载在RAM的仿真模式;另外一种是boot to Flash,则跳到0x3F7FF6中去开始执行代码。
相应的,程序会这两个入口地址0x000000, 0x3F7FF6放一条跳转指令,在codestart.asm源文件中,原因是在Flash的入口地址处只有两个单元的空间,后面是CSM模块,所以需要跳转;而在RAM中之所以也需要跳转,主要是因为在跳转到main之前,需要执行一小段代码_c_int00,该代码会使用0x000003之后的一段RAM,如果代码放在那里,在执行_c_int00之后会损坏代码。
另外就是一些外设引导模式,如SCI引导以及SPI引导等,像我们常使用的C2PROG软件就支持SCI引导,然后通过串口下载程序。
2. 那么芯片的SelectBootMode函数是如何来判断芯片的引导模式(boot mode)呢?
从图2中我们可以看到,首先会判断芯片是否连接仿真器,根据TRST引脚的状态来判断。
如果是仿真器连接,则进入仿真引导(Emulation Boot),这时候芯片的引导主要是靠2个RAM的单元来判断,即EMU_BMODE和EMU_KEY,地址是0xD01和0xD00,所以我们在连接仿真器后,可以首先修改这两个EMU_BMODE和EMU_KEY来设置引导模式;
如果没有连接仿真器,则进入单机跑模式(stand alone), 这时候芯片的引导主要靠GPIO34和GPIO37的状态,以及两个OTP存储单元的值来判断。不过我们经常没有使用OTP这两个单元,用GPIO的状态就已经够了。
图2. 两种状态下的引导模式
3. 仿真器连接时的引导模式配置
当带仿真器的时候,芯片会根据EMU_BMODE和EMU_KEY这两个单元的值来判断引导模式,比如我们带仿真器最常用的就是引导到RAM,即需要设置EMU_KEY = 0X55AA, EMU_BMODE = 0X000A。当我们在仿真的时候,程序load到Flash的时候,就需要设置EMU_KEY = 0X55AA, EMU_BMODE = 0X000B,如果EMU_BMODE = 0x0003的话,由于我们没有对OTP单元进行操作,即OTP的值为0xFFFF,所以这种情况下也是boot to flash。
在带仿真器跑程序的时候,我们发现即使我们不配置引导模式,程序也能够跑到main,这主要是因为CCS的功能,在程序load到芯片的时候,或是reset > restart,CCS会自动屏蔽bootloader的过程,自动跳到main函数入口。如果我们只选择reset CPU,则需要配置引导模式,即对0x0d01, 0x0d00这两个单元在memory window进行写相应的值,或是在script的菜单中选择引导模式,程序才能够跑到main中。