CPLD在TMS320F2812系统中的应用
- 格式:doc
- 大小:7.98 KB
- 文档页数:3
第10章无刷直流电动机例无刷直流电动机控制软件软件模块和相关参数采用TMS320F2812数字信号处理器实现无刷直流电动机控制的主程序。
/* ================================================================== 系统名称:无刷直流电动机控制(DSP281x)文件名称:BLDC3_1.C功能描述:采用霍尔传感器实现三相无刷直流电动机的控制================================================================== */// 主函数使用的头文件#include "target.h"#include "DSP281x_Device.h"#include "IQmathLib.h"#include "bldc3_1.h"#include "parameter.h"#include "build.h"#include <math.h>// 函数声明interrupt void MainISR(void);// 系统使用的全局变量float32 SpeedRef = 0.20; // 速度参考(pu)float32 T = 0.001/ISR_FREQUENCY; // 采样周期,见文件parameter.hUint32 VirtualTimer = 0;Uint16 ILoopFlag = FALSE;Uint16 SpeedLoopFlag = FALSE;int16 DFuncDesired = 0x1A00; // 期望的占空比(Q15)_iq CurrentSet = _IQ(0.0031);Uint16 IsrTicker = 0;Uint16 BackTicker = 0;int16 DlogCh1 = 0;int16 DlogCh2 = 0;int16 DlogCh3 = 0;int16 DlogCh4 = 0;volatile Uint16 EnableFlag = FALSE;// 采用PID控制器调节无刷直流电动机的电流和速度PIDREG3 pid1_idc = PIDREG3_DEFAULTS;PIDREG3 pid1_spd = PIDREG3_DEFAULTS;// 定义并初始化PWM驱动PWMGEN pwm1 = PWMGEN_DEFAULTS;// 定义并初始化ADC驱动ADCVALS adc1 = ADCVALS_DEFAULTS;// 定义并初始化霍尔传感器HALL3驱动HALL3 hall1 = HALL3_DEFAULTS;// 定义斜波控制器平滑斜坡信号RMPCNTL rc1 = RMPCNTL_DEFAULTS;// RAMP2模块初始化RMP2 rmp2 = RMP2_DEFAULTS;// MOD6CNT 模块初始化MOD6CNT mod1 = MOD6CNT_DEFAULTS;// SPEED_PR模块初始化SPEED_MEAS_CAP speed1 = SPEED_MEAS_CAP_DEFAULTS;// 创建并初始化DA TALOG模块DLOG_4CH dlog = DLOG_4CH_DEFAULTS;void main(void){// ******************************************// 初始化x281x处理器代码// ******************************************// 初始化系统控制寄存器,锁相环,看门狗,时钟等模块:// InitSysCtrl()函数在DSP281x_SysCtrl.c文件中定义InitSysCtrl();// HISPCP预定标寄存器设置,一般情况下设置为默认值EALLOW; // 解除寄存器保护SysCtrlRegs.HISPCP.all = 0x0000; // SYSCLKOUT/1EDIS; // 禁止对受保护寄存器进行写操作// 禁止并清除所有CPU中断:DINT;IER = 0x0000;IFR = 0x0000;// 初始化外设中断扩展单元控制寄存器为默认状态:// InitPieCtrl()函数在DSP281x_PieCtrl.c中定义InitPieCtrl();// 初始化PIE矢量表为已知状态InitPieVectTable();// 用户专用函数,重新分配中断向量,使能中断:// 使能EV A 定时器1/2:// 配置定时器1/2寄存器(EV A)EvaRegs.GPTCONA.all = 0;// 设置通用定时器2的周期EvaRegs.T2PR = SYSTEM_FREQUENCY*1000000*T;// 清除定时器2的计数器/比较寄存器EvaRegs.T2CNT = 0x0000;EvaRegs.T2CMPR = 0x0000;// 等待使能标志置位while (EnableFlag==FALSE){BackTicker++;}// 使能通用定时器2的周期中断EvaRegs.EV AIMRB.bit.T2PINT = 1;EvaRegs.EV AIFRB.bit.T2PINT = 1;// 配置定时器:递增计数,x1,内部时钟,禁止比较操作,使用自己的周期EvaRegs.T2CON.all = 0x9040;// 重新分配中断EALLOW; // 解除寄存器保护PieVectTable.T2PINT = &MainISR;EDIS; // 禁止对受保护寄存器进行写操作// 为T2PINT 使能PIE的组3的中断1PieCtrlRegs.PIEIER3.all = M_INT1;// 为T2PINT 使能CPU INT3IER |= M_INT3;// 初始化PWM模块pwm1.PeriodMax= (SYSTEM_FREQUENCY/PWM_FREQUENCY)*1000;//不对称PWM pwm1.DutyFunc = DFuncDesired; // DutyFunc = Q15 pwm1.init(&pwm1);// 初始化DA TALOG模块dlog.iptr1 = &DlogCh1;dlog.iptr2 = &DlogCh2;dlog.iptr3 = &DlogCh3;dlog.iptr4 = &DlogCh4;dlog.trig_value = 0x01;dlog.size = 0x400;dlog.prescalar = 1;dlog.init(&dlog);// 初始化ADC模块adc1.ChSelect = 0x6543;adc1.init(&adc1);// 初始化时能驱动模块drv1.init(&drv1);// 初始化SPEED_PR模块(150 MHz,N = 1 event period/rev)speed1.InputSelect = 0;speed1.BaseRpm = 120*(BASE_FREQ/P);speed1.SpeedScaler = (Uint32)(ISR_FREQUENCY/(1*BASE_FREQ*0.001));// 初始化RMPCNTL模块rc1.RampDelayMax = 20;rc1.RampLowLimit = _IQ(0);rc1.RampHighLimit = _IQ(1);// 初始化霍尔传感器模块hall1.DebounceAmount = 5;hall1.Revolutions = -10;hall1.init(&hall1);// 初始化RMP2模块rmp2.Out = (int32)DFuncDesired;rmp2.Ramp2Delay = 0x00000050;rmp2.Ramp2Max = 0x00007FFF;rmp2.Ramp2Min = 0x0000000F;// 初始化PID_REG3模块,直流母线电流调节pid1_idc.Kp = _IQ(1);pid1_idc.Ki = _IQ(T/0.003);pid1_idc.Kd = _IQ(0/T);pid1_idc.Kc = _IQ(0.2);pid1_idc.OutMax = _IQ(0.99);pid1_idc.OutMin = _IQ(0);// 初始化PID_REG3模块,速度调节pid1_spd.Kp = _IQ(1);pid1_spd.Ki = _IQ(T/0.1);pid1_spd.Kd = _IQ(0/T);pid1_spd.Kc = _IQ(0.2);pid1_spd.OutMax = _IQ(0.99);pid1_spd.OutMin = _IQ(0);// 使能全局中断和更高优先级的适时调试中断EINT; // 使能全局中断INTMERTM; // 使能全局适时调试中断DBGM// 循环for(;;) BackTicker++;}interrupt void MainISR(void){// 验证ISRIsrTicker++;// ***************** LEVEL1 *****************#if (BUILDLEVEL==LEVEL1)// ------------------------------------------------------------------------------ // 调用ADC04U_DRV读取函数// ------------------------------------------------------------------------------ adc1.read(&adc1);// ------------------------------------------------------------------------------ // 连接HALL模块并调用传感器检测函数// ------------------------------------------------------------------------------ hall1.HallMapPointer = (int16)mod1.Counter;hall1.read(&hall1);// ------------------------------------------------------------------------------ // 连接输入到MOD6模块,调用Modulo 6计数器计数函数// ------------------------------------------------------------------------------ mod1.TrigInput =(int32)hall1.CmtnTrigHall;mod1.Counter = (int32)hall1.HallMapPointer;mod1.calc(&mod1);// ------------------------------------------------------------------------------// 连接RMP2模块,调用Ramp控制计算函数// ------------------------------------------------------------------------------ rmp2.DesiredInput = (int32)DFuncDesired;rmp2.calc(&rmp2);// ------------------------------------------------------------------------------// 连接PWM_DRV模块,调用PWM信号产生函数// ------------------------------------------------------------------------------ pwm1.CmtnPointer = (int16)mod1.Counter;pwm1.DutyFunc = (int16)rmp2.Out;pwm1.update(&pwm1);// ------------------------------------------------------------------------------// 连接SPEED_PR模块,调用速度计算函数// ------------------------------------------------------------------------------ if ((mod1.Counter == 5)&(hall1.CmtnTrigHall == 0x7FFF)) { speed1.TimeStamp = VirtualTimer;speed1.calc(speed1);}// ------------------------------------------------------------------------------// 连接数据记录模块DA TALOG,以便系统调试时观察变量// ------------------------------------------------------------------------------ DlogCh1 = (int16)mod1.Counter;DlogCh2 = hall1.HallGpioAccepted;DlogCh3 = (int16)mod1.TrigInput;DlogCh4 = hall1.CmtnTrigHall;// ------------------------------------------------------------------------------// 连接输入到EN_DRV模块,调用时能/禁止PWM信号刷新函数// ------------------------------------------------------------------------------ drv1.EnableFlag = EnableFlag;drv1.update(&drv1);#endif // (BUILDLEVEL==LEVEL1)// ***************** LEVEL2 *****************#if (BUILDLEVEL==LEVEL2)// ------------------------------------------------------------------------------// 调用ADC04U_DRV 读取函数// ------------------------------------------------------------------------------adc1.read(&adc1);// ------------------------------------------------------------------------------// 连接HALL模块并调用传感器检测函数// ------------------------------------------------------------------------------hall1.HallMapPointer = (int16)mod1.Counter;hall1.read(&hall1);// ------------------------------------------------------------------------------// 连接MOD6模块,调用Modulo 6计数计算函数// ------------------------------------------------------------------------------mod1.TrigInput =(int32)hall1.CmtnTrigHall;mod1.Counter = (int32)hall1.HallMapPointer;mod1.calc(&mod1);// ------------------------------------------------------------------------------// 连接RMP2模块,调用斜坡控制计算函数// ------------------------------------------------------------------------------rmp2.DesiredInput = (int32)DFuncDesired;rmp2.calc(&rmp2);// ------------------------------------------------------------------------------// 连接PID_REG3模块,调用PID控制器计算函数// ------------------------------------------------------------------------------pid1_idc.Ref = CurrentSet;pid1_idc.Fdb = _IQ15toIQ(adc1.Ch4Out);pid1_idc.calc(&pid1_idc);// ------------------------------------------------------------------------------// 连接PWM_DRV模块,调用PWM信号产生函数// ------------------------------------------------------------------------------// 固定占空比和Idc duty-cycle控制展开空比切换if (ILoopFlag == FALSE)pwm1.DutyFunc = (int16)rmp2.Out; // 固定占空比elsepwm1.DutyFunc = (int16)_IQtoIQ15(pid1_idc.Out); // Idc duty-cycle控制占空比pwm1.CmtnPointer = (int16)mod1.Counter;pwm1.update(&pwm1);// ------------------------------------------------------------------------------// 连接SPEED_PR模块,调用速度调节函数// ------------------------------------------------------------------------------ if ((mod1.Counter == 5)&(hall1.CmtnTrigHall == 0x7FFF)) { speed1.TimeStamp = VirtualTimer;speed1.calc(speed1);}// ------------------------------------------------------------------------------// 连接数据记录模块DA TALOG// ------------------------------------------------------------------------------ DlogCh1 = (int16)mod1.Counter;DlogCh2 = (int16)mod1.TrigInput;DlogCh3 = (int16)_IQtoIQ15(pid1_idc.Ref);DlogCh4 = (int16)_IQtoIQ15(pid1_idc.Fdb);// ------------------------------------------------------------------------------// 连接输入到EN_DRV模块,调用时能/禁止PWM信号刷新函数// ------------------------------------------------------------------------------ drv1.EnableFlag = EnableFlag;drv1.update(&drv1);#endif // (BUILDLEVEL==LEVEL2)// ***************** LEVEL3 *****************#if (BUILDLEVEL==LEVEL3)// ------------------------------------------------------------------------------// 调用ADC04U_DRV 读取函数// ------------------------------------------------------------------------------ adc1.read(&adc1);// ------------------------------------------------------------------------------// 连接RMP模块,调用斜坡控制计算函数// ------------------------------------------------------------------------------ rc1.TargetValue = _IQ(SpeedRef);rc1.calc(&rc1);// ------------------------------------------------------------------------------// 连接HALL模块并调用传感器检测函数// ------------------------------------------------------------------------------ hall1.HallMapPointer = (int16)mod1.Counter;hall1.read(&hall1);// ------------------------------------------------------------------------------// 连接MOD6模块,调用Modulo 6计数计算函数// ------------------------------------------------------------------------------mod1.TrigInput =(int32)hall1.CmtnTrigHall;mod1.Counter = (int32)hall1.HallMapPointer;mod1.calc(&mod1);// ------------------------------------------------------------------------------// 连接RMP2模块,调用斜坡控制计算函数// ------------------------------------------------------------------------------rmp2.DesiredInput = (int32)DFuncDesired;rmp2.calc(&rmp2);// ------------------------------------------------------------------------------// 连接PID_REG3模块,调用PID控制器计算函数// ------------------------------------------------------------------------------pid1_spd.Ref = rc1.SetpointValue;pid1_spd.Fdb = speed1.Speed;pid1_spd.calc(&pid1_spd);// ------------------------------------------------------------------------------// 一旦电动机速度达到期望值,使闭环速度标志位置位// ------------------------------------------------------------------------------if (rc1.EqualFlag == 0x7FFFFFFF) {SpeedLoopFlag = TRUE;rc1.RampDelayMax = 300;}// ------------------------------------------------------------------------------// 连接PWM_DRV模块,调用PWM信号产生函数// ------------------------------------------------------------------------------// 固定占空比和由速度计算的占空比之间切换if (SpeedLoopFlag == FALSE)pwm1.DutyFunc = (int16)rmp2.Out; // 固定占空比elsepwm1.DutyFunc = (int16)_IQtoIQ15(pid1_spd.Out); // 速度控制占空比pwm1.CmtnPointer = (int16)mod1.Counter;pwm1.update(&pwm1);// ------------------------------------------------------------------------------// 连接SPEED_P模块,计算速度调用函数// ------------------------------------------------------------------------------if ((mod1.Counter == 5)&(hall1.CmtnTrigHall == 0x7FFF)) {speed1.TimeStamp = VirtualTimer;speed1.calc(speed1);}// ------------------------------------------------------------------------------// 连接到数据记录模块,DATALOG// ------------------------------------------------------------------------------DlogCh1 = (int16)mod1.Counter;DlogCh2 = (int16)mod1.TrigInput;DlogCh3 = (int16)_IQtoIQ15(pid1_spd.Ref);DlogCh4 = (int16)_IQtoIQ15(pid1_spd.Fdb);// ------------------------------------------------------------------------------// 连接EN_DRV模块,调用使能/禁止PWM 信号函数// ------------------------------------------------------------------------------drv1.EnableFlag = EnableFlag;drv1.update(&drv1);#endif // (BUILDLEVEL==LEVEL3)// ------------------------------------------------------------------------------// 虚拟定时器递增计数// ------------------------------------------------------------------------------VirtualTimer++;VirtualTimer &= 0x00007FFF;// ------------------------------------------------------------------------------// 调用数据记录函数DA TALOG// ------------------------------------------------------------------------------dlog.update(&dlog);// 根据定时器时能其他需要中断EvaRegs.EV AIMRB.bit.T2PINT = 1;// 为保证系统可靠安全工作,使用一个屏蔽写到EV AIFRB寄存器EvaRegs.EV AIFRB.all = BIT0;// 响应中断,以便处理器能够从PIE的中断组3上接收更多的中断PieCtrlRegs.PIEACK.all |= PIEACK_GROUP3;}11。
PE 电力电子2007年第5期 19基于DSP TMS320F2812 静止无功发生器控制系统的设计鲍晓娟 郝瑞祥 游小杰 叶 斌(北京交通大学电气工程学院,北京 100044)摘要 设计了一种以DSP TMS320F2812为核心的静止无功发生器的控制策略,给出了硬件电路和软件流程的具体实现方案。
理论分析和实验结果表明,该控制系统具有良好的工作性能,验证了所提出控制方案的有效性。
关键字:数字信号处理器;TMS320F2812;静止无功发生器;无功补偿Design of Control System for SVG Based on DSP TMS320F2812Bao Xiaojuan Hao Ruixiang You Xiaojie Ye Bin(School of Electrical Engineering, Beijing Jiaotong University, Beijing 100044)Abstract Designed the control system of SVG based on DSP TMS320F2812, and given the control strategies of hardware circuit and software work flow. Theoretical analysis and experimental results show that the control system has good performance, and demonstrate the effectiveness of the proposed control approach.Key words: DSP ;TMS320F2812;SVG ;reactive power compensation1 引言静止无功发生器(Static Var Generator ,简称SVG)具有连续调节、调节范围大、响应速度快、控制精度高、运行可靠等优点,是目前性能最好的动态无功补偿装置,代表了无功补偿装置的发展方向。
F2812中有大量的外设寄存器,在具体的应用中,要把这些寄存器根据实际需要进行配置。
这也是程序在初始化期间需要做的主要工作,在配置完成后,才可以进入正常的流程,即业务逻辑处理阶段。
以我的应用为例,F2812主要完成下列工作:2路A/D采样,2路PWM 输出,6路GPIO输出。
在此基础上,我将进行运算处理,实现主要功能。
传统的寄存器访问方式,通过Macro定义实现。
在TI提供的头文件中,提供了一种新的方式:bit field 和struct 方式,即位域加结构的方式。
在这种方式中,定义struct来表示与某个外设相关的一组寄存器,然后由Linker程序负责将寄存器映射到内存中。
如对于定时器寄存器,定义:struct CPUTIMER_REGS{Uint32 TIM; // Timer counter registerUint32 PRD; // Period registerUint16 TCR; // Timer control registerUint16 rsvd1; // reservedUint16 TPR; // Timer pre-scale lowUint16 TPRH; // Timer pre-scale high};这样,如果DSP内有多个定时器,则可以通过声明多个变量实现对三个定时器寄存器的访问,便于代码复用。
利用编译器的DA TA_SECTION #pragma,为每个变量分配一个数据段。
然后,通过在cmd 文件,Linker将每个数据段映射为内存中与该外设寄存器相对应的内存地址。
这时,还不能实现对寄存器,如TIM中的每一位的访问。
需要对每个寄存器,为其定义位域,使每一位都可以访问,如定义TCR的位域:struct TCR_BITS{ // bits descriptionUint16 rsvd1:4; // 3:0 reservedUint16 TSS:1; // 4 Timer Start/StopUint16 TRB:1; // 5 Timer reloadUint16 rsvd2:4; // 9:6 reservedUint16 SOFT:1; // 10 Emulation modesUint16 FREE:1; // 11Uint16 rsvd3:2; // 12:13 reservedUint16 TIE:1; // 14 Output enableUint16 TIF:1; // 15 Interrupt flag};然后,定义一个Union,允许该寄存器既可以按bit访问,也可以作为整体访问:union TCR_REG{Uint16 all;struct TCR_BITS bit;};在如此这样对每个寄存器都定义好后,重写struct CPUTIMER_REGS如下:struct CPUTIMER_REGS{union TIM_GROUP TIM; // Timer counter registerunion PRD_GROUP PRD; // Period registerunion TCR_REG TCR; // Timer control registerUint16 rsvd1; // reservedunion TPR_REG TPR; // Timer pre-scale lowunion TPRH_REG TPRH; // Timer pre-scale high};这时,每个寄存器都可以按bit或作为整体访问了。
题目:基于TMS320F2812的DSP最小系统设计要求:TMS320F2812的DSP最小系统设计包括两个模块,即硬件设计模块和软件检测模块。
硬件设计模块包括电源设计、复位电路设计、时钟电路设计、存储器设计、JTAC接口设计等。
软件检测模块需要编写测试程序。
用Protel软件绘制原理图和PCB图。
从理论上分析,设计的系统要满足基本的信号处理要求。
DSP主要应用在数字信号处理中,目的是为了能够满足实时信号处理的要求,因此需要将数字信号处理中的常用运算执行的尽可能快。
这就决定了DSP的特点和关键技术。
适合数字信号处理的技术:DSP包涵乘法器,累加器,特殊地址发生器,领开销循环等;提高处理速度的技术:流水线技术,并行处理技术,超常指令等。
DSP对元件值的容限不敏感,受温度、环境等外部参与影响小;容易实现集成;VLSI 可以时分复用,共享处理器;方便调整处理器的系数实现自适应滤波;可实现模拟处理不能实现的功能:线性相位、多抽样率处理、级联、易于存储等;可用于频率非常低的信号。
关键词: TMS320F2812,CCS3.3,Protel99SE软件目录第1章绪论第2章系统设计2.1系统方案介绍2.2 系统结构设计第3章硬件电路设计3.1 TMS320F2812芯片介绍3.2电源及复位电路设计3.3 时钟电路设计3.4 DSP与JTAG接口设计3.5 DSP的串行接口设计3.6 通用扩展口设计3.7 总体电路原理图设计第4章软件设计4.1 程序设计4.2 仿真调试总结参考文献附录1:总体电路图附录2:程序代码第1章绪论数字化已成为电子、通信和信息技术的发展趋势与潮流。
在这种趋势与潮流的推动下,数字信号处理的理论与实现手段获得了快速的发展,已成为当代发展最快的学科之一。
而DSP芯片作为数字信号处理,尤其是实时数字信号处理的主要方法和手段,自20世纪70年代末、80年代初诞生以来,无论在性能上还是在价格上,都取得了突破性的迅猛发展。
双通道自整角机数字转换器采样的时序控制于晓宁【摘要】详述了DSP芯片 TMS320F2812 与双通道自整角机数字转换器的时序特点,分析了接口时序的匹配问题,探讨了TMS320F2812扩展数字转换器的软、硬伟设计,并提供了示波器观测波形图.%The TMS320F2812 DSP chip and dual-channel synchro digital converter timing characteristics are detailed andthe matching of interface timing is analyzed. The expansion TMS320F2812 digital converter hardware and software design is discussed. The oscilloscope to observe waveforms are provided.【期刊名称】《科学技术与工程》【年(卷),期】2011(011)012【总页数】4页(P2828-2831)【关键词】TMS320F2812;自整角机数字转换器;时序匹配;片外扩展【作者】于晓宁【作者单位】第七一三研究所,郑州,450015【正文语种】中文【中图分类】TM932为了提高系统的实时性和可靠性,控制系统的主控芯片频率越来越高,比如美国德州仪器公司(TI公司)推出的TMS320F2812采用32 bit操作大大提高了处理能力,主频可以工作在150MHz(时钟周期可达6.67 ns),其先进的内部和外设结构使得该处理器主要用于大存储管理、高性能的控制场合[1]。
这种高频控制芯片通常能够实现与常用外围芯片的时序匹配,如RAM,D/A,NET等。
但是,当遇到读、写周期十分缓慢的双通道自整角机数字转换器,就需要设计相应的软、硬件使接口时序相匹配,否则转换器不能正常工作。
1 TMS320F2812的读写时序在TMS320F2812中,对外部设备的读写访问都是通过外部接口(XINTF)实现的,外部接口模块具有独立的访问地址,映射到5个独立的固定存储空间:XZone0、XZone1、XZone2、XZone6、XZone7[2]。
CCS集成开发环境的应用3.3.1 CCS(Code Composer Studio)集成开发环境简介TI公司为推广其DSPs芯片而开发了DSPs调试和软件工具:CCS(Code Composer Studio)集成开发环境。
它提供了环境配置、源文件编辑、程序调试、跟踪与分析等工具,帮助用户在软件环境下完成编辑、编译、链接、调试和数据分析等工作。
与TI公司早期提供的开发工具相比,利用CCS能够加快系统的开发过,提高工作效率。
CCS可以工作在两种模式:软件仿真(Simulator)模式和硬件仿真(Emulator)模式。
前者不需要在DSPs芯片运行,在计算机上就可以模拟DSPs指令集与工作机制,主要用于前期算法仿真与调试。
后者实时运行在DSPs芯片上,可以在线编制及调试应用程序。
CCS主要有以下特性和功能: 集成可视化代码编辑界面,可以直接编写C/C++、汇编、头文件及CMD文件等。
集成图形显示工具,可绘制时域、频域波形等。
集成调试工具,可以完成执行代码的装入、寄存器和存储器的查看、反汇编器、变量窗口的显示等功能,同时还支持C源代码级的调试。
集成代码生成工具,包括汇编器、C/C++编译器和链接器等。
支持多DSPs调试。
集成断点工具,包括设置硬件断点、数据空间读/写断点、条件断点等。
集成探针工具,可用于算法仿真、数据监视等。
提供代码分析工具,可用于计算某段代码的执行时间,从而能对代码的执行效率做出评估。
支持通过GEL来扩展CCS的功能,可以实现用户自定义的控制面板、菜单、自动修改变量或配置参数的功能。
支持RTDX技术,可在不暂停目标系统运行的情况下,实现DSPs与其他应用程序的数据交换。
提供开放的plug-ins技术,支持第三方的ActiveX插件,支持包括软件仿真在内的各种仿真器(需要安装相应的驱动程序)。
提供DSP/BIOS工具,增强了对代码的实时分析能力,如分析代码的执行效率、调度程序执行的优先级、方便对系统资源的管理或使用(代码/数据空间的分配、中断服务程序的调用、定时器的使用等),减小了开发人员对DSPs硬件知识的依赖程度,从而缩短了软件系统的开发进程。
TMS320F2812在电机控制系统的应用1 引言在电机控制领域,TI公司推出2000系列电机控制DSP。
TMS320F2812属于最新高端产品,适合工业控制、机床控制等高精度应用。
目前2000系列芯片在电气传动中的应用以TMS320LF240x为主,应用TMS320F(C)28x的比较少。
但28x比24x系列的DSP具有更完备的外围控制接口和更丰富的电机控制外设电路,更高的主频,指令执行时间仅为6.67ns,流水线采样最高速率60ns,12位A/D转换通道16个,PWM输出通道12个。
资源足够同时控制两台三相电机,使控制系统价格大大降低而体积缩小、可靠性提高,可在高度集成的环境中实现高性能电机控制。
电机控制系统基本结构见图1,本文阐述基于TMS320F2812的DSP电机控制系统设计中的重点。
图1 电机控制系统结构原理图2 引导加载ROM引导加载是指器件复位时执行一段引导程序,一般用于从端口(异步串口、I/O口或HPI 主机接口)将EPROM/FLASH等非易失性存储器中加载程序到高速RAM 中。
2.1 TMS320 812的启动模式TMS320F2812提供了几种不同的启动模式,四个通用I/O引脚用于确定选择何种启动模式,如表1所示。
2.2 SCI SPI启动加载器通过SPI同步传输和SCI异步传输实现FLASHROM引导加载。
硬件电路见图2,JP15为SPI或SCI引导加载器选择,1—2时选择SPI,2—3时选择SCI;JP4是SPI数据传输路径的选择,位于1—2时,连接至外部扩展接口J6或串行ROM,位于2—3时连接至J5仿真数据传输接口。
图2 SCI SPI启动加载器3 A/D转换模块TMS320F2812电机控制芯片内部集成了16路12位A/D转换模块,模拟量信号采样输入范围是0~ 3.3V,16路A/D通道分为两组,AD0~AD7为一组,AD8~AD15为一组。
每组都有一个专门输入端。
TMS320F2812中FLASH寄存器的配置问题解答问:我使用的是TI 2000系列芯片中的2812!我使用的是汇编语言对其进行开发,目前主程序已经完成,需要烧写到FLASH中运行,但烧写过后发现在FLASH中运行的速度和在RAM中用仿真器仿真的速度差不多!这样就太慢了,我设置的PLL倍频到150MHZ,后来发现是有关FLASH的一些配置寄存器没有进行配置,我想在FLASH中运行速度过慢的原因可能是这个造成的吧!我查看了TI的说明文档,其中关于FLASH寄存器的介绍中,有如下的一段:Note: Flash configuration registers should not be accessed while anaccess is in progress in flash or OTP memoryThe flash registers should not be accessed from code that is running fromOTP or flash memory or while an access may be in progress. All register accessesto the flash registers should be made from code executing outsideof flash/OTP memory and an access should not be attempted until all activityon the flash/OTP has completed. No hardware is included to protect for this.You can read the flash registers from code executing in flash/OTP; however,do not write to the registers.从上面的一段看出,如果需要配置FLASH的寄存器,必须执行FLASH以外存储空间的程序才可以实现,我又发现这些寄存器是受EALLOW和CSM保护的,所以我按照以下步骤试图重新配置寄存器:1,在执行存放于FLASH中的主程序段时,将一段存于FLASH中的初始化flash配置寄存器的程序完全复制到片内L0SARAM中,该初始化程序如下:MOVW DP,#DP_FLASH ;指向FLASH寄存器所在的页面EALLOWMOV AL,#01HMOV @FOPT,AL ;使能FLASH流水线模式MOV AL,#03HMOV @FPWR,ALMOV AL,#0FFHMOV @FSTDBYWAIT,ALMOV AL,#0FFHMOV @FACTIVEWAIT,ALMOV AL,#0203HMOV @FBANKWAIT,ALMOV AL,#06HMOV @FOTPWAIT,ALEDISLB FLASH_RET ;FLASH_RET 是我这段程序需要返回到的地址2,我配置了CSM模块的寄存器,使得器件不受CSM的保护3,用MOVL XAR7,#8300H ;200H是初始化程序复制到RAM中的地址LB *XAR7从FLASH跳转到RAM中执行该段初始化FLASH的程序4,从RAM中返回到FLASH中的主程序继续执行但发现这段程序烧写到片子里面后,不能按照我的意图执行,FLASH寄存器没有得到重新配置,请问这是什么原因呢?我上述的几个步骤对不对呢?请问,如果在程序烧写到片内FLASH中,在执行该程序时,想调到RAM中执行另一段程序,这种情况应该如何实现呢?应该有哪些需要注意的地方呢?如果那位有配置FLASH寄存器的例子的话,请发给我一份做一下参考吧!======================================================== 答:在flash中怎么能运行配置属于flash的寄存器呢?自己改变自己是不行的。
CPLD在TMS320F2812系统中的应用
关键字:CPLD TMS320F2812 1 引言
TMS320F2812是美国德州仪器公司推出的C2000 家族中最新一代产品。
先进的内部和外设结构使得该处理器主要用于大存储设备管理、高性能的控制场合。
在F2812构成的应用系统中,需要设计一些逻辑控制电路来保证系统正常有序地工作。
这里,我们采用CPLD 来设计外围电路的译码及逻辑控制,使DSP 系统达到小型化、集成化和高可靠性。
2 CPLD在TMS320F2812系统中的应用
2.1 TMS320F2812介绍
TMS320F2812 数字信号处理器是在F24X的基础上开发的高性能定点芯片。
能够运行24x 开发的代码程序,并且F2812 采用32bit 操作大大提高了处理能力。
它的主要特点如下:采用高性能的静态CMOS 技术,主频可以工作在150 MHZ(时钟周期可达6.67ns);
高性能的 32 位中央处理器,可以进行16 位X16 位以及32 位X32 位的乘且累加操作;
片内大容量存储器,128 K×16 bits 的Flash 和18 K×16 bits 的数据/程序存储器;
高速外设接口,最多可扩展1.5 M×16 bit 存储器;
3 个32-bit CPU 定时器,其中CPU 定时器1 和CPU 定时器2 被保留用作实时操作系统OS。
CPU 定时器0 可供用户使用,作为独立的,全局性的定时中断控制;
具有 12-bit 的 ADC 流水线变换时间最小60 ns,单变换200 ns;可选择两个时间管理器触发功能;
改进的 eCAN 2.0B 接口模块;
多种串行通信接口(2 个UART、1 个SPI 及1 个MCBSP);
高性能低功耗,采用1.8V 内核电压和3.3V外围接口电压;
2.2 硬件结构介绍
我们采用 Alter 公司的EPM7064S 芯片来完成内部逻辑管理及与总线接口工作。
该芯片采用快闪存储技术(FastFLASH),功耗较低。
宏单元数达到64 个,完全满足设计的逻辑要求。
引脚到引脚的延时为4ns,计数器频率可达151MHZ。
其输出电压为3.3V 或5V,可以通过设置VCCIO 引脚来选择不同的输出电压。
I/O 引脚可接受5V、3.3V 和2.5V 的混合电压输入,在多电源混合系统中,这一特性非常有用,可以节省大量的电平转换器。
TMS320F2812 应用系统需要外扩一些必要的电路,包括支持内部程序运行的RAM 和EEROM,以及D/A 转换电路等,其系统结构框图:
2.2.1 数模转换器的应用
在 TMS320F2812 中,片外扩展是通过TMS320F2812 中的外设接口XINTF 来实现的。
它类似于C240X 的外部接口,但也做了改进:
(1)在C240X中,程序存储空间、数据存储空间和I/O 空间映射在相同的地址(0000~FFFF),对它们的访问通过控制线( DS , PS , IS )来区分;而在F2812 中,外部存储器接口分成了5个固定的存储映像区域,可寻址1MB 的片外存储器空间,具有独立的地址,没有了控制线( DS , PS , IS )。
(2) 每个 F2812 的XINTF 区都有一个片选信号。
其中,有的区域的片选信号在内部是“与”在一起的,组成了一个共享的芯片选择,比如XZCS0 和XZCS1共享一个片选信号XZCS0AND1,XZCS6和XZCS7共享一个片选信号XZCS6AND7。
在这种方式下,同一个存储器可被连到两个区或者我们可以用外部译码逻辑来区分这两个区。
(3)5 个固定的存储映像区域的每一个区还可以分别指定等待状态数,选通信号的建立时间,激活时间和保持时间。
这些特征使得接口与外部存储器及外设脱离了联系,可以灵活独立地进行外部扩展。
在本次设计中,除了液晶除了液晶显示模块和键盘外,所有的外扩寄存器和存储器全部映射在XINTFZONE 2(0x080000~0x0FFFFF)译码的空间内。
我们使用了DAC7625 作为数模转换芯片,该芯片为4 通道12 位双缓冲的DAC 芯片,工作电压可以是+5V 或-5V~+5V 的模拟电压。
输出电压是0~3.3V 的直流电压。
功能框图:
其中,DAC7625 芯片中LDAC 引脚为载入DAC 引脚,当为低电平时,所有寄存器为透明,保持寄存器里的数据送到转换器输出通道;A1、A0 引脚为寄存器选择引脚,CPLD根据地址总线译码选通不同的A1、A0 组合,从而将1 ~ 4 通道的保持寄存器映射到0xC0000~0xC0003 的地址空间。
此外,我们还设计了传送寄存器(DACTLR),映射地址为0xC0004,这个寄存器的所有数据位都无效,既不可读也不可写。
对这个寄存器执行任何读或写操作都会产生一个内部信号,将LDAC 引脚置为低电平,启动转换器工作。
其中,整个译码逻辑都是由CPLD 芯片完成。
下面介绍译码逻辑的部分VHDL 语言描述:
2.2.2 串行非易失型存储器X25650芯片的应用
在这里,我们外扩了SPIOER 寄存器来控制DSP 与X25650 的SPI 接口,它的作用是连A18-A0XZCS2XWETMS320F2812XR/WD11-D0CSA0A1LDACDAC7625R/WDB11-DB0CPLD 译码逻辑daccsdaca0daca1DACTLR ldac图 2通或割断DSP 与X25625 的连接。
当需要F2812 的SPI 接口与SPI515(SPI 接口型)仿真器连接,实现仿真操作时,可以通过寄存器屏蔽SPI 对X25650 的操作。
SPIOER 控制寄存器的地址为0xC0002,使用了外部总线来对其进行读写,它的使用:SPIOE 位:当SPIOE 位为“1”时,DSP 与X25650 各引脚接通;当为“0”时各个引脚断开,此时,DSP 上的SPI 引脚为高阻态,可以连接其他设备。
上电复位时为“1”。
该寄存器由CPLD 内部编程构成。
在 F2812 中,SPI 模块支持125 种不同的波特率,通过向波特率寄存器(SPIBRR)写入设定值,可以与不同速率要求的外设通信。
其波特率设定如下:
当 SPIBRR="3-127" 时, SPI 波特率=LSPCLK/(SPIBRR+1)。
当SPIBRR=0,1,2 时, SPI波特率=LSPCLK/4在这里:LSPCLK=设备的低速外围时钟频率。
SPIBRR=主SPI 设备中SPIBRR 的内容。
这里,通过配置低速外设时钟预定标器寄存器(LOSPCP)和SPI 波特率寄存器(SPIBRR)中的内容,使DSP 的波特率达到5MHZ,满足X25650 的要求。
2.2.3 字符型液晶显示器的应用
本系统将字符型液晶显示器MDL(S)16263 作为DSP 的一个慢速显示设备,映射在XZCS6 区域。
该模块共有11 条信号线,RS 是寄存器选择,低电平选择指令寄存器,高电平选择数据寄存器。
R/W 是读写控制端,低电平写显示模块,高电平读显示模块。
E 为允许输入信号线(数据读写操作允许信号),高电平有效。
DB0~DB7 为数据线。
但是相比较 DSP 而言,LCD 是慢速设备,在设计器件时要考虑时序匹配问题,加入合适的等待状态。
该液晶模块读写周期Tcyc 最小为1000ns,脉冲宽度Pw 最小为450ns,读写操作数据保持时间最小为10ns,而F2812 的XINTF 外设接口的读写访问默认情况下为最大值,为26 个XTIMCLK 周期(XTIMCLK 默认为SYSCLK/2,13ns.),也就是说最大读写周期为346ns,其中读或写访问的建立阶段默认为6 个XTIMCLK 周期、激活阶段默认为14 个XTIMCLK 周期、跟踪阶段默认为6 个XTIMCLK 周期。
因此,读写周期需要加入等待状态。
当对DSP 的XREADY 引脚采样为低电平时,激活阶段将扩展一个XTIMCLK 周期,在下一个XTIMCLK 周期期间,XREADY 再次被采样。
这一个过程一直被采样,直至XREADY采样为高,正常地完成访问。
这里,我们利用CPLD 芯片将DSP 的XREADY 信号置为低电平,保持50 个
XTIMCLK 周期,从而产生合适的等待状态。
:
3 结论
本系统的开发采用了 DSP+CPLD 的结构,这种结构将DSP 较强的数据运算能力与CPLD 的高集成性、硬件可重复编程性结合在一起,使系统的设计过程更加的合理、紧凑和简化。
并且,该系统经过扩展后可以应用在工业控制的多种场合,具有一定的实际参考价值。