Переглянути джерело

调整S型曲线计算方式

yidong.fan 3 місяців тому
батько
коміт
2a950d135e

+ 43 - 18
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Motor.c

@@ -1,5 +1,7 @@
 #define  __MOTOR1_DEF
 #include "ABIS_User.h"
+#include <math.h>
+
 
 #define MAX_SETP_OF_X   500000
 #define MAX_SETP_OF_X_LEAVEOPT   100000
@@ -42,29 +44,52 @@ void InitMotorXPWM(void){
     IFS0bits.T2IF = 0;
     IPC1bits.T2IP = 7;
 }
+// S型曲线数学变换
+float sigmoid(float x) {
+    return 1.0f / (1.0f + expf(-x));
+}
+
 /*******************************************************************************
  * 函数名称:SetMotor
  *******************************************************************************/
 void SetMotorX(unsigned long int Pulses,unsigned int spd,unsigned long int *AccPLS,unsigned long int *constVPLS)
 {
+	float deno ;
+	float melo ;
+	float fre;
+	float flexible=MOTORX_XFLEXIBLE;
+    float x_scale;
     unsigned int i;
-    unsigned int Prd;
-    Prd = 625000 / spd; 
-    for (i = 0; i < MOTORX_ACC; i++) {
-        if ((Prd < g_uiMotorXPeriod[i])&&(Prd >= g_uiMotorXPeriod[i + 1])) {
-            *AccPLS = i + 1;
-            break;
-        } else if (Prd == g_uiMotorXPeriod[i]) {
-            *AccPLS = i;
-            break;
-        }
-    }
-    if (Pulses >= *AccPLS + *AccPLS) {
-        *constVPLS = Pulses - *AccPLS;      
-    } else if (Pulses < *AccPLS + *AccPLS) { 
-        *AccPLS = Pulses / 2;
+    unsigned int Prd;	
+	unsigned long int accPlus;
+	static unsigned int lastspd=0;
+	if(spd < g_tEE.uiXSpeedMin)spd = g_tEE.uiXSpeedMin;
+    if(spd > g_tEE.uiXSpeedMax)spd = g_tEE.uiXSpeedMax;
+	accPlus = (spd- g_tEE.uiXSpeedMin)/flexible;
+	if(accPlus > MOTORX_ACC){
+		accPlus = MOTORX_ACC;
+		flexible = (spd- g_tEE.uiXSpeedMin)/accPlus;
+	}
+	if((Pulses/2)>accPlus){
+		*AccPLS = accPlus;
+        *constVPLS = Pulses - *AccPLS;  
+	}else{
+		*AccPLS = Pulses / 2;
         *constVPLS = *AccPLS;
-	}	
+	}
+	if(lastspd != spd){
+		/*只在速度变化时候,跟新曲线参数*/		
+		float Fdelt = spd- g_tEE.uiXSpeedMin;
+		x_scale = accPlus;
+//		g_uiMotorXPeriod[0] = (unsigned short)(625000.0/g_tEE.uiXSpeedMin);
+		g_uiMotorXPeriod[accPlus] = (unsigned short)(625000.0/spd);	
+		for(i=0; i<(accPlus); i++){
+			float melo =flexible * (i - x_scale) / x_scale;		  
+			deno = sigmoid(melo); 								
+			fre = Fdelt * deno + g_tEE.uiXSpeedMin;
+			g_uiMotorXPeriod[i] = (unsigned short)(625000.0/fre);						
+		}
+	}
 }
 /*******************************************************************************
  * 函数名称:MotorHome
@@ -82,7 +107,7 @@ unsigned int MotorXHome(unsigned int pulseoffset,unsigned int MOVEspd,unsigned i
 	PulseNum=0;
     if(HOMEX == 0){
         MOTORX_DIR = FORWARD;
-        Freq=5000000/LEAVspd;
+        Freq=2500000/LEAVspd;
         TMR8=0;
         PR8=Freq;
         IFS3bits.T8IF = 0;
@@ -97,7 +122,7 @@ unsigned int MotorXHome(unsigned int pulseoffset,unsigned int MOVEspd,unsigned i
         MOTORX_PWM=0;
     }else{
         MOTORX_DIR = REVERSAL;
-        Freq=5000000/MOVEspd;
+        Freq=2500000/MOVEspd;
         TMR8=0;
         PR8=Freq; 
         IFS3bits.T8IF = 0;

+ 4 - 4
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Uart.c

@@ -238,10 +238,10 @@ void  __attribute__((__interrupt__,no_auto_psv)) _U2RXInterrupt(void)
 void  __attribute__((__interrupt__,no_auto_psv)) _U3RXInterrupt(void)
 {
 	IFS5bits.U3RXIF = 0;                                                
-    g_ucU3RX_Buf[uart3_last++] = U3RXREG;
-	if(uart3_last == MAX_UART_BUFFER_SIZE){
-		uart3_last = 0;
-	}
+//    g_ucU3RX_Buf[uart3_last++] = U3RXREG;
+//	if(uart3_last == MAX_UART_BUFFER_SIZE){
+//		uart3_last = 0;
+//	}
 }
 
 /*******************************************************************************

+ 4 - 4
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Uart.h

@@ -137,10 +137,10 @@ EXTERN_UART unsigned char g_ucHeaderFlag1;
 EXTERN_UART unsigned int g_uiLth1,GlobalNum;
 EXTERN_UART unsigned long g_ulRSUM1;
 EXTERN_UART unsigned char g_ucCRC1;
-
-EXTERN_UART unsigned char g_ucU3RX_Buf[512];
-EXTERN_UART uint32_t   uart3_header = 0;
-EXTERN_UART uint32_t   uart3_last = 0;
+//
+//EXTERN_UART unsigned char g_ucU3RX_Buf[512];
+//EXTERN_UART uint32_t   uart3_header = 0;
+//EXTERN_UART uint32_t   uart3_last = 0;
 
 
 EXTERN_UART unsigned char g_ucRealTemp_Chanel;

+ 1 - 1
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/main.c

@@ -102,7 +102,7 @@ int main(void) {
 //    }
     STU1 = 0;
     baseSys_st = SYS_ST_OK;
-    CalculateSModeLineX(g_uiMotorXPeriod, g_tEE.uiXPulseAcc, MOTORX_FREQMAX, MOTORX_FREQMIN, MOTORX_XFLEXIBLE);   
+//    CalculateSModeLineX(g_uiMotorXPeriod, g_tEE.uiXPulseAcc, MOTORX_FREQMAX, MOTORX_FREQMIN, MOTORX_XFLEXIBLE);   
 //    MotorXHome(g_tEE.uiXPulseHome,g_tEE.uiXSpeedHome,g_tEE.uiXSpeedLeave);
     Delay_ms(500);
     if(MotorXHome(g_tEE.uiXPulseHome,g_tEE.uiXSpeedHome,g_tEE.uiXSpeedLeave) == 0){

+ 0 - 6
WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/nbproject/private/private.xml

@@ -3,16 +3,10 @@
     <editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
     <open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
         <group>
-            <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Uart.c</file>
-            <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/wzyx_protocol.c</file>
             <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Delay.c</file>
-            <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/PWM.c</file>
             <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Motor.c</file>
-            <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/DS1802.c</file>
             <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/main.c</file>
             <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/Interrupt.c</file>
-            <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/ABIS_User.c</file>
-            <file>file:/F:/library/source/WZYXPCR_NO1.20250726.X/WZYXPCR_NO1.20250726.X/file/EEPROM.c</file>
         </group>
     </open-files>
 </project-private>