1
0

2 Коммитууд a0d4df795b ... bc9246535a

Эзэн SHA1 Мессеж Огноо
  dd bc9246535a 无感正常切闭环,tbc中读tmag5273启动电机时会死机。 1 долоо хоног өмнө
  dd eb7744c571 增加XY轴归一处理,软件模式I2C在tbc中断运行异常。 1 долоо хоног өмнө

+ 12 - 6
1.FrameLayer/Source/main.c

@@ -141,7 +141,6 @@ SYSCONFIG_WEAK void SYSCFG_DL_PWM_0_COPY_init(void) {
 
 }
 
-UWORD Angle;
 int  main(void)
 {
     SCB->VTOR =APP_START_Address;//
@@ -154,6 +153,8 @@ int  main(void)
     SYSCFG_DL_PWM_0_COPY_init();
     Reset_POWER_LOCK_PORT();
 
+    tmag5273_Init();
+
     //TIMA0  MOTOR_PWM
     DL_Timer_setCaptCompUpdateMethod(MOTOR_PWM_INST,DL_TIMER_CC_UPDATE_METHOD_ZERO_EVT,DL_TIMERA_CAPTURE_COMPARE_0_INDEX);
     DL_Timer_setCaptCompUpdateMethod(MOTOR_PWM_INST,DL_TIMER_CC_UPDATE_METHOD_ZERO_EVT,DL_TIMERA_CAPTURE_COMPARE_1_INDEX);
@@ -259,7 +260,7 @@ int  main(void)
 //    delay_cycles(DELAY);
 //    delay_cycles(DELAY);
 
-    tmag5273_Init();
+//    tmag5273_Init();
     /* Enter infinite loop */
 #if(JSCOPE_EN!=0)
      Jscope_Init();
@@ -276,13 +277,18 @@ int  main(void)
     {
 //        DL_GPIO_togglePins(LED_PORT, LED_LED1_PIN);
 //        DL_GPIO_togglePins(LED_PORT, LED_LED2_PIN);
-          AppLoop();
+//        DL_GPIO_togglePins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
+        AppLoop();
 //          PROFILER_BG();
           ACnt++;
 //          Tempe = tmag5273_GetTemp();
-          DL_GPIO_setPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
-          Angle = tmag5273_GetAngle();
-          DL_GPIO_clearPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
+//          DL_GPIO_setPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
+          Tmag5273_out.Angle = tmag5273_GetAngle();
+//          Tmag5273_out.MagX = tmag5273_GetXData();
+//          Tmag5273_out.MagY = tmag5273_GetYData();
+//          Tmag5273_out.MagZ = tmag5273_GetZData();
+//          Tmag5273_out.Temp = tmag5273_GetTemp();
+//          DL_GPIO_clearPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
 //          MagX = tmag5273_GetXData();
 //          MagY = tmag5273_GetYData();
 //          MagZ = tmag5273_GetZData();

+ 1 - 1
1.FrameLayer/Source/tbc.c

@@ -94,7 +94,7 @@ void tbc_voUpIsr(void)
 //      LoadObsTheta_U.IqFbkPu = scm_swIqFdbLpfPu;
 //      LoadObsTheta_U.ThetamPu = switchhall_stOut.uwLowThetaPu;
 //      LoadObsTheta_step();
-//    switchhall_stOut.uwLowThetaPu = tmag5273_GetAngle();
+//    Tmag5273_out.Angle = tmag5273_GetAngle();
     /* Full Order Observer: Hall Angle Filter */
     rtU.AngleIn = switchhall_stOut.uwLowThetaPu;
     Trigger();

+ 20 - 20
2.MotorDrive/Source/spdctrFSM.c

@@ -326,7 +326,7 @@ void ClzLoop_TbcdownHook(void)
         {
             temptheta += cof_sl360DegreePu;
         }
-//        scm_uwAngRefPu=temptheta;
+        scm_uwAngRefPu=temptheta;
         tstThetaCorrect = scm_uwAngRefPu - rtY.Angle_Filtered;
     }
     else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
@@ -353,25 +353,25 @@ void ClzLoop_TbcdownHook(void)
     /*======================================================================= 
              Set Iq limit and Id reference for Constant Voltage Break
     =======================================================================*/
-//    cvb_stBrakeIn.uwVdcLpfPu = (SWORD)adc_stUpOut.uwVdcLpfPu;
-//    cvb_stBrakeIn.swIdRefPu = scm_swIdRefPu;
-//    cvb_stBrakeIn.swIqRefPu = swCurRefrompu; //scm_swIqRefPu;
-//    cvb_stBrakeIn.swSpdPu = scm_stSpdFbkLpf.slY.sw.hi;
-//    cvb_stBrakeIn.uwAngelPu = scm_uwAngRefPu;
-//    cvb_stBrakeIn.uwSpdLpfAbsPu = scm_uwSpdFbkLpfAbsPu;
-//    cvb_voBrake(&cvb_stBrakeIn,&cvb_stBrakeCoef,&cvb_stBrakeOut);
-//
-//    scm_swIqRefPu = cvb_stBrakeOut.swIqRefPu;
-//    scm_uwAngRefPu = cvb_stBrakeOut.uwAngelPu;
-
-    scm_swIqRefPu = -500;
-    static UWORD AngleCnt;
-    AngleCnt += 200;
-    if(AngleCnt > 32767)
-    {
-        AngleCnt = 0;
-    }
-    scm_uwAngRefPu = AngleCnt;
+    cvb_stBrakeIn.uwVdcLpfPu = (SWORD)adc_stUpOut.uwVdcLpfPu;
+    cvb_stBrakeIn.swIdRefPu = scm_swIdRefPu;
+    cvb_stBrakeIn.swIqRefPu = swCurRefrompu; //scm_swIqRefPu;
+    cvb_stBrakeIn.swSpdPu = scm_stSpdFbkLpf.slY.sw.hi;
+    cvb_stBrakeIn.uwAngelPu = scm_uwAngRefPu;
+    cvb_stBrakeIn.uwSpdLpfAbsPu = scm_uwSpdFbkLpfAbsPu;
+    cvb_voBrake(&cvb_stBrakeIn,&cvb_stBrakeCoef,&cvb_stBrakeOut);
+
+    scm_swIqRefPu = cvb_stBrakeOut.swIqRefPu;
+    scm_uwAngRefPu = cvb_stBrakeOut.uwAngelPu;
+
+//    scm_swIqRefPu = -500;
+//    static UWORD AngleCnt;
+//    AngleCnt += 200;
+//    if(AngleCnt > 32767)
+//    {
+//        AngleCnt = 0;
+//    }
+//    scm_uwAngRefPu = AngleCnt;
 
     if(cvb_stBrakeIn.uwVdcLpfPu >= cvb_stBrakeCoef.uwVdcStartCvbPu)
     {

+ 14 - 0
3.BasicFunction/Include/tmag5273.h

@@ -10,6 +10,20 @@
 
 #include "typedefine.h"
 
+typedef struct
+{
+    UWORD uwOriginOffset;
+    SLONG MagX;      //uT
+    SLONG MagY;      //uT
+    SLONG MagZ;      //uT
+    SWORD Temp;      //0.01℃
+    UWORD Angle;     //Q15
+    SWORD AngleErr;
+    UWORD Speed;     //Q15
+} TMAG5273_OUT;
+
+extern TMAG5273_OUT Tmag5273_out;
+
 extern UBYTE tmag5273_GetDevID(void);
 extern UWORD tmag5273_GetMANUFACTURER_ID(void);
 extern SBYTE tmag5273_Init(void);

+ 2 - 2
3.BasicFunction/Source/i2c_analog.c

@@ -13,7 +13,7 @@
 
 void I2C_Delay(void)
 {
-    delay_cycles(20); //SCL周期1us
+    delay_cycles(10); //20 SCL周期1us
 }
 
 void I2C_Init(void)
@@ -82,7 +82,7 @@ void I2C_SendByte(UBYTE sendDAT)
    I2C_Delay();
    SET_SDA_IN();
    SCL_H();
-   delay_cycles(5);
+   delay_cycles(2);
    revack = (UBYTE)SDAM();
    I2C_Delay();
    SCL_L();

+ 19 - 10
3.BasicFunction/Source/tmag5273.c

@@ -41,6 +41,8 @@
 #define MAGNITUDE_RESULT               0x1B
 #define DEVICE_STATUS                  0x1C
 
+TMAG5273_OUT Tmag5273_out;
+
 void TMAG5273_WriteReg(UBYTE RAddr, UBYTE WData)
 {
     I2C_Start();
@@ -96,8 +98,10 @@ SBYTE tmag5273_Init(void)
     TMAG5273_WriteReg(DEVICE_CONFIG_2, tmp);
     tmp = 0x7C;
     TMAG5273_WriteReg(SENSOR_CONFIG_1, tmp);
-    tmp = 0x04;
+    tmp = 0x14; //Ax < Ay
     TMAG5273_WriteReg(SENSOR_CONFIG_2, tmp);
+    tmp = 196;  //Ax = 20.623mT, Ay = 26.873mT, Ax / Ay * 256
+    TMAG5273_WriteReg(MAG_GAIN_CONFIG, tmp);
     tmp = 0x01;
     TMAG5273_WriteReg(T_CONFIG, tmp);
 
@@ -173,18 +177,23 @@ SWORD tmag5273_GetTemp(void) //0.01℃
 UWORD tmag5273_GetAngle(void) //Q15
 {
     UBYTE agMLSB[2] = {0, 0};
+    UWORD anData = 0;
     UWORD Result;
 
     TMAG5273_ReadData(ANGLE_RESULT_MSB, 2, agMLSB);
-    Result = 32767 - (((agMLSB[1] + (agMLSB[0] << 8)) * 728) >> 7);
+    anData = agMLSB[1] + (agMLSB[0] << 8);
+    if(anData > 5760)
+        anData = 5760;
+    Result = 32767 - ((anData * 728) >> 7);
 
-    if(Result < 1469)
-    {
-        return (Result + 32767 - 1469);
-    }
-    else
-    {
-        return (Result - 1469);
-    }
+    return Result;
+//    if(Result < 1469)
+//    {
+//        return (Result + 32767 - 1469);
+//    }
+//    else
+//    {
+//        return (Result - 1469);
+//    }
 
 }