TI中文支持网
TI专业的中文技术问题搜集分享网站

CONTROLSUITE: clarke1.As 值沒有改變

Part Number:CONTROLSUITEOther Parts Discussed in Thread:TMS320F28335, TMDSHVMTRPFCKIT,

您好,我所使用的硬體是 TMDSHVMTRPFCKIT 和 TMS320F28335 來控制馬達。在執行 "C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensored\~Docs\Sensored FOC of PMSM" 文件中的 Level2,代碼如下:

 

#if (BUILDLEVEL==LEVEL2)

// ------------------------------------------------------------------------------
//  Connect inputs of the RMP module and call the ramp control macro
// ------------------------------------------------------------------------------rc1.TargetValue = SpeedRef;RC_MACRO(rc1)

// ------------------------------------------------------------------------------
//  Connect inputs of the RAMP GEN module and call the ramp generator macro
// ------------------------------------------------------------------------------rg1.Freq = rc1.SetpointValue;RG_MACRO(rg1)

// ------------------------------------------------------------------------------
//  Measure phase currents, subtract the offset and normalize from (-0.5,+0.5) to (-1,+1).
//  Connect inputs of the CLARKE module and call the clarke transformation macro
// ------------------------------------------------------------------------------#ifdef DSP2833x_DEVICE_Hclarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr.clarke1.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909; // Phase B curr.#endif// ((ADCmeas(q12)/2^12)-offset)*2*(3.0/3.3)#ifdef DSP2803x_DEVICE_Hclarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.clarke1.Bs = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT2)-offsetB); // Phase B curr.#endif// (ADCmeas(q12->q24)-offset)*2CLARKE_MACRO(clarke1)

// ------------------------------------------------------------------------------
//  Connect inputs of the PARK module and call the park trans. macro
// ------------------------------------------------------------------------------park1.Alpha = clarke1.Alpha;park1.Beta = clarke1.Beta;park1.Angle = rg1.Out;park1.Sine = _IQsinPU(park1.Angle);park1.Cosine = _IQcosPU(park1.Angle);PARK_MACRO(park1)

// ------------------------------------------------------------------------------
//  Connect inputs of the INV_PARK module and call the inverse park trans. macro
// ------------------------------------------------------------------------------ipark1.Ds = VdTesting;ipark1.Qs = VqTesting;ipark1.Sine=park1.Sine;ipark1.Cosine=park1.Cosine;IPARK_MACRO(ipark1)

// ------------------------------------------------------------------------------
//  Connect inputs of the SVGEN_DQ module and call the space-vector gen. macro
// ------------------------------------------------------------------------------svgen1.Ualpha = ipark1.Alpha;svgen1.Ubeta  = ipark1.Beta;SVGENDQ_MACRO(svgen1)

// ------------------------------------------------------------------------------
//  Connect inputs of the PWM_DRV module and call the PWM signal generation macro
// ------------------------------------------------------------------------------pwm1.MfuncC1 = svgen1.Ta;pwm1.MfuncC2 = svgen1.Tb;pwm1.MfuncC3 = svgen1.Tc;PWM_MACRO(1,2,3,pwm1)// Calculate the new PWM compare values

// ------------------------------------------------------------------------------
//  Connect inputs of the PWMDAC module
// ------------------------------------------------------------------------------pwmdac1.MfuncC1 = clarke1.As;pwmdac1.MfuncC2 = clarke1.Bs;PWMDAC_MACRO(6,pwmdac1)// PWMDAC 6A, 6Bpwmdac1.MfuncC1 = svgen1.Tc;pwmdac1.MfuncC2 = svgen1.Tb-svgen1.Tc;PWMDAC_MACRO(7,pwmdac1)

// ------------------------------------------------------------------------------
//  Connect inputs of the DATALOG module
// ------------------------------------------------------------------------------DlogCh1 = (int16)_IQtoIQ15(svgen1.Ta);DlogCh2 = (int16)_IQtoIQ15(rg1.Out);DlogCh3 = (int16)_IQtoIQ15(clarke1.As);DlogCh4 = (int16)_IQtoIQ15(clarke1.Bs);


#endif // (BUILDLEVEL==LEVEL2)

在進行電流採樣的 clarke1.As、clarke1.Bs 數值都維持在初始值,並沒有改變,想請問:

1. 是中斷點設定的問題嗎? (所設定的觀察點如下圖)  還是有其他原因導致未接收到電流值?  

2. 其中 AdcMirror.ADCRESULT1 的數值是如何得到的呢?

Green Deng:

你好,请问你是基于原例程,只是修改了build level吗?还是对原例程有做过其他什么修改?如果有的话还请在代码中标识出来或者说明一下,包括build level之外的部分

,

Cheng Han Chang:

非常感謝您的回覆,因為原先建置時在以下紅字代碼

pwmdac1.MfuncC1 = clarke1.As; pwmdac1.MfuncC2 = clarke1.Bs; PWMDAC_MACRO(6,pwmdac1) // PWMDAC 6A, 6B

pwmdac1.MfuncC1 = svgen1.Tc; pwmdac1.MfuncC2 = svgen1.Tb-svgen1.Tc; PWMDAC_MACRO(7,pwmdac1)

中有出現以下的警告:

#177-D subscript out of range

因此有對以下幾處新增內容(以較大紅色字型標示):

f2833xdrvlib.h 中的

// Used to indirectly access all EPWM modulesvolatile struct EPWM_REGS *ePWM[] = { &EPwm1Regs, //intentional: (ePWM[0] not used) &EPwm1Regs, &EPwm2Regs, &EPwm3Regs, &EPwm4Regs, &EPwm5Regs, &EPwm6Regs, &EPwm7Regs, };

DSP2833x_Headers_nonBIOS.cmd 中的

EPWM1 : origin = 0x006800, length = 0x000022 /* Enhanced PWM 1 registers */ EPWM2 : origin = 0x006840, length = 0x000022 /* Enhanced PWM 2 registers */ EPWM3 : origin = 0x006880, length = 0x000022 /* Enhanced PWM 3 registers */ EPWM4 : origin = 0x0068C0, length = 0x000022 /* Enhanced PWM 4 registers */ EPWM5 : origin = 0x006900, length = 0x000022 /* Enhanced PWM 5 registers */ EPWM6 : origin = 0x006940, length = 0x000022 /* Enhanced PWM 6 registers */ EPWM7 : origin = 0x006980, length = 0x000022 /* Enhanced PWM 7 registers */

以及

EPwm1RegsFile : > EPWM1 PAGE = 1 EPwm2RegsFile : > EPWM2 PAGE = 1 EPwm3RegsFile : > EPWM3 PAGE = 1 EPwm4RegsFile : > EPWM4 PAGE = 1 EPwm5RegsFile : > EPWM5 PAGE = 1 EPwm6RegsFile : > EPWM6 PAGE = 1 EPwm7RegsFile : > EPWM7 PAGE = 1

DSP2833x_EPwm.h 中的

//// External References & Function Declarations//extern volatile struct EPWM_REGS EPwm1Regs;extern volatile struct EPWM_REGS EPwm2Regs;extern volatile struct EPWM_REGS EPwm3Regs;extern volatile struct EPWM_REGS EPwm4Regs;extern volatile struct EPWM_REGS EPwm5Regs;extern volatile struct EPWM_REGS EPwm6Regs;extern volatile struct EPWM_REGS EPwm7Regs;

另外建置完後還有出現以下的警告,但苦於不知如何修正,且似乎沒有影響到例程的運行,因此就先擱置了。

其餘部分皆是基於原例程,並將 build level 設為 level2。

,

Green Deng:

你好,clarke1.As、clarke1.Bs不更新的情况已经帮你咨询资深工程师了。

但是我比较好奇你的警告是import原始例程就会出现吗?还是import的是修改过的程序?

#177-D subscript out of range

,

Cheng Han Chang:

如果是指 #177-D subscript out of range 這個警告的話,是import原始例程就有出現沒錯

,

Green Deng:

这个例程是针对F28035设备设计的,如果是F28335设备,可能需要对设备初始化代码和.cmd文件进行一些小的更改,不知道你是否有修改过?

另外,import原始例程就有这个警告的话怀疑你的controlSUITE或者CCS是否有什么问题,下面是这两个软件的下载地址,如果有必要的话可以重装一下:

ControlSUITE:www.ti.com.cn/…/CONTROLSUITE

CCS:www.ti.com.cn/…/CCSTUDIO

,

Cheng Han Chang:

我這邊是將 F28035 相關的部分以 "C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensorless_2833x" 中 F28335 的部分來取代,不知道這樣會不會有甚麼問題呢? 

 

Green Deng 说:另外,import原始例程就有这个警告的话怀疑你的controlSUITE或者CCS是否有什么问题

這個部分是否會有CCS版本相容性的問題呢? (目前是下載最新版本的)

另外,

#ifdef DSP2833x_DEVICE_H clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr. clarke1.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909; // Phase B curr. #endif // ((ADCmeas(q12)/2^12)-offset)*2*(3.0/3.3)

這部分應該是與Adc相關,能否麻煩您提點一下可以針對哪些部分做檢查或是修正?

,

Green Deng:

Cheng Han Chang 说:我這邊是將 F28035 相關的部分以 "C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensorless_2833x" 中 F28335 的部分來取代,不知道這樣會不會有甚麼問題呢? 

额,这个应该不太行,因为F28035是定点芯片,而F28335是浮点芯片,两者在数据处理上还是有挺大差别的。这两款芯片的代码移植我建议你直接在英文E2E上咨询一下,英文论坛的Yanming Luo是电机控制方面的专家,他对例程非常熟悉,应该能帮你更高效地解决移植的问题。

,

Green Deng:

e2e.ti.com/…/c2000-microcontrollers-forum

,

Cheng Han Chang:

關於警告的部分,我在 28335_RAM_lnk.cmd 文件中修改了以下部分,

ramfuns:    我將以下代碼刪除

#ifdef __TI_COMPILER_VERSION__#if __TI_COMPILER_VERSION__ >= 15009000.TI.ramfunc : > RAML0, PAGE = 0#elseramfuncs : > RAML0, PAGE = 0#endif#endif並替換為

ramfuncs : > RAML0, PAGE = 0

dlog:   新增以下代碼

SECTIONS{DLOG: > RAML4,PAGE = 1}

IQmath.lib: 似乎是沒有使用到,因此從引用文件中移除後,警告就有清除了。

不過解決了以上警告後,並沒有解決到原本的問題。有去詢問過英文E2E,不過現在已經沒辦法使用大學email來進行發問了…

,

Green Deng:

好吧,那我咨询一下这两者迁移需要注意哪些。但是时间有点久了,不知道对方多久能回复。。。

,

Green Deng:

对方回复:

Change the PWM, ADC and GPIO configuration codes in the project according to the device the customer used. It's difficult to provide a detailed modification to any customers on E2E like this as you required.

You may refer to the example in the folder below. Don't use the EPWM6& for the PWMDAC.

C:\ti\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v2.1\HVPM_Sensorless_2833x

,

Cheng Han Chang:

非常感謝您的幫忙,

這幾天有再進行測試,發現 AdcMirror.ADCRESULT1/2 是有接收到值的。沒有輸入電壓時的值大約為ADCRESULT1: 2091,ADCRESULT2: 2522,不知道這樣的數值是否正確 (為何不是0?); 直接輸入3.3v電壓時,數值為4095,應為正確數值 (最大值); 在連接電機運轉時也有讀到2000~3500之間變動的數值,判斷應沒有問題。

因此目前小弟認為可能是數值轉換成 clarke1.As、clarke1.Bs 時出了問題,且ADCRESULT1/2 值有在變動 clarke1.As/Bs 也應跟著動才對吧。以上的推測有錯誤的地方再麻煩糾正。

另外,有看到不理解的點是

1. AdcMirror.ADCRESULT1/2 定義是 Uint,而 clarke1.As/Bs 和 offsetA/B 定義是 _iq ,想請問這樣在執行以下代碼時是可行的嗎?

#ifdef DSP2833x_DEVICE_Hclarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr.clarke1.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909; // Phase B curr.#endif

2. offsetA/B 的作用為何? 以及 offsetA/B 的值應該落在多少是正常的呢? 

至於您上次的回覆:

Green Deng 说:You may refer to the example in the folder below. Don't use the EPWM6& for the PWMDAC.

我有在說明文件中看到 "PWM 6A, 6B, 7A* & 7B* for DAC outputs ( * x2803x only )"這句話 ,但似乎沒有看到說明,在 HVPM_Sensorless_2833x 例程中也有使用到這兩個作為 PWMDAC,因此不太理解為什麼不能用。

再麻煩您替小弟解惑了,感謝!!

赞(0)
未经允许不得转载:TI中文支持网 » CONTROLSUITE: clarke1.As 值沒有改變
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1