This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28335:F28335闪存 RAM HVPM_sensorless

Guru**** 2525520 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/809641/ccs-tms320f28335-f28335-flash-ram-hvpm_sensorless

器件型号:TMS320F28335
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;

//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果没有对您的问题的明确说明、请不要在 e2e 上发布大量代码。 一般而言、我们不会查看或调试用户代码、但我们会就与我们的器件和开发工具相关的特定问题向您提供帮助。 这包括在使用我们的器件进行设计时阐明任何位、寄存器或功能的行为。 建议遵循标准和逻辑调试技术。 请继续调试您的代码、并随时使用此论坛提出具体问题。 问题越具体、我们就能越好地帮助您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如何重新编辑我的文章

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请不要发布大量代码、而是以清晰/简洁的方式解释您的问题到底是什么以及您寻求什么帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果只想 将调试更改为从闪存运行程序、请通过 Project->Build Configurations->Set Active->F2833x_Flash 来更改示例项目中的编译配置。

    如果您没有机会查看研讨会材料、我认为这将有助于揭秘一些术语和架构。
    http://processors.wiki.ti.com/index.php/C2000_Archived_Workshops

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不知道为什么我的页面只有 F28335_ram 如何打开 F28335_FLASH

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../0044.HVPM_5F00_Sensorless_5F00_2833x.rar

    我的项目

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以下载 controlSUITE 并重新安装软件

    https://www.ti.com/tool/controlsuite