GT_MOTOR_24NM_V03_PT1000

Dependencies:   mbed Hobbyking_Cheetah FastPWM3

Revision:
55:165927e4f815
Parent:
53:e85efce8c1eb
--- a/main.cpp	Thu Aug 08 17:39:43 2019 +0000
+++ b/main.cpp	Tue May 10 02:26:27 2022 +0000
@@ -10,7 +10,7 @@
 #define SETUP_MODE 4
 #define ENCODER_MODE 5
 
-#define VERSION_NUM "1.9"
+#define VERSION_NUM "0.3"
 
 
 float __float_reg[64];                                                          // Floats stored in flash
@@ -54,10 +54,13 @@
 
 PositionSensorAM5147 spi(16384, 0.0, NPP);  
 
-volatile int count = 0;
+volatile int counts = 0;
 volatile int state = REST_MODE;
 volatile int state_change;
 
+
+volatile int cal_counts = 0;
+
 void onMsgReceived() {
     //msgAvailable = true;
     //printf("%d\n\r", rxMsg.id);
@@ -75,11 +78,17 @@
             }
         else if(((rxMsg.data[0]==0xFF) & (rxMsg.data[1]==0xFF) & (rxMsg.data[2]==0xFF) & (rxMsg.data[3]==0xFF) * (rxMsg.data[4]==0xFF) & (rxMsg.data[5]==0xFF) & (rxMsg.data[6]==0xFF) & (rxMsg.data[7]==0xFE))){
             spi.ZeroPosition();
+            }            
+        else if(((rxMsg.data[0]==0xFF) & (rxMsg.data[1]==0xFF) & (rxMsg.data[2]==0xFF) & (rxMsg.data[3]==0xFF) * (rxMsg.data[4]==0xFF) & (rxMsg.data[5]==0xFF) & (rxMsg.data[6]==0xFF) & (rxMsg.data[7]==0xFF))){
+            //Null instruction, which can be used to return data
             }
         else if(state == MOTOR_MODE){
             unpack_cmd(rxMsg, &controller);
             }
-        pack_reply(&txMsg, controller.theta_mech, controller.dtheta_mech, controller.i_q_filt*KT_OUT);
+        //pack_reply(&txMsg, controller.theta_mech, controller.dtheta_mech, controller.i_q_filt*KT_OUT);
+        //pack_reply(&txMsg, controller.theta_mech, controller.dtheta_mech*GR, controller.i_q_filt*KT_OUT);    // modify by 20210617
+        //pack_reply(&txMsg, controller.theta_mech, controller.dtheta_mech*GR, controller.i_q_filt*KT);   // 正式使用 plan A&C, modify by 20210630        
+        pack_reply(&txMsg, controller.theta_mech, controller.dtheta_mech, controller.i_q_filt*KT);      //  test v?, modify by 20210706     
         can.write(txMsg);
         }
     
@@ -166,7 +175,6 @@
 /// This runs at 40 kHz, regardless of of the mode the controller is in ///
 extern "C" void TIM1_UP_TIM10_IRQHandler(void) {
   if (TIM1->SR & TIM_SR_UIF ) {
-
         ///Sample current always ///
         ADC1->CR2  |= 0x40000000;                                               // Begin sample and conversion
         //volatile int delay;   
@@ -177,8 +185,11 @@
         controller.adc1_raw = ADC1->DR;
         controller.adc3_raw = ADC3->DR;
         controller.theta_elec = spi.GetElecPosition();
-        controller.theta_mech = (1.0f/GR)*spi.GetMechPosition();
-        controller.dtheta_mech = (1.0f/GR)*spi.GetMechVelocity();  
+        //controller.theta_mech = (1.0f/GR)*spi.GetMechPosition();
+        controller.dtheta_mech = (1.0f/GR)*spi.GetMechVelocity();   
+        controller.theta_mech = (1.0f)*spi.GetMechPosition();    // modified on 20210617
+        //controller.dtheta_mech = (1.0f)*spi.GetMechVelocity();   // modified on 20210618
+        
         controller.dtheta_elec = spi.GetElecVelocity();
         controller.v_bus = 0.95f*controller.v_bus + 0.05f*((float)controller.adc3_raw)*V_SCALE; //filter the dc link voltage measurement
         ///
@@ -199,8 +210,11 @@
              
             case MOTOR_MODE:                                                   // Run torque control
                 if(state_change){
+                    
                     enter_torque_mode();
-                    count = 0;
+                    
+                    counts = 0;  //20210222
+                    
                     }
                 else{
                 /*
@@ -224,9 +238,8 @@
 
                 torque_control(&controller);
                 commutate(&controller, &observer, &gpio, controller.theta_elec);           // Run current loop
-
                 controller.timeout++;
-                count++; 
+                counts ++; 
             
                 }     
                 break;
@@ -238,7 +251,7 @@
             case ENCODER_MODE:
                 print_encoder();
                 break;
-                }                 
+                }    
       }
   TIM1->SR = 0x0;                                                               // reset the status register
 }
@@ -269,7 +282,7 @@
                     break;
                 case 'm':
                     state = MOTOR_MODE;
-                    state_change = 1;
+                    state_change = 1;                    
                     break;
                 case 'e':
                     state = ENCODER_MODE;
@@ -358,8 +371,112 @@
             
         }
     }
+    
+//PT1000用二分法查表计算温度
+//测温范围:-50~150℃
+float RTD_TAB_PT1000[201] = {
+
+803.08,807.05,811.02,814.98,818.95,822.92,826.88,830.84,834.80,838.76,              //-50~-41
+842.72,846.68,850.63,854.58,858.54,862.49,866.44,870.39,874.33,878.28,              //-40~-31
+882.23,886.17,890.11,894.05,897.99,901.93,905.87,909.80,913.74,917.67,              //-30~-21
+921.60,925.54,929.47,933.39,937.32,941.25,945.17,949.10,953.02,956.94,              //-20~-11
+960.86,964.78,968.70,972.62,976.53,980.45,984.36,988.27,992.18,996.09,              //-10~-1
+1000.00,1003.91,1007.81,1011.72,1015.62,1019.53,1023.43,1027.33,1031.23,1035.13,    //0~9
+1039.02,1042.92,1046.81,1050.71,1054.60,1058.49,1062.38,1066.27,1070.16,1074.04,    //10~19
+1077.93,1081.81,1085.70,1089.58,1093.46,1097.34,1101.22,1105.10,1108.97,1112.85,    //20~29
+1116.72,1120.59,1124.46,1128.34,1132.20,1136.07,1139.94,1143.81,1147.67,1151.53,    //30~39
+1155.40,1159.26,1163.12,1166.98,1170.83,1174.69,1178.55,1182.40,1186.25,1190.11,    //40~49
+1193.96,1197.81,1201.65,1205.50,1209.35,1213.19,1217.04,1220.88,1224.72,1228.56,    //50~59
+1232.40,1236.24,1240.08,1243.91,1247.75,1251.58,1255.41,1259.24,1263.07,1266.90,    //60~69
+1270.73,1274.56,1278.38,1282.21,1286.03,1289.85,1293.67,1297.49,1301.31,1305.13,    //70~79
+1308.94,1312.76,1316.57,1320.39,1324.20,1328.01,1331.82,1335.62,1339.43,1343.24,    //80~89
+1347.04,1350.85,1354.65,1358.45,1362.25,1366.05,1369.85,1373.64,1377.44,1381.23,    //90~99
+1385.03,1388.82,1392.61,1396.40,1400.19,1403.97,1407.76,1411.54,1415.33,1419.11,    //100~109
+1422.89,1426.67,1430.45,1434.23,1438.01,1441.78,1445.56,1449.33,1453.10,1456.87,    //110~119
+1460.64,1464.41,1468.18,1471.95,1475.71,1479.48,1483.24,1487.00,1490.76,1494.52,    //120~129
+1498.28,1502.04,1505.79,1509.55,1513.30,1517.06,1520.81,1524.56,1528.31,1532.05,    //130~139
+1535.80,1539.55,1543.29,1547.03,1550.78,1554.52,1558.26,1562.00,1565.73,1569.47,    //140~149
+1573.21                                                                             //150
+};
+
+/********************************************
+功能:采用2分查找法,根据电阻值查表计算温度值
+输入:fR,PT1000的电阻值
+输出:fTemp,测量的温度值
+********************************************/
+float CalTemp(float fR)
+{
+    float fTemp;
+    float fLowR;
+    float fHighR;
+    int iTemp;
+    int i;
+    int Top,Bottom;
+    
+    cal_counts=0;
+    
+    if(fR < RTD_TAB_PT1000[0])    //电阻值小于表格最小值
+    {
+        return -50;
+    }
+    
+    if(fR > RTD_TAB_PT1000[200])    //电阻值大于表格最大值
+    {
+        return 150;
+    }
+    
+    Bottom = 0;
+    Top = 200;
+    
+    for(i=100;(Top-Bottom)!=1;)    //2分法查表
+    {
+        if(fR < RTD_TAB_PT1000[i])
+        {
+            Top = i;
+            i = (Top + Bottom) / 2;
+        }
+        else if(fR > RTD_TAB_PT1000[i])
+        {
+            Bottom = i;
+            i = (Top + Bottom) / 2;        
+        }
+        else
+        {
+            iTemp = i - 50;
+            fTemp = (float)iTemp;
+            return fTemp;
+        }    
+        cal_counts++;
+    }
+    
+    iTemp = i - 50;
+    fLowR = RTD_TAB_PT1000[Bottom];
+    fHighR = RTD_TAB_PT1000[Top];
+    fTemp = (fR - fLowR)/(fHighR - fLowR) + iTemp;
+    return fTemp;
+}
+
+    
+    
+    
+    
        
 int main() {
+    //*************************
+    //uint32_t    btr;    
+    //CAN_TypeDef *can = obj->CanHandle.Instance;
+    /*  
+    hcan->Instance->BTR = (uint32_t)((uint32_t)hcan->Init.Mode) | \
+                ((uint32_t)hcan->Init.SJW) | \
+                ((uint32_t)hcan->Init.BS1) | \
+                ((uint32_t)hcan->Init.BS2) | \
+               ((uint32_t)hcan->Init.Prescaler - 1U);
+    */
+    
+    //uint32_t i,num;
+    float ii;
+    
+    
     controller.v_bus = V_BUS;
     controller.mode = 0;
     Init_All_HW(&gpio);                                                         // Setup PWM, ADC, GPIO
@@ -411,7 +528,7 @@
     if(isnan(E_OFFSET)){E_OFFSET = 0.0f;}
     if(isnan(M_OFFSET)){M_OFFSET = 0.0f;}
     if(isnan(I_BW) || I_BW==-1){I_BW = 1000;}
-    if(isnan(I_MAX) || I_MAX ==-1){I_MAX=40;}
+    if(isnan(I_MAX) || I_MAX ==-1){I_MAX=30;}
     if(isnan(I_FW_MAX) || I_FW_MAX ==-1){I_FW_MAX=0;}
     if(isnan(CAN_ID) || CAN_ID==-1){CAN_ID = 1;}
     if(isnan(CAN_MASTER) || CAN_MASTER==-1){CAN_MASTER = 0;}
@@ -424,8 +541,9 @@
     init_controller_params(&controller);
 
     pc.baud(921600);                                                            // set serial baud rate
+    pc.attach(&serial_interrupt);                                               // attach serial interrupt
     wait(.01);
-    pc.printf("\n\r\n\r HobbyKing Cheetah\n\r\n\r");
+    pc.printf("\n\r\n\r GTGJ MOTOR\n\r\n\r");
     wait(.01);
     printf("\n\r Debug Info:\n\r");
     printf(" Firmware Version: %s\n\r", VERSION_NUM);
@@ -435,8 +553,7 @@
     printf(" CAN ID:  %d\n\r", CAN_ID);
     
 
-
-
+//*********
     //printf(" %d\n\r", drv.read_register(DCR));
     //wait_us(100);
     //printf(" %d\n\r", drv.read_register(CSACR));
@@ -444,23 +561,36 @@
     //printf(" %d\n\r", drv.read_register(OCPCR));
     //drv.disable_gd();
     
-    pc.attach(&serial_interrupt);                                               // attach serial interrupt
+//    pc.attach(&serial_interrupt);                                               // attach serial interrupt
     
     state_change = 1;
 
 
-    int counter = 0;
+    //**********************************************************************************************
+    //for(i=800;i<1580;i++)
+    for(ii=1600;ii<3150;ii++)
+    {
+         //printf("%d   %d   %.2f\n\r", ii/2, cal_counts, CalTemp((float)ii/2));    
+         printf("%.1f   %d   %.2f\n\r", ii/2.0f, cal_counts, CalTemp(ii/2.0f));    
+    }
+   
+    //**********************************************************************************************
+
+//    int counter = 0;
     while(1) {
         drv.print_faults();
         wait(.1);
-       //printf("%.4f\n\r", controller.v_bus);
+        //printf("%.4f\n\r", controller.v_bus);
        /*
         if(state == MOTOR_MODE)
         {
             //printf("%.3f  %.3f  %.3f\n\r", (float)observer.temperature, (float)observer.temperature2, observer.resistance);
-            //printf("%.3f  %.3f  %.3f %.3f %.3f\n\r", controller.v_d, controller.v_q, controller.i_d_filt, controller.i_q_filt, controller.dtheta_elec);
-            //printf("%.3f\n\r", controller.dtheta_mech);
-            wait(.002);
+            //printf("%.3f  %.3f  %.3f %.3f %.3f %.3f\n\r", controller.v_d, controller.v_q, controller.i_d_filt, controller.i_q_filt, controller.i_q_ref,controller.dtheta_elec);
+            //printf("%.3f  %.3f  %.3f %.3f %.3f %.3f %.3f %.3f\n\r", controller.i_a, controller.i_b, controller.i_c,controller.theta_elec,controller.i_d, controller.i_q,controller.i_d_filt, controller.i_q_filt);
+            printf("%.3f  %.3f  %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n\r", controller.v_d, controller.v_q, controller.i_d_filt, controller.i_q_filt, controller.i_q_ref,controller.theta_elec,controller.theta_mech, controller.dtheta_mech*GR, controller.i_q_filt*KT_OUT/GR);
+            //printf("%.3f\n\r", controller.dtheta_mech);            
+            //printf("%d   %.4f    %.4f\n\r", spi.GetRawPosition(), spi.GetMechPositionFixed(),spi.GetMechPosition()); 
+            wait(.005);
         }
         */