Thread 中讨论的其他器件:controlSUITE
工具/软件:Code Composer Studio
使用 F28335 hvpm_sensorless
F28335_ram cmd switch F28335 flash cmd
打开 ram ,然后按 debug 。 触发 GPIO 84、然后 enflaged=1 ld3 red_light 闪烁
当闪存 调试 时、按下 RESUME TRIGGLE GPIO 84 、然后 ENFLENGE=1 ld3 RED_LIGHT 、恰好当触发了 gpio84、然后是 RED_LIGHT
恒光
必须将调试更改为已发布
如何将调试更改为已发布
当我关闭电源 重启时、 编程不会消失 、并且会触发
/*============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
系统名称:HVPM_Sensorless
文件名:HVPM_Sensorless.C
说明:用于无传感器实际实现的主系统文件
用于三相永磁体的磁场定向控制
同步电机(PMSM)
支持 F2833x (浮点)和 F2803x (定点)器件
==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
//包含 main 函数中使用的头文件
#include "PeripheralHeaderIninclude.h"
#include "HVPM_Sensorless-Settings.h"
#include "IQmathLib.h"
#include "HVPM_Sensorless.h"
#include
ifdef 闪存
#pragma CODE_SECTION (MainISR、"ramfuncs");
#pragma CODE_SECTION (OffsetISR、"ramfuncs");
#endif
//此文件中找到的函数的原型语句。
中断空 MainISR (空);
中断空偏移 ISR (空);
void DeviceInit();
void Memcopy();
空 InitFlash();
void HVDMC_Protection (void);
//状态机函数原型
///----------------------------
// Alpha 状态
void A0 (void);//state A0
void B0 (void);//state B0
void C0 (void);//state C0
//分支状态
void A1 (void);//state A1
void A2 (void);//state A2
void A3 (void);//state A3
// B 分支状态
void b1 (void);//state b1
void B2 (void);//state B2
void B3 (void);//状态 B3
// C 分支状态
void C1 (void);//state C1
void C2 (void);//state C2
void C3 (void);//state C3
//变量声明
void (* alpha_State_ptr)(void);//基态指针
void (* a_Task_ptr)(void);//状态指针 a 分支
void (* B_Task_ptr)(void);//状态指针 B 分支
void (* C_Task_ptr)(void);//状态指针 C 分支
//用于在闪存中运行后台,在 RAM 中运行 ISR
extern UINT16 * RamfuncsLoadStart、* RamfuncsLoadEnd、* RamfuncsRunStart;
Int16 VTimer0[4];//虚拟定时器从 CPU 定时器0 (A 事件)中退出
Int16 VTimer1[4];//虚拟定时器从 CPU 定时器1 (B 事件)中退出
Int16 VTimer2[4];//虚拟定时器从 CPU 定时器2中退出(C 事件)
Int16串行通信计时器;
//此系统中使用的全局变量
UINT16偏移标志=0;
_iq offsetA=0;
_iq offsetB=0;
_iq offsetC=0;
_iq ki=_IQ (0.998);//偏移滤波器系数 K1:0.05/(T+0.05);
_IQ K2=_IQ (0.001999);//偏移滤波器系数 K2:t/(T+0.05);
extern _IQ IQsincTable[];
extern _IQ IQcosTable[];
_IQ VdTesting =_IQ (0.0);// Vd 基准(pu)
_IQ VqTesting =_IQ (0.15);// VQ 基准(pu)
_IQ IDREF =_IQ (0.0);// Id 参考(pu)
_IQ IqRef =_IQ (0.1);// Iq 基准(pu)
#IF (BUILDLEVEL _IQ SpeedRef =_IQ (0.15);//进行开环测试
其他
_IQ SpeedRef =_IQ (0.3);//用于闭环测试
#endif
float32 T = 0.001/ISR_FREQUENCY;//采样周期(秒)、请参阅 parameter.h
uint32 IsrTicker = 0;
UINT16 BackTicker = 0;
uint16 lsw = 0;
UINT16 TripFlagDMC=0;//PWM 跳闸状态
//默认 ADC 初始化
int ChSel[16]={0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0};
int TrigSel[16]={5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5、5};
int ACQPS[16]={8、8、8、8、8、8、8、8、8、8、8、8、8、8、8、8};
Int16 LogCh1 = 0;
Int16 LogCh2 = 0;
Int16 DlogCh3 = 0;
Int16 DlogCh4 = 0;
易失性 UINT16 EnableFlag = false;
uint16、4、0 =错误;
UINT16 SpeedLoopPrescaler = 10;//速度环路 prescaler速度環預分頻器
UINT16 SpeedLoopCount = 1;//速度环路计数器
//实例 A 位置估算器實例位置估算器
SMOPOS smo1 = SMOPS_DEFAULTS;
//实例为滑动模式位置观测器常数模块
SMOPS_CONST smo1_CONST = SMOPS_CONST_DEFAULTS;
//实例一个 QEP 接口驱动程序
QEP qep1 = QEP_DEFAULTS;
//实例化几个转换对象
Clarke clarke1 = clark_defaults;
Park park1 = park_defaults;
IPark ipark1 = IPark_defaults;
//实例 PI 稳压器来调节 d 轴和 q 轴电流以及速度
pi_controller pi_spd = pi_controller_defaults;
pi_controller pi_id = pi_controller_defaults;
pi_controller pi_iq = pi_controller_defaults;
//实例 PWM 驱动程序实例
PWMGEN pwm1 = PWMGEN_DEFAULTS;
//实例 PWM DAC 驱动程序实例
PWMDAC pwmdac1 = PWMDAC_DEFAULTS;
//实例一个空间矢量 PWM 调制器。 该调制器生成 a、b 和 c
//基于 d 和 q 信纸参考帧输入的相位
SVGEN svgen1 = SVGEN_DEFAULTS;
//实例一个斜坡控制器以平滑斜升频率
RMPCNTL RC1 = RMPCNTL_DEFAULTS;
//实例一个斜坡发生器来模拟 Anglele
RAMPGEN rg1 = RAMPGEN_DEFAULTS;
//实例 A 相电压计算
PHASEVOLTAGE volt1 = PHASEVOLTAGE_DEFAULTS;
//基于 QEP 的速度计算器实例
SPEED_MEAS_QEP speed1 = SPEED_MEAS_QEP_DEFAULTS;
//基于滑动模式位置观测器的速度计算器实例
speed_Estimation speed3 = speed_Estimation_defaults;
//创建数据记录模块的实例
DLOG_4CH 日志= DLOG_4CH_DEFAULTS;
void GPIO_Setup2 (void);
void main (void)
{
DeviceInit();//器件寿命支持和 GPIO
GPIO_Setup2 ();
//仅在从闪存运行时使用
//请注意,变量 FLASH 由编译器定义
ifdef 闪存
//将时间关键代码和闪存设置代码复制到 RAM
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅链接器文件。
Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
//调用闪存初始化以设置闪存等待状态
//此函数必须驻留在 RAM 中
InitFlash();//调用闪存包装程序初始化函数
#endif //(闪存)
//等待使能标志置位
while (EnableFlag=false)
{
if (GpioDataRegs.GPCDAT.bit.GPIO84==1){/24V 开路
EnableFlag=1;
lsw = 1;
}
BackTicker++;
}
//后台循环的定时同步
//器件特定 PeripheralHeaderIncludes.h 中的定时器周期定义
CpuTimer0Regs.PRD.All = mSec1;//任务
CpuTimer1Regs.PRD.All = mSec5;// B 任务
CpuTimer2Regs.PRD.All = mSec50;// C 任务
//任务状态机初始化
alpha_State_ptr =&A0;
A_Task_ptr =&a1;
B_Task_ptr =&b1;
C_Task_ptr =&c1;
//初始化 PWM 模块
pwm1.PeriodMax = SYSTEM_FREQUENCY * 1000000*T/2;//预分频器 X1 (T1),ISR 周期= T x 1
pwm1.HalfPerMax=pwm1.PeriodMax/2;
pwm1.Deadband = 2.0* system_frequency;//对于 TBCLK = SYSCLK/1、120计数-> 2.0uSec
PWM_INIT_MACRO (1、2、3、pwm1)
//初始化 PWMDAC 模块
pwmdac1.PeriodMax=500;//@60MHz、1500->20kHz、1000->30kHz、500->60kHz
pwmdac1.HalfPerMax=pwmdac1.PeriodMax/2;
PWMDAC_INIT_MACRO (6、pwmdac1)// PWM 6A、6B
PWMDAC_INIT_MACRO (7、pwmdac1)// PWM 7A、7B
//初始化数据记录模块
dlog.iptr1 =&DlogCh1;
dlog.iptr2 =&DlogCh2;
dlog.iptr3 =&DlogCh3;
dlog.iptr4 =&DlogCh4;
dlog.trig_value = 0x1;
dlog.size = 0x00c8;
dlog.prescalar = 5;
dlog.init(&dlog);
//初始化 DMC 套件修订版1.1的 ADC
ChSel[0]= 1;//虚拟测量值。 避免出现第1个样本问题 Rev0 Picollo*/
ChSel[1]=1;// ChSelect:ADC A1->相位 A 电流
ChSel[2]=9;// ChSelect:ADC B1->相位 B 电流
ChSel[3]=3;// ChSelect:ADC A3->相位 C 电流
ChSel[4]=15;// ChSelect:ADC B7->相位 A 电压
ChSel[5]= 14;// ChSelect:ADC B6->相位 B 电压
ChSel[6]= 12;// ChSelect:ADC B4->相位 C 电压
ChSel[7]= 7;// ChSelect:ADC A7->DC 总线电压
//初始化 ADC 模块
ADC_MACRO_INIT (ChSel、TrigSel、ACQPS)
//初始化 QEP 模块
qep1.LineEncoder = 2500;
qep1.MechScale=_IQ30 (0.25/qep1.LineEncoder);
qep1.PolePairs =极点/2;
qep1.CalibratedAngle = 0;
QEP_INIT_MACRO (1、qep1)
//初始化速度模块以进行基于 QEP 的速度计算
speed1.K1 =_IQ21 (1/(BASE_FREQ*T));
speed1.K2 =_IQ (1/(1+T*2*PI*5));//低通截止频率
speed1.K3 =_IQ (1)-speed1.K2;
speed1.BaseRpm = 120*(base_FREQ/极点);
//初始化基于 SMOPOS 的 SPEED_EST 模块速度计算
speed3.K1 =_IQ21 (1/(BASE_FREQ*T));
speed3.K2 =_IQ (1/(1+T*2*PI*5));//低通截止频率
speed3.k3 =_IQ (1)-speed3.k2;
speed3.BaseRpm = 120*(base_FREQ/RART加快);
//初始化 RAMPGEN 模块
rg1.StepAngleMax =_IQ (base_FREQ*T);
//初始化 SMOPOS 常量模块
smo1_const.rs = rs;
smo1_const.LS = LS;
smo1_const.ib = base_current;
smo1_const.vb = base_voltage;
smo1_const.TS = T;
SMO_CONST_MACRO (smo1_const)
//初始化 SMOPOS 模块
smo1.Fsmopos =_iq (smo1_const.Fsmopos);
smo1.Gsmopos =_iq (smo1_const.Gsmopos);
smo1.kslide =_IQ (0.05308703613);
smo1.Kslf =_IQ (0.1057073975);
//初始化 PI 模块的 ID
pi_spd.kp=_iq (1.5);
pi_spd.Ki=_iq (T*SpeedLoopPrescaler/0.2);
pi_spd.umax =_iq (0.95);
pi_spd.umin =_iq (-0.95);
//初始化 PI 模块的 IQ
pi_id.Kp=_IQ (1.0);
pi_id.Ki-_IQ (T/0.04);
pi_id.Umax =_IQ (0.4);
pi_id.Umin =_IQ (-0.4);
//初始化 PI 模块的速度
pi_iq.kp=_iq (1.0);
pi_iq.Ki=_iq (T/0.04);
pi_iq.Umax =_iq (0.8);
pi_iq.umin =_iq (-0.8);
//请注意、d-q PI 输出的矢量和应小于1.0、这是指 SVGEN 的最大占空比。
//另一个占空比限制因素是通过分流电阻器进行电流感测、这取决于硬件/软件实现。
//根据应用要求、可以使用3、2或单个分流电阻器来重建电流波形。
//分流电阻器数量越多、可实现更高的占空比运行和更佳的直流总线利用率。
//在开环测试期间(即 pi_id.Umax、pi_iq.Umax 和 Umins)、用户应该仔细调整 PI 饱和水平、如项目手册中所示。
//违反此程序会产生失真的电流波形和不稳定的闭环运行、这可能会损坏逆变器。
//调用 HVDMC 保护功能
HVDMC_Protection ();
//重新分配 ISR。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM1_INT =偏移 ISR (&O);
EDIS;
//为 EPWM1_INT 启用 PIE 组3中断1
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//使用 EPWM1时基启用 CNT_ZERO 中断
EPwm1Regs.ETSEL.bit.INTEN = 1;//启用 EPWM1INT 生成
EPwm1Regs.ETSEL.bit.INTSEL = 1;//启用中断 CNT_ZERO 事件
EPwm1Regs.ETPS.bit.INTPRD = 1;//在第1个事件上生成中断
EPwm1Regs.ETCLR.bit.INT = 1;//启用更多中断
//为 EPWM1_INT 启用 CPU INT3:
IER |= M_INT3;
//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//空闲循环。 只需坐下来循环:
for (;;)//infinite loop
{
//状态机入口和出口点
//========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
(* alpha_State_ptr)();//跳转至 Alpha 状态(A0、B0、...)
//========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
}
}//结束主代码
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//状态机定序和同步,用于缓慢的后台任务
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
///---------------------- 框架------------------------------------
空 A0 (空)
{
// A 任务的循环速率同步器
if (CpuTimer0Regs.tcr.bit.TIF = 1)
{
CpuTimer0Regs.TCR.bit.TIF = 1;//清除标志
//----------------------------------------------
(*a_Task_ptr)();//跳转至任务(A1、A2、A3、...)
//----------------------------------------------
VTimer0[0]++;//虚拟计时器0,实例0 (备用)
串行通信 Timer++;
}
alpha_State_ptr =&B0;//注释出以仅允许任务
}
空 B0 (空)
{
//针对 B 任务的环路速率同步器
if (CpuTimer1Regs.tcr.bit.TIF = 1)
{
CpuTimer1Regs.TCR.bit.TIF = 1;//清除标志
//----------------------------------------------
(* B_Task_ptr)();//跳转至 B 任务(B1、B2、B3、...)
//----------------------------------------------
VTimer1[0]++;//虚拟计时器1,实例0 (备用)
}
alpha_State_ptr =&C0;//允许 C 状态任务
}
空 C0 (空)
{
//用于 C 任务的环路速率同步器
if (CpuTimer2Regs.tcr.bit.TIF = 1)
{
CpuTimer2Regs.TCR.bit.TIF = 1;//清除标志
//----------------------------------------------
(* C_Task_ptr)();//跳转至 C 任务(C1、C2、C3、...)
//----------------------------------------------
VTimer2[0]++;//虚拟计时器2,实例0 (备用)
}
alpha_State_ptr =&A0;//返回到状态 A0
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// A -任务(每1毫秒执行一次)
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//----------------------------------------
void A1 (void)//备件(未使用)
//----------------------------------------
{
if (EPwm1Regs.TZFlG.bit.OST=0x1)
TripFlagDMC=1;// DMC 上的跳闸(停止、过流和 IPM 故障跳闸)
//--------
//下次 CpuTimer0 'counter'达到周期值时转到 A2
A_Task_ptr =&A2;
//--------
}
//----------------------------------------------------
void A2 (void)//备件(未使用)
//----------------------------------------------------
{
//--------
// CpuTimer0 'counter'下一次达到周期值时转到 A3
A_Task_ptr =&A3;
//--------
}
///--------------------------------
void A3 (void)//备件(未使用)
///--------------------------------
{
//------
//下次 CpuTimer0 'counter'达到周期值时,转到 A1
A_Task_ptr =&a1;
//------
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// B -任务(每5毫秒执行一次)
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
///---------------------------- 用户-------------------------------------------------------
///--------------------------------
void B1 (void)//切换 GPIO-00
///--------------------------------
{
//------
//下次 CpuTimer1 'counter'达到周期值时,转到 B2
B_Task_ptr =&b2;
//------
}
///--------------------------------
void b2 (void)//备件
///--------------------------------
{
//------
//下次 CpuTimer1 'counter'达到周期值时转到 B3
B_Task_ptr =&b3;
//------
}
///--------------------------------
void B3 (void)//备件
///--------------------------------
{
//------
// CpuTimer1的下一次计数器到达周期值时转到 B1
B_Task_ptr =&b1;
//------
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// C -任务(每50毫秒执行一次)
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
///---------------------- 用户-------------------------------------------------------
///--------------------------------
void C1 (void)//切换 GPIO-34
///--------------------------------
{
if (EPwm1Regs.TZFlG.bit.OST=0x1)// PWM 的 TripZ 为低电平(故障跳闸)
{TripFlagDMC=1;
}
GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;//打开/关闭 controlCARD 上的 LD3
//------
//下次 CpuTimer2 'counter'达到周期值时转到 C2
C_Task_ptr =&C2;
//------
}
///--------------------------------
void c2 (void)//备件
///--------------------------------
{
//------
// CpuTimer2 'counter'下一次达到周期值时转到 C3
C_Task_ptr =&C3;
//------
}
///--------------------------------
void C3 (void)//备件
///--------------------------------
{
//------
// CpuTimer2 'counter'下一次达到周期值时转到 C1
C_Task_ptr =&c1;
//------
}
// MainISR
中断空 MainISR (空)
{
//验证 ISR
IsrTicker++;
//================================================ 级别1 ================================================
//检查目标独立模块、占空比波形和 PWM 更新
//在此级别保持电机断开连接
//檢查目標獨立模塊,佔空比波形和PWM更新
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
#if (BUILDLEVEL = LEVEL1)
//----------------------------------
//连接 RMP 模块的输入并调用斜坡控制宏
連接RMP模塊的輸入並調用斜坡控制宏 μ s
//----------------------------------
RC1.targetValue = SpeedRef;
RC_MACRO (RC1)
//----------------------------------
//连接斜坡生成模块的输入并调用斜坡生成器宏
//----------------------------------
rg1.Freq = RC1.SetpointValue;
RG_MACRO (rg1)
//----------------------------------
//连接 INV_PARK 模块的输入并调用逆向 Park 转换。 宏
//三角函数有两个选项:
// IQ 正弦/余弦查找表提供了512个 Q30格式的离散正弦和余弦点
// IQSIN/COS PU 函数将数据内插到查找表中,从而生成更高的分辨率。
//----------------------------------
ipark1.DS = VdTesting;
ipark1.qs = VqTesting;
//ipark1.sine =_IQ30toIQ (IQsincTable[_IQtoIQ9 (rg1.Out)]);
//ipark1.Cosine_IQ30toIQ (IQcosTable[_IQtoIQ9 (rg1.Out)]);
ipark1.sine=IQsinpu (rg1.out);
ipark1.Cosine_IQcospu (rg1.out);
IPark_MACRO (ipark1)
//----------------------------------
//连接 SVGEN_DQ 模块的输入并调用空间矢量发生器。 宏
//----------------------------------
svgen1.Ualpha = ipark1.Alpha;
svgen1.Ubeta = ipark1.Beta;
SVGENDQ_MACRO (svgen1)
//----------------------------------
//连接 PWM_DRV 模块的输入并调用 PWM 信号生成宏
//----------------------------------
pwm1.Mfunc1 = svgen1.Ta;
pwm1.MfuncC2 = svgen1.tb;
pwm1.MfuncC3 = svgen1.tc;
PWM_MACRO (1、2、3、pwm1)//计算新的 PWM 比较值
//----------------------------------
//连接 PWMDAC 模块的输入
//----------------------------------
pwmdac1.Mfunc1 = svgen1.Ta;
pwmdac1.MfuncC2 = svgen1.tb;
PWMDAC_MACRO (6、pwmdac1)// PWMDAC 6A、6B
pwmdac1.Mfunc1 = svgen1.tc;
pwmdac1.MfuncC2 = svgen1.tB-svgen1.tc;
PWMDAC_MACRO (7、pwmdac1)
//----------------------------------
//连接数据记录模块的输入
//----------------------------------
DlogCh1 =_IQtoQ15 (svgen1.Ta);
DlogCh2 =_IQtoQ15 (svgen1.TB);
DlogCh3 =_IQtoQ15 (svgen1.TC);
DlogCh4 =_IQtoQ15 (svgen1.tB-svgen1.tc);
#endif //(BUILDLEVEL = LEVEL1)
//================================================ 级别6 ================================================
// 6级验证 PI 模块执行的速度调节器。
//通过将估算的速度用作反馈来关闭系统速度环路。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// lsw = 0:锁定电机的转子
// ls=1:关闭电流环路
// lsw = 2:关闭速度环路
#if (BUILDLEVEL=level6)
//----------------------------------
//连接 RMP 模块的输入并调用斜坡控制宏
//----------------------------------
if (lsw = 0) RC1.targetValue = 0;
否则 RC1.targetValue = SpeedRef;
RC_MACRO (RC1)
//----------------------------------
//连接斜坡生成模块的输入并调用斜坡生成器宏
//----------------------------------
rg1.Freq = RC1.SetpointValue;
RG_MACRO (rg1)
//----------------------------------
//测量相电流、减去偏移并将其从(-0.5、+0.5)标准化为(-1、+1)。
//连接 Clarke 模块的输入并调用 Clarke 变换宏
//----------------------------------
#ifdef DSP2833x_DEVICE_H
clarke1.as=(AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;//相位 A 电流
clarke1.B=(AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909;//相位 B 电流
#endif //((ADCmeas (Q12)/2^12)-偏移)*2*(3.0/3.3)
#ifdef DSP2803x_DEVICE_H
clarke1.As =_IQmpy2 (_IQ12toIQ (AdcResult.ADCRESULT1)-offsetA);//相位 A 电流。
clarke1.bs =_IQmpy2 (_IQ12toIQ (AdcResult.ADCRESULT2)-offsetB);// B 相电流。
#endif //(ADCmeas (Q12->Q24)-offset)*2.
Clarke_macro (clarke1)
//----------------------------------
//连接驻车模块的输入并调用驻车变速器。 宏
//----------------------------------
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
if (lsw = 0) park1.Angle = 0;
否则、如果(lsw = 1) park1.Angle = rg1.Out;
否则 park1.Angle = smo1.Theta;
park1.sine =_IQsincu (park1.Angle);
park1.Cosine =_IQcosPU (park1.Angle);
PARK_MACRO (park1)
//----------------------------------
//连接 PI 模块的输入并调用 PI 速度控制器宏
//----------------------------------
if (SpeedLoopCount=SpeedLoopPrescaler)
{
pi_spd.Ref = RC1.SetpointValue;
pi_spd.fbk = speed3.EstimatedSpeed;
pi_macro (pi_spd);
SpeedLoopCount=1;
}
else SpeedLoopCount++;
if (lsw = 0 || lsw = 1){pi_spd.ui=0;pi_spd.i1=0;}
//----------------------------------
//连接 PI 模块的输入并调用 PI IQ 控制器宏
//----------------------------------
if (lsw = 0) pi_iq.Ref = 0;
否则、如果(ls=1) pi_iq.Ref = IqRef;
否则 pi_iq.Ref = pi_spd.out;
pi_iq.fbk = park1.qs;
pi_macro (pi_iq)
//----------------------------------
//连接 PI 模块的输入并调用 PI ID 控制器宏
//----------------------------------
if (lsw = 0) pi_id.Ref =_IQ (0.05);
否则 pi_id.Ref = 0;
pi_id.fbk = park1.ds;
pi_macro (pi_id)
//----------------------------------
//连接 INV_PARK 模块的输入并调用逆向 Park 转换。 宏
//----------------------------------
ipark1.ds = pi_id.out;
ipark1.qs = pi_iq.out;
ipark1.sine=park1.sine;
ipark1.Cosine=park1.Cosine;
IPark_MACRO (ipark1)
//----------------------------------
//调用 QEP 计算模块
//----------------------------------
QEP_MACRO (1、qep1);
//----------------------------------
//连接 SPEED_FR 模块的输入并调用速度计算宏
//----------------------------------
speed1.ElecTheta = qep1.ElecTheta;
speed1.DirectionQep =(Int32)(qep1.DirectionQep);
SPEED_FR_MACRO (speed1)
//----------------------------------
//连接 VOLT_CALC 模块的输入并调用相电压宏
//----------------------------------
#ifdef DSP2833x_DEVICE_H
volt1.DcBusVolt =(AdcMirror.ADCRESULT7)*0.00024414)*0.909;//直流总线电压测量
#endif //(ADCmeas (Q12)/2^12)*(3.0V/3.3V)
#ifdef DSP2803x_DEVICE_H
volt1.DcBusVolt =_IQ12toIQ (AdcResult.ADCRESULT7);//直流总线电压测量。
#endif
volt1.MfuncV1 = svgen1.Ta;
volt1.MfuncV2 = svgen1.tb;
volt1.MfuncV3 = svgen1.tc;
PHASEVOLT_MACRO (volt1)
//----------------------------------
//连接 SMO_POS 模块的输入并调用滑动模式观测器宏
//----------------------------------
if (lsw = 2 && smo1.kslID<_IQ (0.25)) smo1.kslID=smo1.kslID+_IQ (0.00001);
//在关闭速度环路后增加 Kslide 以获得更好的扭矩响应
//低 Kslide 对循环瞬态响应更好
smo1.Ialpha = clarke1.Alpha;
smo1.Ibeta = clarke1.Beta;
smo1.Valpha = volt1.Valpha;
smo1.vbeta = volt1.vbeta;
SMO_MACRO (smo1)
//----------------------------------
//连接 SPEED_EST 模块的输入并调用估算速度宏
//----------------------------------
speed3.EstimatedTheta = smo1.Theta;
SE_MACRO (speed3)
//----------------------------------
//连接 SVGEN_DQ 模块的输入并调用空间矢量发生器。 宏
//----------------------------------
svgen1.Ualpha = ipark1.Alpha;
svgen1.Ubeta = ipark1.Beta;
SVGENDQ_MACRO (svgen1)
//----------------------------------
//连接 PWM_DRV 模块的输入并调用 PWM 信号生成宏
//----------------------------------
pwm1.Mfunc1 = svgen1.Ta;
pwm1.MfuncC2 = svgen1.tb;
pwm1.MfuncC3 = svgen1.tc;
PWM_MACRO (1、2、3、pwm1)//计算新的 PWM 比较值
//----------------------------------
//连接 PWMDAC 模块的输入
//----------------------------------
pwmdac1.Mfunc1 = clarke1.as;
pwmdac1.MfuncC2 = clarke1.B;
PWMDAC_MACRO (6、pwmdac1)// PWMDAC 6A、6B
pwmdac1.Mfunc1 = qep1.ElecTheta;
pwmdac1.Mfunc2 = smo1.Theta;
PWMDAC_MACRO (7、pwmdac1)// PWMDAC 7A、7B
//----------------------------------
//连接数据记录模块的输入
//----------------------------------
DlogCh1 =_IQtoQ15 (clarke1.As);
DlogCh2 =_IQtoQ15 (smo1.Theta);
DlogCh3 =_IQtoQ15 (volt1.Vbeta);
DlogCh4 =_IQtoQ15 (volt1.Valpha);
#endif //(BUILDLEVEL=level6)
//----------------------------------
//调用数据记录更新功能。
//----------------------------------
dlog.update (&dlog);
//从此计时器启用更多中断
EPwm1Regs.ETCLR.bit.INT = 1;
//确认中断以接收来自 PIE 组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}// MainISR 在此结束
/********* /
/******** 偏移补偿******* /
/********* /
中断空偏移 ISR (空)
{
//验证 ISR
IsrTicker++;
ADC 的//直流偏移测量
IF (IsrTicker>=5000)
{
#ifdef DSP2833x_DEVICE_H
offsetA= k1*offsetA + k2*(AdcMirror.ADCRESULT1)*0.00024414;//相位 A 偏移
offsetB= K1*offsetB+K2*(AdcMirror.ADCRESULT2)*0.00024414;//相位 B 偏移
offsetC= k1*offsetC+k2*(AdcMirror.ADCRESULT3)*0.00024414;;//Phase C offset
#endif
#ifdef DSP2803x_DEVICE_H
offsetA=_IQmpy (K1、offsetA)+_IQmpy (K2、_IQ12toIQ (AdcResult.ADCRESULT1));//相位 A 偏移
offsetB=_IQmpy (K1、offsetB)+_IQmpy (K2、_IQ12toIQ (AdcResult.ADCRESULT2);//Phase B 偏移
offsetC=_IQmpy (K1、offsetC)+_IQmpy (K2、_IQ12toIQ (AdcResult.ADCRESULT3);//Phase C 偏移
#endif
}
IF (IsrTicker > 20000)
{
EALLOW;
PieVectTable.EPWM1_INT = MainISR;
EDIS;
}
//从此计时器启用更多中断
EPwm1Regs.ETCLR.bit.INT = 1;
//确认中断以接收来自 PIE 组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}
//********* 补偿结束 **** //
/********* /
/********* 保护配置*** /
/********* /
空 HVDMC_Protection (空)
{
EALLOW;
//为电机控制软件配置跳闸机制
//- CPU 暂停时逐周期跳闸
//-单次 IPM 跳匣区域跳闸
// EPWM1、2和3需要重复这些跳闸
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//电机控制跳闸配置、EPwm1、2、3
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// CPU 停止跳闸
EPwm1Regs.TZSEL.bit.CBC6=0x1;
EPwm2Regs.TZSEL.bit.CBC6=0x1;
EPwm3Regs.TZSEL.bit.CBC6=0x1;
EPwm1Regs.TZSEL.bit.OSHT1 = 1;//为 OSHT 启用 TZ1
EPwm2Regs.TZSEL.bit.OSHT1 = 1;//为 OSHT 启用 TZ1
EPwm3Regs.TZSEL.bit.OSHT1 = 1;//为 OSHT 启用 TZ1
//我们希望 OST/CBC 事件做什么?
// TZA 事件会强制 EPWMxA
// ZB 事件会强制 EPWMxB
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;// EPWMxA 将变为低电平
EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;// EPWMxB 将变为低电平
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;// EPWMxA 将变为低电平
EPwm2Regs.TZCTL.bit.TSB = TZ_FORCE_LO;// EPWMxB 将变为低电平
EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO;// EPWMxA 将变为低电平
EPwm3Regs.TZCTL.bit.TSB = TZ_FORCE_LO;// EPWMxB 将变为低电平
EDIS;
//清除任何杂散 OV 跳闸
EPwm1Regs.TZCLR.bit.OST = 1;
EPwm2Regs.TZCLR.bit.OST = 1;
EPwm3Regs.TZCLR.bit.OST = 1;
//********* 项目结束 配置 秘书长的报告 //
}
void GPIO_Setup2 (void){
EALLOW;
GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 0;// GPIO84 = GPIO84
GpioCtrlRegs.GPCDIR.bit.GPIO84 = 1;// GPIO84 =输入
GpioIntRegs.GPIOXINT4SEL.ALL = 84;// XINT1连接到 GPIO84
EDIS;
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================