TMS320F2812三种运行方式在SRM控制中的应用
扫描二维码
随时随地手机看文章
引言
开关磁阻电机(Switched Reluctance Motor,SRM)的控制对实时性的要求很高,它需要不断地判断其转子瞬时位置、相电流等信息,进而控制SRM换相,实现电机运转。而作为SRM的控制核心,不仅要实现上述SRM基本控制功能,而且要实现各种控制策略(包括电流斩波控制、电压PWM控制、角度位置控制),甚至是很复杂的SRM优化算法的应用。因此,SRM的控制需要一个性能优越的控制核心。
TI公司推出的TMS320F2812是一款性能非常优越的数字信号处理器(DSP),最高工作时钟频率可达150MHz。其外设功能十分强大,存储资源也很丰富:芯片内部集成了18K SARAM(M0、M1各1K,L0、L1各4K,H0为8K),Flash为128K;且预留了5个扩展空间,方便用户进行功能扩展。这就为TMS320F2812运行方式的多样化提供了条件,同时也是选其作为SRM控制核心的原因。
1 TMS320F2812三种运行方式的实现
TMS320F2812代码的开发环境为CCS,其工程一般由头文件、源文件、库文件以及连接命令文件(CMD)四种文件组成。头文件采用位域结构体进行定义,方便用户操作相关寄存器;源文件保存用户开发时编写的软件代码;库文件为系统文件,无法修改;CMD文件则是用来分配存储空间的,它告诉链接器将编译器生成的段链接到哪。所以,要想实现代码运行方式的多样化,必须很好地了解CMD文件。
CMD文件包括MEMORY和SECTIONS。其中,MEMORY的作用是指示存储空间的起始位置和长度,而SECTIONS的作用是将各种初始化段和非初始化段分配到相应的存储空间。二者都是由编译器自己编译、生成及归类的。初始化段包括所有的代码、常量及初始化表格等;非初始化段由变量、堆栈等组成。用户也可以通过“#pragma DATA_SECTION”和“#pragma CODE_SECTION”指令,将自己定义的数据段或代码段分配到对应的数据空间或程序空间,完成映射。
1.1 RAM调试运行
RAM调试运行指的是将用户编写的代码下载(load)到片内RAM,并在RAM上直接运行的一种运行方式。这种方式实际上就是通常所说的在线仿真。TMS320F2812通过仿真器与主机相连,主机能够在线调试程序,例如启动、停止、单步运行、设置断点等。
RAM调试运行方式实现简单,其程序流程为:code_start-> wd_disable-> c_int00-> main()。 code_start和wd_disable的程序包含于DSP281x_CodeStartBranch.asm中,具体程序如下:
[!--empirenews.page--]
段生成完毕,还需要在CMD文件中将其映射到RAMH0上,即所谓的H0启动模式。之后程序就会照流程直接在RAMH0上运行程序,实现RAM调试运行的方式。
1.2 Flash直接运行
Flash直接运行指的是将用户编写的代码烧写到Flash,并在Flash初始化完成后,用户代码运行于Flash上的一种运行方式。
与RAM调试运行相比,Flash直接运行的程序流程多了一个Memory_copy的环节,即code_start-> wd_disable-> c_int00-> main()-> Memory_copy。这是因为要想在Flash上直接运行程序,就需要配置好Flash控制寄存器(FACTIVEWAIT、FBANKWAIT等)。但这些寄存器是不能在Flash上直接配置的,所以只能将包含这些配置语句的Flash初始化函数InitFlash()搬运到RAM中运行。
InitFlash()的搬运是通过指令“#pragma CODE_SECTION(InitFlash,“ramfunes”)”和CMD文件配置实现的。前者将函数InitFlash()映射到段ramfuncs,后者在SECTIONS中作如下配置:
ramfuncs:LOAD=FLASH,PAGE=0
RUN=RAML0,PAGE=0
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
其中,RamfuncsLoadStart等为已定义好的3个外部全局变量。这样配置后,只需要在主程序main()中先调用MemCopy(&Ram-funcsLoad Start,&Ramfuncs LoadEnd,&Ram funcsRunStart)将已经烧写到Flash中的初始化函数InitFlash()代码全部复制到以Ram-funcsRun
Start开头的RAM中,再调用函数InitFlash()就实现了InitFlash()的搬运。
最后需要注意的一点就是,给codestart段分配的BEGIN段需要映射到以0x3F7FF6开头的一段Flash上,用于Flash启动模式,而不再是在RAM上。如此配置之后,其他用户代码就可以在Flash上正常运行了。[!--empirenews.page--]
1.3 Flash到RAM全搬运运行
Flash直接运行归根到底就是实现了一个函数从Flash到RAM的搬运,而Flash到RAM的全搬运运行就是将所有初始化段全部搬运到RAM的一种运行方式。因此,其程序流程也与Flash直接运行类似,即code_start-> wd_disable-> copy_sections-> c_int00-> main()。与Memory_ copy不一样的是,copy_sections搬运的是由编译器编译生成的初始化段(.text、.cinit、.pinit等),而不是某一个函数了。所以,不能把该段放到C语言环境建立之后,而应在屏蔽看门狗后,否则程序无法运行。而且,搬运代码也只能用汇编语言编写,具体程序在文件DSP28 xx_SectionCopy.asm中实现,以.text段的搬运为例:
代码把烧写地址和运行地址分别存储到XAR6和XAR7寄存器后,并将该段大小存入累加器ACC,通过判断累加器ACC是否为零来完成某个段的复制。copysections段直接分配到Flash地址空间。而被搬运的.text段在CMD文件中的配置则与Flash直接运行方式的ramfuncs段的配置类似,.text段烧写到Flash空间,复制到RAM后再运行。
另外,DSP281x_CodeStartBranch.asm中的.ref_c_int00应修改为.ref copy_sections,同时将wd_disable映射到wddisable段,并分配到Flash地址空间。
2 SRM控制应用研究
TM8320F2812的三种运行方式下载与运行存储介质的不同,使得三种运行方式的特点不尽相同,各有利弊,适合于不同情况下SRM控制的程序调试。
RAM调试运行代码下载到RAM,并采用H0启动模式,程序直接在RAM上运行,运行速度快,可以正常地运行于150MHz的系统时钟下。而且,主机通过仿真器与TMS320F2812相连,能够在线调试程序,例如启动、停止、单步运行、设置断点等等。在线调试功能对于刚开始的代码编写和修改是非常有用的,但RAM调试运行受限于RAM空间的大小,无法运行很大的程序;同时,必须使仿真器与主机相连,否则无法运行程序。RAM掉电代码消失的特点更是限制了RAM调试运行方式在实际中的应用。因此RAM调试运行适合于初期SRM控制的程序调试。此时,SRM控制的母线电压值不是很高,程序代码不是很大,同时可以很方便地观察一些变量的变化,方便记录分析。
当SRM控制的母线电压值提升上来(220 V以上)后,程序越来越大,设计也越趋于完善,不可能一直使用仿真器进行调试,将程序下载到Flash就成为了唯一的选择。Flash直接运行代码烧写到Flash中,采用Flash启动模式,程序最终在Flash上运行。128K的地址空间能够满足大程序的运行,而且烧写到Flash的代码掉电后不会消失,也不需要再连接仿真器,使得TMS320F2812能够很好完成实际应用。但Flash运行速度慢,对运行时间要求苛刻的程序如直接在Flash上运行,往往不能满足要求,使得SRM工作性能下降。
Flash到RAM全搬运运行综合了二者的优点,代码烧写到Flash中,在C语言环境建立之前先将所有初始化相关段搬运到RAM中再运行,既实现了代码的掉电不消失,又保证了代码的全速运行。唯一的缺点就是受限于RAM空间的大小,不能运行太大的程序,否则可能溢出。
为了简单验证3种运行方式的不同,本文利用了TMS320F2812的32位CPU定时器Cputimer0,因为该定时器工作于150 MHz,可以更好地看出各种运行方式的不同。Cputimer0产生40 kHz高速中断,在中断服务程序中翻转某GPIO口电平,观测其波形,频率应为20kHz。代码在RAM中运行正常,频率为20 kHz;而在Flash中运行要慢一点,为19.97kHz。而且程序越大,这种限制也就越明显。
3 结论
本文详细地介绍了TMS320F2812的3种运行方式的实现方法,对它们运行的特点进行了分析,并作了简单的实验验证。3种运行方式各有利弊,在实际SRM控制应用中,应该充分地理解它们各自的特点,选取最适合的方式更快、更好地完成实际应用。