Pārlūkot izejas kodu

fix:修复采样时序与中断优先级导致的采样尖峰bug

CN\guohui27 2 gadi atpakaļ
vecāks
revīzija
a645523a4f

+ 8 - 8
User project/1.FrameLayer/Source/TimeTask_Event.c

@@ -229,14 +229,14 @@ void Event_10ms(void)
 //        Signal_detect();
       
         /* Use upper computer */
-        if(cp_stFlg.RotateDirectionSelect == ForwardRotate)
-        {
-            uart_slSpdRefRpm = ((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
-        }
-        else if(cp_stFlg.RotateDirectionSelect == BackwardRotate)
-        {
-            uart_slSpdRefRpm = -((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
-        }
+//        if(cp_stFlg.RotateDirectionSelect == ForwardRotate)
+//        {
+//            uart_slSpdRefRpm = ((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
+//        }
+//        else if(cp_stFlg.RotateDirectionSelect == BackwardRotate)
+//        {
+//            uart_slSpdRefRpm = -((SLONG)MC_MotorSPD_rpm_Percent*5000)/100;
+//        }
      
         /* bikespeed closeloop control  */
 //         bikemotorspdref();

+ 78 - 204
User project/1.FrameLayer/Source/gd32f30x_it.c

@@ -132,105 +132,79 @@ void SysTick_Handler(void)
     \param[out] none
     \retval     none
 */
+UWORD tstcccmin=2000, tstcccmax=0,tstccccnt;
 void ADC0_1_IRQHandler(void)
 {
     clasB_uwADCCnt++;
     
-    if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
+    //GPIO_OCTL(GPIOC) |= 0x0800; //TEST PC11
+   
+    if (cp_stFlg.CurrentSampleModelSelect == COMBINATION)
     {
-        static UWORD SampleTrigCount = 0;
-         
-        if (adc_flag_get(ADC1 , ADC_INT_FLAG_EOIC))
-        {
-            switch (SampleTrigCount)
+        if (ADC_STAT(ADC0) & ADC_INT_FLAG_EOIC)
+        {         
+            adc_uwRdsonUReg = ADC_IDATA0(ADC0);
+            adc_uwRdsonVReg = ADC_IDATA1(ADC0);
+            adc_uwRdsonWReg = ADC_IDATA2(ADC0);  
+            
+//            adc_disable(ADC0);            
+//            timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwSigRTrig);
+//            adc_interrupt_flag_clear(ADC0 , ADC_INT_FLAG_EOIC);
+            if(curSpeed_state.state == ClzLoop)
             {
-            /* Get the first current sample and set the sencond Trig time*/
-            case 0:
-                SampleTrigCount = 1;
-                adc_uwADDMAPhase1 = ADC_IDATA0(ADC1);
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwSecondTrigCOMPR);
-                break;
-            /* Get the second current sample and set the first Trig time*/
-            case 1:
-                SampleTrigCount = 0;
-                adc_uwADDMAPhase2 = ADC_IDATA0(ADC1);
-                
-                adc_disable(ADC1);
-                //ADC_StopInjectedConversion(ADC2);
-                break;
-            default:
-                SampleTrigCount = 0;
-                break;
+              tstccccnt ++;
+              if(tstccccnt>100)
+              {
+                tstccccnt = 100;
+                 if(adc_uwRdsonWReg < tstcccmin)
+                 {
+                   tstcccmin = adc_uwRdsonWReg;
+                 }
+                 
+                 if(adc_uwRdsonWReg > tstcccmax)
+                 {
+                   tstcccmax = adc_uwRdsonWReg;
+                 }
+              }
+
+               
             }
-            /* Clear the ADC interrupt flag */
-            adc_interrupt_flag_clear(ADC1 , ADC_INT_FLAG_EOIC);
+             
+            
+            
+            /* ADC0 disable */
+            ADC_CTL1(ADC0) &= ~((uint32_t)ADC_CTL1_ADCON);
+            /* ADC1 trigger set */
+            TIMER_CH3CV(TIMER0) = (uint32_t) pwm_stGenOut.uwSigRTrig;
+             /* ADC1 enable */
+            ADC_CTL1(ADC1) |= (uint32_t)ADC_CTL1_ADCON;
+            /* ADC0 interrupt flag clear */
+            ADC_STAT(ADC0) &= ~((uint32_t)ADC_INT_FLAG_EOIC);
         }
-    }
-    else if(cp_stFlg.CurrentSampleModelSelect == RDSON)
-    {
-        if (adc_flag_get(ADC0, ADC_INT_FLAG_EOIC))
-        {
-            if ((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0)
+        else if (ADC_STAT(ADC1) & ADC_INT_FLAG_EOIC)
+        {         
+            if (pwm_stGenOut.blSampleCalibFlag == TRUE)
             {
-                adc_uwRdsonUReg = ADC_IDATA0(ADC0);
-                adc_uwRdsonVReg = ADC_IDATA1(ADC0);
-                adc_uwRdsonWReg = ADC_IDATA2(ADC0);
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwRDSONTrig);
+                adc_uwADDMAPhase1 = ADC_IDATA0(ADC1);
             }
-            adc_interrupt_flag_clear(ADC0 , ADC_INT_FLAG_EOIC);
-        }
-    }
-    else if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
-    {
-        if (adc_flag_get(ADC0, ADC_INT_FLAG_EOIC))
-        {
-            //GPIO_OCTL(GPIOC) |= 0x0800; //TEST PC10
-          
-            if ((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0)
-            {
-                adc_uwRdsonUReg = ADC_IDATA0(ADC0);
-                adc_uwRdsonVReg = ADC_IDATA1(ADC0);
-                adc_uwRdsonWReg = ADC_IDATA2(ADC0); 
-                /* CH3 set to Frozen */
-                TIMER_CHCTL1(TIMER0) &= ~0x7000;
-                /* CH3 set to PWMMODE0 */
-                TIMER_CHCTL1(TIMER0) |= 0x6000;
-                
-                
-            }                     
-            
-            adc_interrupt_flag_clear(ADC0 , ADC_INT_FLAG_EOIC);
             
-           //GPIO_OCTL(GPIOC) &= ~0x0800; //TEST PC10 
-        }
+//            adc_disable(ADC1);              
+//            adc_interrupt_flag_clear(ADC1 , ADC_INT_FLAG_EOIC);
 
-        if (adc_flag_get(ADC1, ADC_INT_FLAG_EOIC))
+            /* ADC1 disable */
+            ADC_CTL1(ADC1) &= ~((uint32_t)ADC_CTL1_ADCON);
+            /* ADC1 interrupt flag clear */
+            ADC_STAT(ADC1) &= ~((uint32_t)ADC_INT_FLAG_EOIC); 
+        }
+        else
         {
-           //GPIO_OCTL(GPIOC) |= 0x0400; //TEST PC11
-          
-           if ((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) != 0)
-           {
-              if (pwm_stGenOut.blSampleCalibFlag == TRUE)
-              {
-                  adc_uwADDMAPhase1 = ADC_IDATA0(ADC1);
-              }
-              /* CH3 set to Frozen */
-              TIMER_CHCTL1(TIMER0) &= ~0x7000;
-              /* CH3 set to PWMMODE0 */
-              TIMER_CHCTL1(TIMER0) |= 0x7000;
-              
-              adc_disable(ADC1);
-              
-           }
-            
-           adc_interrupt_flag_clear(ADC1 , ADC_INT_FLAG_EOIC);
-           
-           //GPIO_OCTL(GPIOC) &= ~0x0400; //TEST PC11
         }
     }
     else
-    {} 
-
+    {
+    }
+    
+    //GPIO_OCTL(GPIOC) &= ~0x0800; //TEST PC11
 }
 
 /*!
@@ -239,144 +213,42 @@ void ADC0_1_IRQHandler(void)
     \param[out] none
     \retval     none
 */
-
-UWORD tst_DMAStartCt = 0;
-UWORD tst_DMAStartFlag = 0;
-UWORD tmpSigTrigZ1 = 500;
 void TIMER0_UP_TIMER9_IRQHandler(void)
 {   
-    ///////////////
+    ULONG OVtimeCnt = 0;
+    
     clasB_uwTIM0Cnt ++;
      
-    if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
-    {
-      ULONG OVtimeCnt = 0;
-        if(timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP))
-        {
-            if((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0) // When Counting Up
-            {
-                /*Resolver lock data*/
-                spi_voResolverLock();
-
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwFirstTrigCOMPR);
-                /* TBC Up interrupt */
-                tbc_voUpIsr();
-            }
-            else
-            {             
-                TIMER_CNT(TIMER6) = 0;
-                /* TBC Down interrupt */
-                tbc_voDownIsr();
-                while ((TIMER_CNT(TIMER6) < HW_PWM_PERIOD) && (OVtimeCnt < HW_HHPWM_PERIOD * FPWM_HZ))
-                {
-                    OVtimeCnt++;
-                };
-                  
-//                ADC_StartInjectedConversion(ADC2);
-//                ADC_StartConversion(ADC1);
-//                ADC_StartConversion(ADC2);
-                adc_enable(ADC1);
-                adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);                
-                
-                /* Compara value load */       
-                hw_uwPWMCmpr[0] = pwm_stGenOut.uwNewTIM1COMPR[0];
-                hw_uwPWMCmpr[1] = pwm_stGenOut.uwNewTIM1COMPR[1];
-                hw_uwPWMCmpr[2] = pwm_stGenOut.uwNewTIM1COMPR[2];
-                hw_uwPWMCmpr[3] = pwm_stGenOut.uwNewTIM1COMPR[3];
-                hw_uwPWMCmpr[4] = pwm_stGenOut.uwNewTIM1COMPR[4];
-                hw_uwPWMCmpr[5] = pwm_stGenOut.uwNewTIM1COMPR[5];
-                
-                timer_dma_enable(TIMER0,TIMER_DMA_UPD);
-                dma_channel_enable(DMA0,DMA_CH4);
-                
-            }
-            timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
-        }
-    }
-    if(cp_stFlg.CurrentSampleModelSelect == RDSON)
-    {
-        ULONG OVtimeCnt = 0;
-        if(timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP))
-        {
-            if((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0) // When Counting Up
-            {
-                /*Resolver lock data*/
-                spi_voResolverLock();
-
-                adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);  
-                tbc_voUpIsr();
-                
-            }
-            else
-            {
-                TIMER_CNT(TIMER6) = 0;
-                /* TBC Down interrupt */
-                tbc_voDownIsr();
-                while ((TIMER_CNT(TIMER6) < HW_PWM_PERIOD) && (OVtimeCnt < HW_HHPWM_PERIOD * FPWM_HZ))
-                {
-                    OVtimeCnt++;
-                };
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3,  pwm_stGenOut.uwRDSONTrig);
-                
-                
-                /* Compara value load */       
-                hw_uwPWMCmpr[0] = pwm_stGenOut.uwNewTIM1COMPR[0];
-                hw_uwPWMCmpr[1] = pwm_stGenOut.uwNewTIM1COMPR[1];
-                hw_uwPWMCmpr[2] = pwm_stGenOut.uwNewTIM1COMPR[2];
-                hw_uwPWMCmpr[3] = pwm_stGenOut.uwNewTIM1COMPR[3];
-                hw_uwPWMCmpr[4] = pwm_stGenOut.uwNewTIM1COMPR[4];
-                hw_uwPWMCmpr[5] = pwm_stGenOut.uwNewTIM1COMPR[5];
-                
-                timer_dma_enable(TIMER0,TIMER_DMA_UPD);
-                dma_channel_enable(DMA0,DMA_CH4);
-            }
-        }
-        timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
-    }
     if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
-    {
-        ULONG OVtimeCnt = 0;
-        if(timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP))
-        {
-            
+    {      
+        if(TIMER_INTF(TIMER0) & TIMER_INT_FLAG_UP)
+        {           
             if((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0) // When Counting Up
             { 
-                 adc_enable(ADC0);
-               // adc_interrupt_enable(ADC0 , ADC_INT_EOIC);
-               //adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
-                
-                /* Software trigger for regular sampling*/
-                adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); 
-              
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, pwm_stGenOut.uwRDSONTrig);
-
                 /* TBC Up interrupt */
                 tbc_voUpIsr();             
             }
             else
-            {
-                adc_disable(ADC0);
-                //adc_interrupt_disable(ADC0 , ADC_INT_EOIC);
-                //adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, DISABLE);
-              
-              
-                
-                             
-                TIMER_CNT(TIMER6) = 0;
+            {               
+                TIMER_CNT(TIMER6) = 0;               
                 
                 /* TBC Down interrupt */
                 tbc_voDownIsr();
                 
-                while ((TIMER_CNT(TIMER6) < HW_PWM_PERIOD) && (OVtimeCnt < HW_HHPWM_PERIOD * FPWM_HZ))
+                while ((TIMER_CNT(TIMER6) < HW_PWM_PERIOD) && (OVtimeCnt < 10000))
                 {
                     OVtimeCnt++;
                 };
                 
-                /* ADC1 trigger for Ibus sampling*/
-                adc_enable(ADC1);                
-                timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, tmpSigTrigZ1);
-                tmpSigTrigZ1 =  pwm_stGenOut.uwSigRTrig;            
+                /* ADC0 trigger set */
+                TIMER_CH3CV(TIMER0) = (uint32_t) pwm_stGenOut.uwRDSONTrig;
+                adc_enable(ADC0);
+                // adc_interrupt_enable(ADC0 , ADC_INT_EOIC);
+                //adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
 
+                /* Software trigger for regular sampling*/
+                adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); 
+                
                 /* Compara value load */    
                 hw_uwPWMCmpr[0] = pwm_stGenOut.uwNewTIM1COMPR[0];
                 hw_uwPWMCmpr[1] = pwm_stGenOut.uwNewTIM1COMPR[1];
@@ -385,10 +257,12 @@ void TIMER0_UP_TIMER9_IRQHandler(void)
                 hw_uwPWMCmpr[4] = pwm_stGenOut.uwNewTIM1COMPR[4];
                 hw_uwPWMCmpr[5] = pwm_stGenOut.uwNewTIM1COMPR[5];               
                 timer_dma_enable(TIMER0,TIMER_DMA_UPD);
-                dma_channel_enable(DMA0,DMA_CH4);
+                dma_channel_enable(DMA0,DMA_CH4);  
+
             }
-        }
-        timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
+        } 
+        //timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
+        TIMER_INTF(TIMER0) = (~(uint32_t)TIMER_INT_FLAG_UP);
     }
     else
     {

+ 33 - 34
User project/2.MotorDrive/Source/adc.c

@@ -56,63 +56,66 @@ void adc_voCalibration(ADC_COF *cof, ADC_DOWN_OUT *out1, ADC_UP_OUT *out2)
         }
         else
         {
-            if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
+            if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
             {
+                pwm_stGenOut.uwRDSONTrig = 129; 
+                pwm_stGenOut.uwSigRTrig = HW_HHHPWM_PERIOD;
+                pwm_stGenOut.blSampleCalibFlag = TRUE;
                 if (out1->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
                 {
-                    out1->ulIdcRegSum += adc_uwADDMAPhase1 + adc_uwADDMAPhase2;
+                    out1->ulIdcRegSum += adc_uwADDMAPhase1;
+                    out1->ulIaRegSum += adc_uwRdsonUReg;
+                    out1->ulIbRegSum += adc_uwRdsonVReg;
+                    out1->ulIcRegSum += adc_uwRdsonWReg;
                     out1->uwADCCalibCt++;
                 }
-                else if (out2->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
-                {
-                    out2->uwADCCalibCt++;
-                }
                 else
                 {
-                    hw_voPWMInit();
-                    cof->uwIdcOffset = out1->ulIdcRegSum >> (ADC_CALIB_INDEX + 1);
+                    hw_voPWMInit(); // mos up charge and adc calib over; pwm off
+                    cof->uwIaOffset = out1->ulIaRegSum >> (ADC_CALIB_INDEX);
+                    cof->uwIbOffset = out1->ulIbRegSum >> (ADC_CALIB_INDEX);
+                    cof->uwIcOffset = out1->ulIcRegSum >> (ADC_CALIB_INDEX);
+
+                    out1->ulIaRegSum = 0;
+                    out1->ulIbRegSum = 0;
+                    out1->ulIcRegSum = 0;
+
+                    pwm_stGenOut.blSampleCalibFlag = FALSE;
+                    cof->uwIdcOffset = out1->ulIdcRegSum >> (ADC_CALIB_INDEX);
                     out1->ulIdcRegSum = 0;
+
                     out1->uwADCCalibCt = 0;
                     out1->blADCCalibFlg = TRUE;
                     out2->uwADCCalibCt = 0;
                     out2->blADCCalibFlg = TRUE;
                 }
             }
-            else if(cp_stFlg.CurrentSampleModelSelect == RDSON)
+            else if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
             {
                 if (out1->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
                 {
-                    out1->ulIaRegSum += adc_uwRdsonUReg;
-                    out1->ulIbRegSum += adc_uwRdsonVReg;
-                    out1->ulIcRegSum += adc_uwRdsonWReg;
+                    out1->ulIdcRegSum += adc_uwADDMAPhase1 + adc_uwADDMAPhase2;
                     out1->uwADCCalibCt++;
                 }
+                else if (out2->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
+                {
+                    out2->uwADCCalibCt++;
+                }
                 else
                 {
                     hw_voPWMInit();
-                    
-                    cof->uwIaOffset = out1->ulIaRegSum >> (ADC_CALIB_INDEX);
-                    cof->uwIbOffset = out1->ulIbRegSum >> (ADC_CALIB_INDEX);
-                    cof->uwIcOffset = out1->ulIcRegSum >> (ADC_CALIB_INDEX);
-
-                    out1->ulIaRegSum = 0;
-                    out1->ulIbRegSum = 0;
-                    out1->ulIcRegSum = 0;
+                    cof->uwIdcOffset = out1->ulIdcRegSum >> (ADC_CALIB_INDEX + 1);
+                    out1->ulIdcRegSum = 0;
                     out1->uwADCCalibCt = 0;
                     out1->blADCCalibFlg = TRUE;
                     out2->uwADCCalibCt = 0;
                     out2->blADCCalibFlg = TRUE;
                 }
             }
-            else if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
+            else if(cp_stFlg.CurrentSampleModelSelect == RDSON)
             {
-//                pwm_stGenOut.uwRDSONTrig = 108;  
-                pwm_stGenOut.uwRDSONTrig = 129; 
-                pwm_stGenOut.uwSigRTrig = HW_HHHPWM_PERIOD;
-                pwm_stGenOut.blSampleCalibFlag = TRUE;
                 if (out1->uwADCCalibCt < (1 << ADC_CALIB_INDEX))
                 {
-                    out1->ulIdcRegSum += adc_uwADDMAPhase1;
                     out1->ulIaRegSum += adc_uwRdsonUReg;
                     out1->ulIbRegSum += adc_uwRdsonVReg;
                     out1->ulIcRegSum += adc_uwRdsonWReg;
@@ -120,7 +123,8 @@ void adc_voCalibration(ADC_COF *cof, ADC_DOWN_OUT *out1, ADC_UP_OUT *out2)
                 }
                 else
                 {
-                    hw_voPWMInit(); // mos up charge and adc calib over; pwm off
+                    hw_voPWMInit();
+                    
                     cof->uwIaOffset = out1->ulIaRegSum >> (ADC_CALIB_INDEX);
                     cof->uwIbOffset = out1->ulIbRegSum >> (ADC_CALIB_INDEX);
                     cof->uwIcOffset = out1->ulIcRegSum >> (ADC_CALIB_INDEX);
@@ -128,11 +132,6 @@ void adc_voCalibration(ADC_COF *cof, ADC_DOWN_OUT *out1, ADC_UP_OUT *out2)
                     out1->ulIaRegSum = 0;
                     out1->ulIbRegSum = 0;
                     out1->ulIcRegSum = 0;
-
-                    pwm_stGenOut.blSampleCalibFlag = FALSE;
-                    cof->uwIdcOffset = out1->ulIdcRegSum >> (ADC_CALIB_INDEX);
-                    out1->ulIdcRegSum = 0;
-
                     out1->uwADCCalibCt = 0;
                     out1->blADCCalibFlg = TRUE;
                     out2->uwADCCalibCt = 0;
@@ -272,8 +271,8 @@ void adc_voSampleDown(ADC_COF *cof, ADC_DOWN_OUT *out)
 
         out->slSampIaPu = -((SLONG)((SLONG)out->uwIaReg - (SLONG)cof->uwIaOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
         out->slSampIbPu = -((SLONG)((SLONG)out->uwIbReg - (SLONG)cof->uwIbOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
-        out->slSampIcPu = -out->slSampIaPu - out->slSampIbPu;   //-((SLONG)((SLONG)out->uwIcReg - (SLONG)cof->uwIcOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
-//      cof->uwCalibcoef = 1500;
+        out->slSampIcPu = -((SLONG)((SLONG)out->uwIcReg - (SLONG)cof->uwIcOffset) * cof->uwCurReg2Pu >> 10); // Q14=Q24-Q10
+        cof->uwCalibcoef = 1048;
         out->swIaPu = ((SLONG)out->slSampIaPu * cof->uwCalibcoef) >> 10;
         out->swIbPu = ((SLONG)out->slSampIbPu * cof->uwCalibcoef) >> 10;
         out->swIcPu = ((SLONG)out->slSampIcPu * cof->uwCalibcoef) >> 10;

+ 223 - 230
User project/2.MotorDrive/Source/pwm.c

@@ -80,7 +80,6 @@ void pwm_voInit(void)
     pwm_stGenOut.uwOldTrig = 0;
     pwm_stGenOut.uwNewTrig = 0;
     pwm_stGenOut.uwSampleArea = IgnoreNone;
-//    pwm_stGenOut.uwRDSONTrig = 108;
     pwm_stGenOut.uwRDSONTrig = 129;
     pwm_stGenOut.uwSigRTrig = HW_HHHPWM_PERIOD;
 }
@@ -357,7 +356,229 @@ void pwm_voGen(PWM_GEN_IN *in, PWM_CALC_COF *coef, PWM_GEN_OUT *out)
         break;
     }
 
-    if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
+    if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
+    {
+         /*================================================================
+                            Calculate compare value
+        ================================================================*/
+        if ((swOvmT1 + swOvmT2) > coef->swPWM7To5DutyPu) /* Five SVPWM */
+        {
+            swPWMPRD1 = coef->uwHPWMPd;
+            swPWMPRD2 = ((ULONG)(16384 - swOvmT2) * coef->uwHPWMPd) >> 14;
+            swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHPWMPd) >> 14;
+        }
+        else /* Seven SVPWM */
+        {
+            swPWMPRD1 = ((ULONG)(16384 + swOvmT1 + swOvmT2) * coef->uwHHPWMPd) >> 14;
+            swPWMPRD2 = ((ULONG)(16384 + swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
+            swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
+        }
+
+        if (swOvmT2 > coef->swPWMMinSample3Pu)
+        {
+            out->blSampleCalibFlag = TRUE;
+            //out->uwSigRTrig = swPWMPRD2 + coef->uwSingelResisSampleCt;
+            out->uwSigRTrig = swPWMPRD1 - coef->uwSingelResisSampleCt;
+        }
+        else
+        {
+            out->blSampleCalibFlag = FALSE;
+            out->uwSigRTrig = HW_HHHPWM_PERIOD;
+        }
+
+        out->uwSingelRSampleAreaLast = out->uwSingelRSampleArea;
+        if(1)//hw_blChrgOvrFlg == TRUE)
+        {
+        switch (uwSector)
+        {
+        case 3:
+            out->uwNewTIM1COMPR[0] = swPWMPRD3;
+            out->uwNewTIM1COMPR[1] = swPWMPRD2;
+            out->uwNewTIM1COMPR[2] = swPWMPRD1;
+            out->uwNewTIM1COMPR[3] = swPWMPRD3;
+            out->uwNewTIM1COMPR[4] = swPWMPRD2;
+            out->uwNewTIM1COMPR[5] = swPWMPRD1;
+            if (out->blSampleCalibFlag == TRUE)
+            {
+                out->uwSingelRSampleArea = SampleC;
+            }
+            else
+            {
+                out->uwSingelRSampleArea = SampleNone;
+            }
+            break;
+        case 1:
+            out->uwNewTIM1COMPR[0] = swPWMPRD2;
+            out->uwNewTIM1COMPR[1] = swPWMPRD3;
+            out->uwNewTIM1COMPR[2] = swPWMPRD1;
+            out->uwNewTIM1COMPR[3] = swPWMPRD2;
+            out->uwNewTIM1COMPR[4] = swPWMPRD3;
+            out->uwNewTIM1COMPR[5] = swPWMPRD1;
+            if (out->blSampleCalibFlag == TRUE)
+            {
+                out->uwSingelRSampleArea = SampleC;
+            }
+            else
+            {
+                out->uwSingelRSampleArea = SampleNone;
+            }
+            break;
+        case 5:
+            out->uwNewTIM1COMPR[0] = swPWMPRD1;
+            out->uwNewTIM1COMPR[1] = swPWMPRD3;
+            out->uwNewTIM1COMPR[2] = swPWMPRD2;
+            out->uwNewTIM1COMPR[3] = swPWMPRD1;
+            out->uwNewTIM1COMPR[4] = swPWMPRD3;
+            out->uwNewTIM1COMPR[5] = swPWMPRD2;
+            if (out->blSampleCalibFlag == TRUE)
+            {
+                out->uwSingelRSampleArea = SampleA;
+            }
+            else
+            {
+                out->uwSingelRSampleArea = SampleNone;
+            }
+            break;
+        case 4:
+            out->uwNewTIM1COMPR[0] = swPWMPRD1;
+            out->uwNewTIM1COMPR[1] = swPWMPRD2;
+            out->uwNewTIM1COMPR[2] = swPWMPRD3;
+            out->uwNewTIM1COMPR[3] = swPWMPRD1;
+            out->uwNewTIM1COMPR[4] = swPWMPRD2;
+            out->uwNewTIM1COMPR[5] = swPWMPRD3;
+            if (out->blSampleCalibFlag == TRUE)
+            {
+                out->uwSingelRSampleArea = SampleA;
+            }
+            else
+            {
+                out->uwSingelRSampleArea = SampleNone;
+            }
+            break;
+        case 6:
+            out->uwNewTIM1COMPR[0] = swPWMPRD2;
+            out->uwNewTIM1COMPR[1] = swPWMPRD1;
+            out->uwNewTIM1COMPR[2] = swPWMPRD3;
+            out->uwNewTIM1COMPR[3] = swPWMPRD2;
+            out->uwNewTIM1COMPR[4] = swPWMPRD1;
+            out->uwNewTIM1COMPR[5] = swPWMPRD3;
+            if (out->blSampleCalibFlag == TRUE)
+            {
+                out->uwSingelRSampleArea = SampleB;
+            }
+            else
+            {
+                out->uwSingelRSampleArea = SampleNone;
+            }
+            break;
+        case 2:
+            out->uwNewTIM1COMPR[0] = swPWMPRD3;
+            out->uwNewTIM1COMPR[1] = swPWMPRD1;
+            out->uwNewTIM1COMPR[2] = swPWMPRD2;
+            out->uwNewTIM1COMPR[3] = swPWMPRD3;
+            out->uwNewTIM1COMPR[4] = swPWMPRD1;
+            out->uwNewTIM1COMPR[5] = swPWMPRD2;
+            if (out->blSampleCalibFlag == TRUE)
+            {
+                out->uwSingelRSampleArea = SampleB;
+            }
+            else
+            {
+                out->uwSingelRSampleArea = SampleNone;
+            }
+            break;
+        default:
+            out->uwNewTIM1COMPR[0] = coef->uwHHPWMPd;
+            out->uwNewTIM1COMPR[1] = coef->uwHHPWMPd;
+            out->uwNewTIM1COMPR[2] = coef->uwHHPWMPd;
+            out->uwNewTIM1COMPR[3] = coef->uwHHPWMPd;
+            out->uwNewTIM1COMPR[4] = coef->uwHHPWMPd;
+            out->uwNewTIM1COMPR[5] = coef->uwHHPWMPd;
+            out->uwSingelRSampleArea = SampleNone;
+            break;
+        }
+        }
+        /* Calculate actual output voltage */
+        out->uwNewSectorNum = uwSector;
+        out->uwPWMNewSectorNum = out->uwNewSectorNum;
+
+        tmp_swPeriodA = coef->uwPWMPd - out->uwNewTIM1COMPR[0] - out->uwNewTIM1COMPR[3];
+        tmp_swPeriodB = coef->uwPWMPd - out->uwNewTIM1COMPR[1] - out->uwNewTIM1COMPR[4];
+        tmp_swPeriodC = coef->uwPWMPd - out->uwNewTIM1COMPR[2] - out->uwNewTIM1COMPR[5];
+
+        swUaPu = ((((SLONG)tmp_swPeriodA * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
+        swUbPu = ((((SLONG)tmp_swPeriodB * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
+        swUcPu = ((((SLONG)tmp_swPeriodC * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
+
+        out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
+        out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14;                // Q14=Q14+Q14-Q14
+
+        //    if((16384-swOvmT1-swOvmT2)>coef->swPWMMinSample1Pu)
+        //    {
+        //      out->uwSampleArea = IgnoreNone;
+        out->uwRDSONTrig = 129;
+        //    }
+        //    else
+        //    {
+        //      if(swOvmT1>coef->swPWMMinSample1Pu)
+        //      {
+        //        switch(uwSector)
+        //        {
+        //            case 3:
+        //                out->uwSampleArea = IgnoreA;
+        //                break;
+        //            case 1:
+        //                out->uwSampleArea = IgnoreB;
+        //                break;
+        //            case 5:
+        //                out->uwSampleArea = IgnoreB;
+        //                break;
+        //            case 4:
+        //                out->uwSampleArea = IgnoreC;
+        //                break;
+        //            case 6:
+        //                out->uwSampleArea = IgnoreC;
+        //                break;
+        //            case 2:
+        //                out->uwSampleArea = IgnoreA;
+        //                break;
+        //            default:
+        //                out->uwSampleArea = IgnoreNone;
+        //                break;
+        //        }
+        //        out->uwRDSONTrig = swPWMPRD3 + coef->uwSampleSteadyCt;
+        //      }
+        //      else
+        //      {
+        //        switch(uwSector)
+        //        {
+        //            case 3:
+        //                out->uwSampleArea = IgnoreAB;
+        //                break;
+        //            case 1:
+        //                out->uwSampleArea = IgnoreAB;
+        //                break;
+        //            case 5:
+        //                out->uwSampleArea = IgnoreBC;
+        //                break;
+        //            case 4:
+        //                out->uwSampleArea = IgnoreBC;
+        //                break;
+        //            case 6:
+        //                out->uwSampleArea = IgnoreAC;
+        //                break;
+        //            case 2:
+        //                out->uwSampleArea = IgnoreAC;
+        //                break;
+        //            default:
+        //                out->uwSampleArea = IgnoreNone;
+        //                break;
+        //        }
+        //      out->uwRDSONTrig = swPWMPRD2 + coef->uwSampleSteadyCt;
+        //      }
+        //    }
+    }    
+    else if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
     {
         SWORD swPWMPRD11=0;
         SWORD swPWMPRD21=0;
@@ -645,7 +866,6 @@ void pwm_voGen(PWM_GEN_IN *in, PWM_CALC_COF *coef, PWM_GEN_OUT *out)
         if ((16384 - swOvmT1 - swOvmT2) > coef->swPWMMinSample1Pu)
         {
             out->uwSampleArea = IgnoreNone;
-           // out->uwRDSONTrig = 108;
             out->uwRDSONTrig = 129;
         }
         else
@@ -708,233 +928,6 @@ void pwm_voGen(PWM_GEN_IN *in, PWM_CALC_COF *coef, PWM_GEN_OUT *out)
             }
         }
     }
-    else if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
-    {
-         /*================================================================
-                            Calculate compare value
-        ================================================================*/
-        if ((swOvmT1 + swOvmT2) > coef->swPWM7To5DutyPu) /* Five SVPWM */
-        {
-            swPWMPRD1 = coef->uwHPWMPd;
-            swPWMPRD2 = ((ULONG)(16384 - swOvmT2) * coef->uwHPWMPd) >> 14;
-            swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHPWMPd) >> 14;
-        }
-        else /* Seven SVPWM */
-        {
-            swPWMPRD1 = ((ULONG)(16384 + swOvmT1 + swOvmT2) * coef->uwHHPWMPd) >> 14;
-            swPWMPRD2 = ((ULONG)(16384 + swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
-            swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
-        }
-
-        if (swOvmT2 > coef->swPWMMinSample3Pu)
-        {
-            out->blSampleCalibFlag = TRUE;
-            out->uwSigRTrig = swPWMPRD2 + coef->uwSingelResisSampleCt;
-        }
-        //    else if(swOvmT1>coef->swPWMMinSample3Pu)
-        //    {
-        //      out->blSampleCalibFlag = TRUE;
-        //      out->uwSigRTrig = swPWMPRD3 - coef->uwSingelResisSampleCt;
-        //    }
-        else
-        {
-            out->blSampleCalibFlag = FALSE;
-            out->uwSigRTrig = HW_HHHPWM_PERIOD;
-        }
-
-        out->uwSingelRSampleAreaLast = out->uwSingelRSampleArea;
-        if(1)//hw_blChrgOvrFlg == TRUE)
-        {
-        switch (uwSector)
-        {
-        case 3:
-            out->uwNewTIM1COMPR[0] = swPWMPRD3;
-            out->uwNewTIM1COMPR[1] = swPWMPRD2;
-            out->uwNewTIM1COMPR[2] = swPWMPRD1;
-            out->uwNewTIM1COMPR[3] = swPWMPRD3;
-            out->uwNewTIM1COMPR[4] = swPWMPRD2;
-            out->uwNewTIM1COMPR[5] = swPWMPRD1;
-            if (out->blSampleCalibFlag == TRUE)
-            {
-                out->uwSingelRSampleArea = SampleC;
-            }
-            else
-            {
-                out->uwSingelRSampleArea = SampleNone;
-            }
-            break;
-        case 1:
-            out->uwNewTIM1COMPR[0] = swPWMPRD2;
-            out->uwNewTIM1COMPR[1] = swPWMPRD3;
-            out->uwNewTIM1COMPR[2] = swPWMPRD1;
-            out->uwNewTIM1COMPR[3] = swPWMPRD2;
-            out->uwNewTIM1COMPR[4] = swPWMPRD3;
-            out->uwNewTIM1COMPR[5] = swPWMPRD1;
-            if (out->blSampleCalibFlag == TRUE)
-            {
-                out->uwSingelRSampleArea = SampleC;
-            }
-            else
-            {
-                out->uwSingelRSampleArea = SampleNone;
-            }
-            break;
-        case 5:
-            out->uwNewTIM1COMPR[0] = swPWMPRD1;
-            out->uwNewTIM1COMPR[1] = swPWMPRD3;
-            out->uwNewTIM1COMPR[2] = swPWMPRD2;
-            out->uwNewTIM1COMPR[3] = swPWMPRD1;
-            out->uwNewTIM1COMPR[4] = swPWMPRD3;
-            out->uwNewTIM1COMPR[5] = swPWMPRD2;
-            if (out->blSampleCalibFlag == TRUE)
-            {
-                out->uwSingelRSampleArea = SampleA;
-            }
-            else
-            {
-                out->uwSingelRSampleArea = SampleNone;
-            }
-            break;
-        case 4:
-            out->uwNewTIM1COMPR[0] = swPWMPRD1;
-            out->uwNewTIM1COMPR[1] = swPWMPRD2;
-            out->uwNewTIM1COMPR[2] = swPWMPRD3;
-            out->uwNewTIM1COMPR[3] = swPWMPRD1;
-            out->uwNewTIM1COMPR[4] = swPWMPRD2;
-            out->uwNewTIM1COMPR[5] = swPWMPRD3;
-            if (out->blSampleCalibFlag == TRUE)
-            {
-                out->uwSingelRSampleArea = SampleA;
-            }
-            else
-            {
-                out->uwSingelRSampleArea = SampleNone;
-            }
-            break;
-        case 6:
-            out->uwNewTIM1COMPR[0] = swPWMPRD2;
-            out->uwNewTIM1COMPR[1] = swPWMPRD1;
-            out->uwNewTIM1COMPR[2] = swPWMPRD3;
-            out->uwNewTIM1COMPR[3] = swPWMPRD2;
-            out->uwNewTIM1COMPR[4] = swPWMPRD1;
-            out->uwNewTIM1COMPR[5] = swPWMPRD3;
-            if (out->blSampleCalibFlag == TRUE)
-            {
-                out->uwSingelRSampleArea = SampleB;
-            }
-            else
-            {
-                out->uwSingelRSampleArea = SampleNone;
-            }
-            break;
-        case 2:
-            out->uwNewTIM1COMPR[0] = swPWMPRD3;
-            out->uwNewTIM1COMPR[1] = swPWMPRD1;
-            out->uwNewTIM1COMPR[2] = swPWMPRD2;
-            out->uwNewTIM1COMPR[3] = swPWMPRD3;
-            out->uwNewTIM1COMPR[4] = swPWMPRD1;
-            out->uwNewTIM1COMPR[5] = swPWMPRD2;
-            if (out->blSampleCalibFlag == TRUE)
-            {
-                out->uwSingelRSampleArea = SampleB;
-            }
-            else
-            {
-                out->uwSingelRSampleArea = SampleNone;
-            }
-            break;
-        default:
-            out->uwNewTIM1COMPR[0] = coef->uwHHPWMPd;
-            out->uwNewTIM1COMPR[1] = coef->uwHHPWMPd;
-            out->uwNewTIM1COMPR[2] = coef->uwHHPWMPd;
-            out->uwNewTIM1COMPR[3] = coef->uwHHPWMPd;
-            out->uwNewTIM1COMPR[4] = coef->uwHHPWMPd;
-            out->uwNewTIM1COMPR[5] = coef->uwHHPWMPd;
-            out->uwSingelRSampleArea = SampleNone;
-            break;
-        }
-        }
-        /* Calculate actual output voltage */
-        out->uwNewSectorNum = uwSector;
-        out->uwPWMNewSectorNum = out->uwNewSectorNum;
-
-        tmp_swPeriodA = coef->uwPWMPd - out->uwNewTIM1COMPR[0] - out->uwNewTIM1COMPR[3];
-        tmp_swPeriodB = coef->uwPWMPd - out->uwNewTIM1COMPR[1] - out->uwNewTIM1COMPR[4];
-        tmp_swPeriodC = coef->uwPWMPd - out->uwNewTIM1COMPR[2] - out->uwNewTIM1COMPR[5];
-
-        swUaPu = ((((SLONG)tmp_swPeriodA * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
-        swUbPu = ((((SLONG)tmp_swPeriodB * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
-        swUcPu = ((((SLONG)tmp_swPeriodC * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
-
-        out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
-        out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14;                // Q14=Q14+Q14-Q14
-
-        //    if((16384-swOvmT1-swOvmT2)>coef->swPWMMinSample1Pu)
-        //    {
-        //      out->uwSampleArea = IgnoreNone;
-       // out->uwRDSONTrig = 108;
-        out->uwRDSONTrig = 129 ;
-        //    }
-        //    else
-        //    {
-        //      if(swOvmT1>coef->swPWMMinSample1Pu)
-        //      {
-        //        switch(uwSector)
-        //        {
-        //            case 3:
-        //                out->uwSampleArea = IgnoreA;
-        //                break;
-        //            case 1:
-        //                out->uwSampleArea = IgnoreB;
-        //                break;
-        //            case 5:
-        //                out->uwSampleArea = IgnoreB;
-        //                break;
-        //            case 4:
-        //                out->uwSampleArea = IgnoreC;
-        //                break;
-        //            case 6:
-        //                out->uwSampleArea = IgnoreC;
-        //                break;
-        //            case 2:
-        //                out->uwSampleArea = IgnoreA;
-        //                break;
-        //            default:
-        //                out->uwSampleArea = IgnoreNone;
-        //                break;
-        //        }
-        //        out->uwRDSONTrig = swPWMPRD3 + coef->uwSampleSteadyCt;
-        //      }
-        //      else
-        //      {
-        //        switch(uwSector)
-        //        {
-        //            case 3:
-        //                out->uwSampleArea = IgnoreAB;
-        //                break;
-        //            case 1:
-        //                out->uwSampleArea = IgnoreAB;
-        //                break;
-        //            case 5:
-        //                out->uwSampleArea = IgnoreBC;
-        //                break;
-        //            case 4:
-        //                out->uwSampleArea = IgnoreBC;
-        //                break;
-        //            case 6:
-        //                out->uwSampleArea = IgnoreAC;
-        //                break;
-        //            case 2:
-        //                out->uwSampleArea = IgnoreAC;
-        //                break;
-        //            default:
-        //                out->uwSampleArea = IgnoreNone;
-        //                break;
-        //        }
-        //      out->uwRDSONTrig = swPWMPRD2 + coef->uwSampleSteadyCt;
-        //      }
-        //    }
-    }
     else
     {}  
 

+ 20 - 12
User project/2.MotorDrive/Source/spdctrmode.c

@@ -703,7 +703,7 @@ void  scm_voSpdCtrMdDownTbc(void)
     /*=======================================================================
                             Id current PI control
     =======================================================================*/
-    DCPswitch = 0;           //0 with forwardFeedBack    1 without forwardFeedBack
+    //DCPswitch = 0;           //0 with forwardFeedBack    1 without forwardFeedBack
       
     acr_stCurIdPIIn.swCurRefPu = scm_swIdRefPu; // Q14
     acr_stCurIdPIIn.swCurFdbPu = scm_swIdFdbLpfPu;
@@ -725,7 +725,7 @@ void  scm_voSpdCtrMdDownTbc(void)
 
     /*=======================================================================
                             Iq current PI control
-    =======================================================================*/
+    =======================================================================*/   
     acr_stCurIqPIIn.swCurRefPu = scm_swIqRefPu; // Q14
     acr_stCurIqPIIn.swCurFdbPu = scm_swIqFdbLpfPu;
     if (DCPswitch == 1)
@@ -735,19 +735,27 @@ void  scm_voSpdCtrMdDownTbc(void)
     }
     else if (DCPswitch == 0)
     {
-        if(FSM2nd_Run_state.state == Assistance)
-        {
-          acr_stCurIqPIIn.swUmaxPu = ass_CalOut.swVoltLimitPu - acr_stUdqDcpOut.swUqPu;  // Q14
-          acr_stCurIqPIIn.swUminPu = -ass_CalOut.swVoltLimitPu - acr_stUdqDcpOut.swUqPu; // Q14
-        }
-        else
-        {
-           acr_stCurIqPIIn.swUmaxPu = scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
-           acr_stCurIqPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu; // Q14
-        }       
+      
+//        if(FSM2nd_Run_state.state == Assistance)
+//        {
+//          acr_stCurIqPIIn.swUmaxPu = ass_CalOut.swVoltLimitPu - acr_stUdqDcpOut.swUqPu;  // Q14
+//          acr_stCurIqPIIn.swUminPu = -ass_CalOut.swVoltLimitPu - acr_stUdqDcpOut.swUqPu; // Q14
+//        }
+//        else
+//        {
+//           acr_stCurIqPIIn.swUmaxPu = scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
+//           acr_stCurIqPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu; // Q14
+//        }       
         
 //        acr_stCurIqPIIn.swUmaxPu = scm_swVsLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
 //        acr_stCurIqPIIn.swUminPu = -scm_swVsLimPu - acr_stUdqDcpOut.swUqPu; // Q14
+       
+//        scm_swUqLimPu = mth_slSqrt(((SLONG)scm_swVsLimPu * scm_swVsLimPu) - (SLONG)(acr_stCurIdPIOut.swURefPu + acr_stUdqDcpOut.swUdPu) * (acr_stCurIdPIOut.swURefPu + acr_stUdqDcpOut.swUdPu));//Q14
+//        acr_stCurIqPIIn.swUmaxPu = scm_swUqLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
+//        acr_stCurIqPIIn.swUminPu = -scm_swUqLimPu - acr_stUdqDcpOut.swUqPu; // Q14
+      
+         acr_stCurIqPIIn.swUmaxPu = scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu;  // Q14
+         acr_stCurIqPIIn.swUminPu = -scm_swVsDcpLimPu - acr_stUdqDcpOut.swUqPu; //
     }
     else
     {}

+ 4 - 10
User project/4.BasicHardwSoftwLayer/1.BasicHardwLayer/Source/hwsetup.c

@@ -651,7 +651,8 @@ void hw_voInitTim0(void)
     timer_channel_output_config(TIMER0, TIMER_CH_3, &timer_ocintpara);
     timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, 200);
     timer_channel_output_mode_config(TIMER0, TIMER_CH_3, TIMER_OC_MODE_PWM1);
-    timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE);
+    //timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE);
+    timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_ENABLE);
  
     /* automatic output enable, break, dead time and lock configuration*/
     timer_breakpara.runoffstate      = TIMER_ROS_STATE_ENABLE;
@@ -1084,7 +1085,7 @@ void hw_voInitInt(void)
     nvic_irq_enable(TIMER0_UP_TIMER9_IRQn, 1, 1);
     
     /* TIMER1 interrupt: CAP */
-    nvic_irq_enable(TIMER1_IRQn, 1, 3);
+    nvic_irq_enable(TIMER1_IRQn, 2, 1);
 
     /* TIMER3 interrupt: TBS */
     nvic_irq_enable(TIMER3_IRQn, 3, 2);
@@ -1092,7 +1093,7 @@ void hw_voInitInt(void)
     /* TIMER5 interrupt: 1ms */
     nvic_irq_enable(TIMER5_IRQn, 2, 3);
 
-    //nvic_irq_enable(DMA0_Channel4_IRQn, 0, 1);/* test */
+    //nvic_irq_enable(DMA0_Channel4_IRQn, 0, 1); // test
 
     /* DMA1 CH2 interrupt: Uart */
     nvic_irq_enable(DMA1_Channel2_IRQn, 3, 3);
@@ -1105,13 +1106,6 @@ void hw_voInitInt(void)
     
     /* CAN0 RX1 interrupt */
     nvic_irq_enable(CAN0_RX1_IRQn, 3, 3); 
-  
-    //// GD which oneï¼?
-////    NVIC_InitStructure.NVIC_IRQChannel = CAN1_SCE_IRQn;   
-////    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
-////    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
-////    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
-////    NVIC_Init(&NVIC_InitStructure);
    
     nvic_irq_enable(EXTI10_15_IRQn, 3, 3); 
 }

+ 3 - 3
User project/4.BasicHardwSoftwLayer/2.BasicSoftwLayer/Include/user.h

@@ -40,7 +40,7 @@ Update Time
 *=======================================================================*/
 #define MOTOR_WELLING_CITY 0x20
 #define MOTOR_WELLING_MTB 0x21
-#define MOTOR_ID_SEL           MOTOR_WELLING_CITY //
+#define MOTOR_ID_SEL           MOTOR_WELLING_MTB //
 
 
 /*======================================================================*
@@ -286,8 +286,8 @@ Update Time
 *=======================================================================*/
 #define FW_VDC_MIN_CALC_TM       20  // unit: ms,50Hz=>20ms, period of Vdc fluctuate
 #define FW_VDC_LPF_FRQ           50  // unit: Hz, Frequency of Vdc LPF
-#define FW_PWM_MAX_DUTY_CYLE_IPM 900 // unit: 0.1%,PWM max duty cyle for flux weakening
-#define FW_ID_PI_OUT_MIN         800 // unit: 0.01A, Min Id of PI outunit: 0.01A, Current Limit
+#define FW_PWM_MAX_DUTY_CYLE_IPM 880 // unit: 0.1%,PWM max duty cyle for flux weakening
+#define FW_ID_PI_OUT_MIN         1000 // unit: 0.01A, Min Id of PI outunit: 0.01A, Current Limit
 #define FW_ID_MIN_LIM_RATIO      80  // Q0:1%, Ratio of Min d axis current (Charactoristic current)
 #define FW_ID_KP_PU              10  // Q16, Kp for d axis current
 #define FW_ID_KI_PU              5   // Q16, Ki for d axis current