TI公司官网源代码基于TMS320F2812的永磁同步电动机空间矢量控制的算法实现
- 格式:doc
- 大小:119.00 KB
- 文档页数:14
基于TMS320F28335的永磁同步电机矢量控制器设计严勤;李永聪【摘要】为了提高电动汽车用永磁同步电机控制性能,设计了一款以浮点型TMS320F28335数字信号处理器(DSP)为控制核心的数字化矢量控制器.与采用TMS320LF2407、TMS320F2812等传统定点型DSP为控制核心的永磁同步电机控制器相比,其具有编程简单、运算速度快、片内A/D精度高等优势.文章详细介绍了IGBT模块、温度模块以及各信号采集与调理电路等硬件部分的设计;软件部分,以C语言和汇编语言混合编程,基于TI公司提供的开发系统编写了电机控制程序.该控制器与传统的以定点型DSP芯片为控制核心的驱动控制器相比,提高了运算速度和控制精度,且易于编程,保护功能完善.【期刊名称】《贵州电力技术》【年(卷),期】2018(021)006【总页数】7页(P63-69)【关键词】永磁同步电机;矢量控制;控制器;TMS320F28335【作者】严勤;李永聪【作者单位】贵阳职业技术学院,贵州贵阳550081;贵州大学机械工程学院,贵州贵阳550025【正文语种】中文【中图分类】U271永磁同步电动机(PMSM)因其优良的性能在电动汽车牵引电机上被广泛应用[1-2],文章以电动汽车用内置式永磁同步电动机为对象,研究设计了电动汽车用永磁同步电动机的驱动控制器。
在分析PMSM矢量控制理论与方法的基础上,设计了驱动控制器硬件电路,以及控制逻辑和程序等软件部分。
该控制器以浮点型DSPTMS320F28335芯片为核心,与传统定点型DSP相比,能够执行更复杂的浮点运算,A/D转换精度更高和速度更快,且具有性能稳定、集成度好的优点。
1 总体方案设计此次设计的PMSM驱动控制器的硬件系统主要由两部分组成,即主控制板部分和驱动板部分。
在此系统中,主控制板是核心部分,它主要实现三相电流的信号采集,主电路电压信号采集,位置信号采集,温度信号采集,数据处理,控制系统的输出,通过CAN总线接口电路对外通信等功能。
LEARNING GARDEN 学习园地基于Matlab /Simulink 的TMS320F2812代码开发广东工业大学卢小锦曾岳南摘 要T M S320F2812DSP 是运动控制系统很好的硬件支撑平台,但传统的DSP 代码开发周期较长,效率不高。
M at lab 公司的Embedded T arget for T I C2000DSP 可解决上述问题,用户通过使用该模块,不仅可以进行电路的系统级仿真,还可编译生成相应的C 语言代码,进行算法的探索与设计思路的验证。
文章以三相异步电动机的VV VF 结合SVPWM 控制算法的开环控制系统为例,给出了M atlab/Simulink 平台上DSP 代码开发的设计流程。
关键词自动代码生成 T M S320F2812 M at lab/Simulink RT W 代码生成引 言随着现代电力电子技术的迅猛发展,兼有高运算速度和强控制能力的DSP 在逆变器、电机等电力电子设备的控制领域得到了广泛应用。
通用DSP 的源代码开发都可以采用两种方法:一种是直接利用其提供的汇编指令编写源代码,然后经汇编器和链接器进行汇编链接后生成目标可执行代码;另一种方法是利用标准C/C ++语言编写源代码,然后经C/C ++编译器、汇编器和链接器进行编译链接,最后生成目标可执行代码。
这两种代码开发方法都使得开发人员不得不花费大量的时间在代码的编写上面,增大产品开发难度,延长产品开发周期,从而影响开发效率[1]。
M at h Works 公司和T I 公司联合开发的工具包 M at lab L ink for CCS Development T ools,已经能把M at lab 和T I 公司的DSP 集成开发环境CCS(Code Composer St adiu)及目标DSP 连接起来。
利用此工具可以像操作M at lab 变量一样来操作T I DSP 的存储器或寄存器,即整个目标DSP 对于M at lab 像透明的一样,开发人员在M at lab 环境下,就可以完成对CCS 的操作。
基于DSP TMS320F2812和DS18B20的温度测量系统设计摘要:本文介绍了一种基于TI公司DSP TMS320F2812 的高精度温度测量系统的设计。
该系统采用TMS320F2812为微处理器,配合高精度DS18B20数字温度传感器和外部扩展的模数转换器采集温度数据,并经过滤波算法处理控制输出,能够得到比较精确的温度值。
主要介绍了系统的结构、工作原理、软硬件的设计,并对系统设计的特点进行了详细的说明。
关键词: TMS320F2812;DS18B20;温度测量;模数转换1 概述温度在航空、航天领域中是个重要的物理量,由于温度变化对设备可能产生影响,包括降低系统的成像质量,影响分辨率,因此,在这些系统中对温度的实时采集测量十分重要。
以传统的单片机为核心的温度测量控制系统,由于受到处理器自身硬件资源和速度的限制,硬件电路设计复杂,数据实时处理能力差,温度测量时间长。
而随着计算机技术尤其是招超大规模集成电路技术的发展,具有更强处理能力的DSP芯片,以其运算速度快、实时性强、功耗低、抗干扰能力强等特点,越来越多地被应用。
采用了DS18B20数字温度传感器、外部扩展ADC模数转换器,使用内部集成外设功能的DSP TMS320F2812 微处理器作为整个系统的核心控制单元,简化了硬件电路设计;在温度采集控制软件上采用“通道滤波”温度采集控制算法,使得温度采集具有速度快、精度高的特点。
2 系统方案设计温度测量系统设计以DSP TMS320F2812为中央处理器为核心,采用DS18B20型号数字温度传感器为温度传感器,使用AD7892型号的ADC模数转换器进行A/D 转换,并将采集结果代入温度曲线方程计算出当前温度值,并且将温度值通过通信系统发送到上位机。
高精度温度测量控制系统由两大部分组成,第1部分为以DSP TMS320F2812为核心处理器的数据采集及处理部分,主要由产品温度环境、温度传感器、ADC模数转换器、DSP TMS320F2812、电源构成;第2部分由温度采集处理软件构成,完成对DSP采集到的数据进行分析、处理等任务。
基于TMS320F2812全数字三相PWM整流器的设计唐勇奇 赵葵银(湖南工程学院,湘潭 411101)摘要:本文针对三相电压型PWM整流器,在建立了其数学模型的基础上,对整流器电流解耦控制策略进行研究,使用TMS320F2812数字处理芯片进行系统的硬件和软件设计,充分利用TMS320F2812丰富接口资源和快速的运算能力,使整流器硬件更简单;实验结果表明:整流器实现了单位功率因数控制,具有优越动态和静态性能。
关键词:三相PWM整流器;DSP; 电流解耦控制中图分类号:TP461 文献标识码:AThree-phase PWM Rectifier Based on TMS320F2812Tang-Yongqi Zhao-Kuiyin(Hunan institute of Engineering , Xiangtan 411101)Abstract:Aiming at the three phase PWM rectifier,this paper study on the control method of rectifier current decoupled control based on setting up rectifier mathematical mode , designs system hardware and software with TMS320F2812 chip, utilizes completely the wealthy peripherals and high— speed calculation function of DSP, simplifies design of rectifier's hardware . The experiment indicates the rectifier has realized control of the unit's power factor and has better dynamic and static characters.Keywords:Three-phase PWM Rectifier;DSP;Current Decoupled Controll 引言近年来,PWM整流器以其突出的优点(网侧电流正弦化,功率因数可调等)广泛应用于功率因数补偿、高性能整流器、电能回馈、有源滤波等电力电子变流领域,同时也成为电力电子学术界研究的热点。
基于DSP的永磁同步电机控制系统硬件设计胡宇;张兴华【摘要】以小功率永磁同步电机(PMSM)为研究对象,结合数字信号处理器TMS320F2812功能特点,给出了一套PMSM驱动控制系统硬件设计方案.详细阐述了功率驱动主电路、反馈信号检测电路以及供电电路的设计,介绍了主要元器件选型和参数计算方法.基于设计的硬件平台,对PMSM调速控制系统进行了测试.试验结果表明,所设计的控制系统硬件设计可靠、性能稳定、控制精度高.%Based on the controlled object of small power permanent magnet synchronous motor (PMSM),combined with the main features of digital signal processor TMS320F2812,an overall hardware design scheme had been put forward for the PMSM drive control system.Design of the power driven main circuit had illustrated,signal detection circuit and power supply circuit in detail,meanwhile introduced the main components selection and parameters calculation method.Based on the designed hardware platform,the control system of PMSM had been performed a functional test.Experimental results showed that the hareware design of control system had good reliability with stable performance and high control precision.【期刊名称】《电机与控制应用》【年(卷),期】2017(044)012【总页数】7页(P19-24,80)【关键词】永磁同步电机;功率驱动主电路;信号检测电路【作者】胡宇;张兴华【作者单位】南京工业大学电气工程与控制科学学院,江苏南京211816;南京工业大学电气工程与控制科学学院,江苏南京211816【正文语种】中文【中图分类】TM351永磁同步电机(Permanent Magnet Synchronous Motor,PMSM)因其体积小、损耗低、功率密度高和效率高等优点,在机械制造、工业控制、航空航天等领域得到广泛应用[1]。
基于TMS320F2812的SVPWM控制
贺洪江;王飞鹏
【期刊名称】《通信技术》
【年(卷),期】2008(041)007
【摘要】在交流电机变频调速中,脉宽调制技术已经得到了广泛的应用.而空间矢量脉宽调制方法与经典的脉宽调制方法相比,具有直流电压利用率高、控制简单、损耗较小、便于数字化方案实现等优点.文中介绍了利用TI公司的DSP电机控制芯片TMS320F2812实现SVPWM的方法.该控制方法速度快、精度高,在电压型逆变器中能产生更少的谐波并减少开关损耗.
【总页数】3页(P265-267)
【作者】贺洪江;王飞鹏
【作者单位】河北工程大学信息与电气工程学院,河北邯郸,056038;河北工程大学信息与电气工程学院,河北邯郸,056038
【正文语种】中文
【中图分类】TN787+.2
【相关文献】
1.基于TMS320F2812的永磁同步电机SVPWM调速 [J], 任彧;刘欢
2.基于TMS320F2812的SVPWM算法分析与实现 [J], 祝恩国;邹和平;赵兵;吕英杰
3.基于TMS320F2812的步进电机SVPWM细分驱动 [J], 王虹;杨甦
4.基于TMS320F2812光伏并网SVPWM逆变系统的设计 [J], 靳亚丽;郑恩让;张
晓娟
5.基于TMS320F2812的SVPWM控制 [J], 王飞鹏;邵占英
因版权原因,仅展示原文概要,查看原文内容请购买。
基于矢量变频技术的起重机电机控制系统设计摘要:本文介绍了一种起重机电机的变频控制技术,系统以三相异步电动机为控制对象,为获得良好稳定的调速性能,采用矢量变频控制技术,设计了一套以tms320f2812为核心芯片的起重机电机矢量变频调速控制系统。
最后经起重机样机初步试验表明,该控制系统具有较好的动静态性能。
关键字:起重机;异步电动机;矢量变频控制;dsp1. 引言起重机是现代工业生产不可或缺的机械设备,被广泛地应用于各行各业中。
起重机需要在短时间内频繁启制动,对调速系统提出了更高的要求,传统的转子串电阻调速、定子调压调速、串级调速存在调速范围小、启动电流对电网冲击大、功率因数低、故障率较高等问题。
随着微电子技术、电力电子技术的飞速发展,加之工业对生产效率和产品质量要求的不断提高,交流变频调速技术得到了越来越广泛的应用。
变频调速,通过改变电动机电源频率来改变电动机的速度,调速范围大,运动平滑性能好,可实现恒功率或恒转矩调速以适应不同负载的要求,且由于逆变器的反馈作用,对控制目的的精确度也更高[1]。
变频调速以其优异的启、制动性能,高效率和节能效果,在起重机上有着广阔的应用前景。
2. 三相异步电机的矢量控制原理三相异步电机是一个多变量、时变、非线性、强耦合的系统,要分析其微分方程组是十分复杂的。
采用标量控制的策略,其控制效果不是十分理想,为了从根本上解决上述问题,研究学者们提出了交流电机的矢量控制思想,矢量控制是为了改善转矩控制的性能,通过对定子电流的控制,进而实现对电磁转矩的控制。
其基本原理是:利用坐标变化原理把交流电机模拟成直流电机进行控制,在磁场定向坐标上,把电流矢量分解成励磁电流分量和转矩电流分量,并使两个分量互相垂直,彼此独立,然后分别进行调节控制[2],其关键是对电流矢量幅值和空间位置(频率和相位)的控制。
通过检测或估计电机转子磁通位置及幅值来控制定子电流和电压,电机的转矩便只和磁通、电流相关,这样便与直流电机的控制相似,可以获得高质量的控制性能。
摘要:交流电机矢量控制理论是德国学者K Hass和FBlaschke建立起来的,作为交流异步电机控制的一种方式,矢量控制技术已成为高性能变频调速系统的首选方案。
交流电机的矢量控制技术是基于交流电机的动态模型,通过建立交流电机的空间矢量图,采用磁场定向的方法将定子电流分解为与磁场方向一致的励磁分量和与磁场方向正交的转矩分量,并分别对磁通和力矩进行控制,而使异步电机可以像他励直流电机一样控制。
随着计算机技术飞速发展,功能强大的数字信号处理器(DSP)的广泛应用使得矢量控制逐渐走向了实用化。
本文先对矢量控制系统的原理进行简要说明,然后给出了一种矢量控制系统基于DSP芯片的实现方案,最后例举了一些目前应用较广泛的矢量型变频器。
关键词:矢量控制,DSP,变频器。
目录1.矢量控制 (3)1.1概述 (3)1.2基本原理 (4)1.3坐标变换 (6)2.转差频率矢量控制 (7)3.基于DSP芯片TMS320F2812的矢量控制系统 (11)4.西门子MicroMaster440变频器 (13)参考文献 (15)1.矢量控制1.1概述由于异步电机的动态数学模型是一个高阶、非线性、强耦合的多变量系统。
上世纪70年代西门子工程师F.Blaschke首先提出异步电机矢量控制理论来解决交流电机转矩控制问题。
矢量控制实现的基本原理是通过测量和控制异步电动机定子电流矢量,根据磁场定向原理分别对异步电动机的励磁电流和转矩电流进行控制,从而达到控制异步电动机转矩的目的。
具体是将异步电动机的定子电流矢量分解为产生磁场的电流分量 (励磁电流) 和产生转矩的电流分量 (转矩电流) 分别加以控制,并同时控制两分量间的幅值和相位,即控制定子电流矢量,所以称这种控制方式称为矢量控制方式。
简单的说,矢量控制就是将磁链与转矩解耦,有利于分别设计两者的调节器,以实现对交流电机的高性能调速。
矢量控制方式又有基于转差频率控制的矢量控制方式、无速度传感器矢量控制方式和有速度传感器的矢量控制方式等。
往链点点通共享资源,了解更多请登录第7章基于TMS320F2812的永磁同步电动机控制例1、空间矢量算法实现SVGEN_DQ对象结构体定义typedef struct {_iq Ualpha; // 输入:α轴参考电压_iq Ubeta; // 输入:β轴参考电压_iq Ta; // 输出:参考相位a开关函数_iq Tb; // 输出:参考相位b开关函数_iq Tc; // 输出:参考相位c开关函数void (*calc)(); // 函数指针} SVGENDQ;typedef SVGENDQ *SVGENDQ_handle;SVGEN_DQ模块调用方法:main(){}void interrupt periodic_interrupt_isr(){svgen_dq1.Ualpha = Ualpha1; // 提供输入参数:svgen_dq1svgen_dq1.Ubeta = Ubeta1; // 提供输入参数:svgen_dq1svgen_dq2.Ualpha = Ualpha2; // 提供输入参数:vgen_dq2svgen_dq2.Ubeta = Ubeta2; // 提供输入参数:svgen_dq2svgen_dq1.calc(&svgen_dq1); // 调用函数模块svgen_dq1svgen_dq2.calc(&svgen_dq2); // 调用函数模块svgen_dq2Ta1 = svgen_dq1.Ta; // 访问运算结果svgen_dq1Tb1 = svgen_dq1.Tb; // 访问运算结果svgen_dq1Tc1 = svgen_dq1.Tc; // 访问运算结果svgen_dq1Ta2 = svgen_dq2.Ta; // 访问运算结果svgen_dq2Tb2 = svgen_dq2.Tb; // 访问运算结果svgen_dq2Tc2 = svgen_dq2.Tc; // 访问运算结果svgen_dq2}为进一步了解空间矢量算法的基本原理,下面给出空间矢量模块的源代码:void svgendq_calc(SVGENDQ *v){_iq Va,Vb,Vc,t1,t2;_iq sector = 0; /*设相位置(sector)等于Q0 *//*逆clarke变换*/Va = v->Ubeta;Vb = _IQmpy(_IQ(-0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualfa); /* 0.8660254 = sqrt(3)/2 */ Vc = _IQmpy(_IQ(-0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualfa); /* 0.8660254 = sqrt(3)/2 *//* 60度sector的确定*/if (Va>_IQ(0))sector = 1;if (Vb>_IQ(0))sector = sector + 2;if (Vc>_IQ(0))sector = sector + 4;/* X,Y,Z (Va,Vb,Vc)的计算*/Va = v->Ubeta; /* X = Va */Vb = _IQmpy(_IQ(0.5),v->Ubeta) + _IQmpy(_IQ(0.8660254),v->Ualfa); /* Y = Vb */Vc = _IQmpy(_IQ(0.5),v->Ubeta) - _IQmpy(_IQ(0.8660254),v->Ualfa); /* Z = Vc */if (sector==1) /* sector 1: t1=Z and t2=Y (abc ---> Tb,Ta,Tc) */{t1 = Vc;t2 = Vb;v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); /* tbon = (1-t1-t2)/2 */v->Ta = v->Tb+t1; /* taon = tbon+t1 */v->Tc = v->Ta+t2; /* tcon = taon+t2 */}else if (sector==2) /* sector 2: t1=Y and t2=-X (abc ---> Ta,Tc,Tb) */{t1 = Vb;t2 = -Va;v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); /* taon = (1-t1-t2)/2 */v->Tc = v->Ta+t1; /* tcon = taon+t1 */v->Tb = v->Tc+t2; /* tbon = tcon+t2 */}else if (sector==3) /* sector 3: t1=-Z and t2=X (abc ---> Ta,Tb,Tc) */{t1 = -Vc;t2 = Va;v->Ta = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); /* taon = (1-t1-t2)/2 */v->Tb = v->Ta+t1; /* tbon = taon+t1 */v->Tc = v->Tb+t2; /* tcon = tbon+t2 */}else if (sector==4) /* sector 4: t1=-X and t2=Z (abc ---> Tc,Tb,Ta) */{t1 = -Va;t2 = Vc;v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); /* tcon = (1-t1-t2)/2 */v->Tb = v->Tc+t1; /* tbon = tcon+t1 */v->Ta = v->Tb+t2; /* taon = tbon+t2 */}else if (sector==5) /* sector 5: t1=X and t2=-Y (abc ---> Tb,Tc,Ta) */{t1 = Va;t2 = -Vb;v->Tb = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); /* tbon = (1-t1-t2)/2 */v->Tc = v->Tb+t1; /* tcon = tbon+t1 */v->Ta = v->Tc+t2; /* taon = tcon+t2 */}else if (sector==6) /* sector 6: t1=-Y and t2=-Z (abc ---> Tc,Ta,Tb) */{t1 = -Vb;t2 = -Vc;v->Tc = _IQmpy(_IQ(0.5),(_IQ(1)-t1-t2)); /* tcon = (1-t1-t2)/2 */v->Ta = v->Tc+t1; /* taon = tcon+t1 */v->Tb = v->Ta+t2; /* tbon = taon+t2 */}v->Ta = _IQmpy(_IQ(2),(v->Ta-_IQ(0.5)));v->Tb = _IQmpy(_IQ(2),(v->Tb-_IQ(0.5)));v->Tc = _IQmpy(_IQ(2),(v->Tc-_IQ(0.5)));}在相位置(sector)3中的一个矢量的例子:PWM1PWM3PWM5图相位置(sector)PWM 实例及其占空比例2、事件管理器配置EvaRegs.T1PR = p->n_period; /* SYSTEM_FREQUENCY*1000000*T/2 *//*初始化Timer 1周期寄存器*//* 预定标器X1 (T1),ISR周期= T x 1 */ EvaRegs.T1CON.all = PWM_INIT_STATE; /* 对称操作模式*/ EvaRegs.DBTCONA.all = DBTCON_INIT_STATE;EvaRegs.ACTRA.all = ACTR_INIT_STATE;CONA.all = 0xA200;EvaRegs.CMPR1 = p->n_period;EvaRegs.CMPR2 = p->n_period;EvaRegs.CMPR3 = p->n_period;EALLOW;GpioMuxRegs.GPAMUX.all |= 0x003F;例3、TMS320F2812电流及DC母线电压检测//******************************************************************************// TMS320F2812电流及DC母线电压检测// 文件名称:F28XILEG_VDC.C//****************************************************************************** #include "DSP28_Device.h"#include "f28xileg_vdc.h"#include "f28xbmsk.h"#define CPU_CLOCK_SPEED 6.6667L // CPU时钟速度150MHz#define ADC_usDELAY 5000L#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L)/ (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L) extern void DSP28x_usDelay(unsigned long Count);void F28X_ileg2_dcbus_drv_init(ILEG2DCBUSMEAS *p){DELAY_US(ADC_usDELAY);AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; /*复位ADC模块*/asm(" NOP ");asm(" NOP ");AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; /* 为bandgap和参考电路供电*/DELAY_US(ADC_usDELAY); /*为ADC其他单元上电前延时*/AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /*为ADC其他单元上电*/AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; /* 设置ADCTRL3寄存器*/DELAY_US(ADC_usDELAY);AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE; /*设置ADCTRL1寄存器*/AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE; /*设置ADCTRL2寄存器*/AdcRegs.ADCMAXCONV.bit.MAX_CONV = 2; /* 确定3个转换*/AdcRegs.ADCCHSELSEQ1.all = p->Ch_sel; /* 配置通道选择*/EvaRegs.GPTCONA.bit.T1TOADC = 1; /*设置采用Timer1 UF触发ADC转换*/ }void F28X_ileg2_dcbus_drv_read(ILEG2DCBUSMEAS *p){int dat_q15;long tmp;/* 等待ADC转换结束*/while (AdcRegs.ADCST.bit.SEQ1_BSY == 1){};dat_q15 = AdcRegs.ADCRESULT0^0x8000; /*将转换结果变成Q15格式双极性数据*/tmp = (long)(p->Imeas_a_gain*dat_q15);p->Imeas_a = (int)(tmp>>13);p->Imeas_a += p->Imeas_a_offset;p->Imeas_a *= -1; /*正向,电流流向电动机*/dat_q15 = AdcRegs.ADCRESULT1^0x8000; /*将转换结果变成Q15格式双极性数据*/tmp = (long)(p->Imeas_b_gain*dat_q15);p->Imeas_b = (int)(tmp>>13);p->Imeas_b += p->Imeas_b_offset;p->Imeas_b *= -1; /*正向,电流流向电动机*/dat_q15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF; /*将转换结果变成Q15格式双极性数据*/tmp = (long)(p->Vdc_meas_gain*dat_q15);p->Vdc_meas = (int)(tmp>>13);p->Vdc_meas += p->Vdc_meas_offset;p->Imeas_c = -(p->Imeas_a + p->Imeas_b);AdcRegs.ADCTRL2.all |= 0x4040; /* 复位排序器*/}例4、电动机位置检测/******************************************************************************// TMS320F2812电动机位置检测QEP电路初始化及应用// 文件名称:F28XQEP.C//****************************************************************************** #include "DSP28_Device.h"#include "f28xqep.h"#include "f28xbmsk.h"void F28X_EV1_QEP_Init(QEP *p){EvaRegs.CAPCON.all = QEP_CAP_INIT_STATE; /*设置捕捉单元*/EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE; /*设置捕捉定时器*/EvaRegs.T2PR = 0xFFFF;EvaRegs.EV AIFRC.bit.CAP3INT = 1; /*清除CAP3标志*/EvaRegs.EV AIMRC.bit.CAP3INT = 1; /*使能CAP3中断*/GpioMuxRegs.GPAMUX.all |= 0x0700; /*配置捕捉单元的引脚*/}void F28X_EV1_QEP_Calc(QEP *p){long tmp;p->dir_QEP = 0x4000&EvaRegs.GPTCONA.all;p->dir_QEP = p->dir_QEP>>14;p->theta_raw = EvaRegs.T2CNT + p->cal_angle;tmp = (long)(p->theta_raw*p->mech_scaler); /* Q0*Q26 = Q26 */tmp &= 0x03FFF000;p->theta_mech = (int)(tmp>>11); /* Q26 -> Q15 */p->theta_mech &= 0x7FFF;p->theta_elec = p->pole_pairs*p->theta_mech; /* Q0*Q15 = Q15 */p->theta_elec &= 0x7FFF;}void F28X_EV1_QEP_Isr(QEP *p){p->QEP_cnt_idx = EvaRegs.T2CNT;EvaRegs.T2CNT = 0;p->index_sync_flag = 0x00F0;//******************************************************************************// TMS320F2812电动机位置检测QEP电路初始化参数及函数定义// 文件名称:F28XQEP.H//******************************************************************************#ifndef __F28X_QEP_H__#define __F28X_QEP_H__#include "f28xbmsk.h"/* 初始化T2CON和CAPCON */#define QEP_CAP_INIT_STATE 0x9004#define QEP_TIMER_INIT_STATE (FREE_RUN_FLAG + \TIMER_DIR_UPDN + \TIMER_CLK_PRESCALE_X_1 + \TIMER_ENABLE_BY_OWN + \TIMER_ENABLE + \TIMER_CLOCK_SRC_QEP + \TIMER_COMPARE_LD_ON_ZERO)/* 定义QEP (正交编码电路) 驱动的对象*/typedef struct {int theta_elec; /* 输出: 电动机电角度(Q15) */ int theta_mech; /* 输出: 电动机机械角度(Q15) */int dir_QEP; /* 输出: 电动机转动方向(Q0) */int QEP_cnt_idx; /* 变量: 编码器计数(Q0) */int theta_raw; /* 变量: 定时器2得出的角度(Q0) */int mech_scaler; /* 参数: 0.9999/计数最大值,计数最大值= 4000 (Q26) */int pole_pairs; /* 参数: 极对数(Q0) */int cal_angle; /* 参数: 编码器和相之间的角度偏移量(Q0) */int index_sync_flag; /* 输出: Index sync status (Q0) */void (*init)(); /* 初始化函数指针*/void (*calc)(); /* 计算函数指针*/void (*isr)(); /* 中断程序指针*/} QEP;/* 定义一个QEP_handle */typedef QEP *QEP_handle;#define QEP_DEFAULTS { 0x0, 0x0,0x0,0x0,0x0,16776,2,-2365,0x0, \(void (*)(long))F28X_EV1_QEP_Init, \(void (*)(long))F28X_EV1_QEP_Calc, \(void (*)(long))F28X_EV1_QEP_Isr }void F28X_EV1_QEP_Init(QEP_handle);void F28X_EV1_QEP_Calc(QEP_handle);void F28X_EV1_QEP_Isr(QEP_handle);#endif /* __F28X_QEP_H__ */例5、TMS320F2812实现三相永磁同步电动机的磁场定向控制//****************************************************************************** // 采用TMS320F2812实现三相永磁同步电动机的磁场定向控制// 文件名称:PMSM3_1.C//******************************************************************************#include "IQmathLib.h" /* 包含IQmath库函数的头文件*/#include "DSP28_Device.h"#include "pmsm3_1.h"#include "parameter.h"#include "build.h"// 函数声明interrupt void EvaTimer1(void);interrupt void EvaTimer2(void);// 全局变量定义float Vd_testing = 0; /* Vd testing (pu) */float Vq_testing = 0.25; /* Vq testing (pu) */float Id_ref = 0; /* Id reference (pu) */float Iq_ref = 0.4; /* Iq reference (pu) */float speed_ref = 0.2; /* Speed reference (pu) */float T = 0.001/ISR_FREQUENCY; /* Samping period (sec), see parameter.h */int isr_ticker = 0;int pwmdac_ch1=0;int pwmdac_ch2=0;int pwmdac_ch3=0;volatile int enable_flg=0;int lockrtr_flg=1;int speed_loop_ps = 10; // 速度环定标器int speed_loop_count = 1; // 速度环计数器CLARKE clarke1 = CLARKE_DEFAULTS;PARK park1 = PARK_DEFAULTS;IPARK ipark1 = IPARK_DEFAULTS;PIDREG3 pid1_id = PIDREG3_DEFAULTS;PIDREG3 pid1_iq = PIDREG3_DEFAULTS;PIDREG3 pid1_spd = PIDREG3_DEFAULTS;PWMGEN pwm1 = PWMGEN_DEFAULTS;PWMDAC pwmdac1 = PWMDAC_DEFAULTS;SVGENDQ svgen_dq1 = SVGENDQ_DEFAULTS;QEP qep1 = QEP_DEFAULTS;SPEED_MEAS_QEP speed1 = SPEED_MEAS_QEP_DEFAULTS; DRIVE drv1 = DRIVE_DEFAULTS;RMPCNTL rc1 = RMPCNTL_DEFAULTS;RAMPGEN rg1 = RAMPGEN_DEFAULTS;ILEG2DCBUSMEAS ilg2_vdc1 = ILEG2DCBUSMEAS_DEFAULTS;// 主函数void main(void){// 系统初始化InitSysCtrl();// HISPCP 设置EALLOW;SysCtrlRegs.HISPCP.all = 0x0000; /* SYSCLKOUT/1 */ EDIS;// 禁止并清除所有CPU中断:DINT;IER = 0x0000;IFR = 0x0000;// 初始化Pie到默认状态InitPieCtrl();// 初始化PIE相量表InitPieVectTable();// 初始化EV A 定时器1://设置定时器1寄存器(EV A)EvaRegs.GPTCONA.all = 0;//等待使能标志位while (enable_flg==0){// 使能定时器1的下溢中断EvaRegs.EV AIMRA.bit.T1UFINT = 1;EvaRegs.EV AIFRA.bit.T1UFINT = 1;// 使能CAP3中断(定时器2)EvaRegs.EV AIMRC.bit.CAP3INT = 1;EvaRegs.EV AIMRC.bit.CAP3INT = 1;};// 重新分配中断向量EALLOW;PieVectTable.T1UFINT = &EvaTimer1;PieVectTable.CAPINT3 = &EvaTimer2;EDIS;// 使能PIE组2的中断6(T1UFINT)PieCtrlRegs.PIEIER2.all = M_INT6;// 使能PIE组3的中断7(CAPINT3)PieCtrlRegs.PIEIER3.all = M_INT7;// 使能CPU INT2(T1UFINT)和INT3(CAPINT3):IER |= (M_INT2 | M_INT3);// 使能全局中断和最高优先级适时调试事件管理器功能:EINT; //使能全局中断INTMERTM; // 使能适时调试中断DBGM/* 模块初始化*/pwm1.n_period = SYSTEM_FREQUENCY*1000000*T/2; /* 预定标器X1 (T1), ISR周期= T x 1 */ pwm1.init(&pwm1);pwmdac1.pwmdac_period = 2500; /* PWM频率= 30 kHz */pwmdac1.PWM_DAC_IPTR0 = &pwmdac_ch1;pwmdac1.PWM_DAC_IPTR1 = &pwmdac_ch2;pwmdac1.PWM_DAC_IPTR2 = &pwmdac_ch3;pwmdac1.init(&pwmdac1);qep1.init(&qep1);drv1.init(&drv1);ilg2_vdc1.init(&ilg2_vdc1);/* 初始化SPEED_FRQ模块*/speed1.K1 = _IQ21(1/(BASE_FREQ*T));speed1.K2 = _IQ(1/(1+T*2*PI*30)); /* 低通截至频率= 30 Hz */ speed1.K3 = _IQ(1)-speed1.K2;speed1.rpm_max = 120*BASE_FREQ/P;/*初始化RAMPGEN模块*/rg1.step_angle_max = _IQ(BASE_FREQ*T);/* 初始化PID_REG3 Id调节模块*/pid1_id.Kp_reg3 = _IQ(0.75);pid1_id.Ki_reg3 = _IQ(T/0.0005);pid1_id.Kd_reg3 = _IQ(0/T);pid1_id.Kc_reg3 = _IQ(0.2);pid1_id.pid_out_max = _IQ(0.30);pid1_id.pid_out_min = _IQ(-0.30);/* 初始化PID_REG3 Iq调节模块*/pid1_iq.Kp_reg3 = _IQ(0.75);pid1_iq.Ki_reg3 = _IQ(T/0.0005);pid1_iq.Kd_reg3 = _IQ(0/T);pid1_iq.Kc_reg3 = _IQ(0.2);pid1_iq.pid_out_max = _IQ(0.95);pid1_iq.pid_out_min = _IQ(-0.95);/*初始化PID_REG3 速度调节模块*/pid1_spd.Kp_reg3 = _IQ(1);pid1_spd.Ki_reg3 = _IQ(T*speed_loop_ps/0.1);pid1_spd.Kd_reg3 = _IQ(0/(T*speed_loop_ps));pid1_spd.Kc_reg3 = _IQ(0.2);pid1_spd.pid_out_max = _IQ(1);pid1_spd.pid_out_min = _IQ(-1);// 循环等待for(;;);}interrupt void EvaTimer1(void){isr_ticker++;if (speed_loop_count==speed_loop_ps){pid1_spd.pid_ref_reg3 = _IQ(speed_ref);pid1_spd.pid_fdb_reg3 = speed1.speed_frq;pid1_spd.calc(&pid1_spd);speed_loop_count=1;}else speed_loop_count++;pid1_iq.pid_ref_reg3 = pid1_spd.pid_out_reg3;pid1_iq.pid_fdb_reg3 = park1.qe;pid1_iq.calc(&pid1_iq);pid1_id.pid_ref_reg3 = _IQ(Id_ref);pid1_id.pid_fdb_reg3 = park1.de;pid1_id.calc(&pid1_id);ipark1.de = pid1_id.pid_out_reg3;ipark1.qe = pid1_iq.pid_out_reg3;ipark1.ang = speed1.theta_elec;ipark1.calc(&ipark1);svgen_dq1.Ualfa = ipark1.ds;svgen_dq1.Ubeta = ipark1.qs;svgen_dq1.calc(&svgen_dq1);pwm1.Mfunc_c1 = (int)_IQtoIQ15(svgen_dq1.Ta); /* Mfunc_c1 is in Q15 */ pwm1.Mfunc_c2 = (int)_IQtoIQ15(svgen_dq1.Tb); /* Mfunc_c2 is in Q15 */ pwm1.Mfunc_c3 = (int)_IQtoIQ15(svgen_dq1.Tc); /* Mfunc_c3 is in Q15 */ pwm1.update(&pwm1);ilg2_vdc1.read(&ilg2_vdc1);clarke1.as = _IQ15toIQ((long)ilg2_vdc1.Imeas_a);clarke1.bs = _IQ15toIQ((long)ilg2_vdc1.Imeas_b);clarke1.calc(&clarke1);park1.ds = clarke1.ds;park1.qs = clarke1.qs;park1.ang = speed1.theta_elec;park1.calc(&park1);qep1.calc(&qep1);speed1.theta_elec = _IQ15toIQ((long)qep1.theta_elec);speed1.dir_QEP = (long)(qep1.dir_QEP);speed1.calc(&speed1);pwmdac_ch1 = (int)_IQtoIQ15(svgen_dq1.Ta);pwmdac_ch2 = (int)_IQtoIQ15(clarke1.as);pwmdac_ch3 = (int)_IQtoIQ15(speed1.theta_elec);drv1.enable_flg = enable_flg;drv1.update(&drv1);pwmdac1.update(&pwmdac1);// 使能定时器中断EvaRegs.EV AIMRA.bit.T1UFINT = 1;EvaRegs.EV AIFRA.all = BIT9;PieCtrlRegs.PIEACK.all |= PIEACK_GROUP2;}interrupt void EvaTimer2(void){qep1.isr(&qep1);EvaRegs.EV AIMRC.bit.CAP3INT = 1;EvaRegs.EV AIFRC.all = BIT2;PieCtrlRegs.PIEACK.all |= PIEACK_GROUP3;}。