Joystick Logarythmisch umwandeln

Hallo zusammen.Ich habe wieder ein kleines problem woran ich mir die Zähne ausbeiße.
Ich bastle gerade an einer Remote Fernsteuerung für einen Kameraschwenkopf, das "besondere" ist ich verwende keine geschwindikeitssteuerung sondern eine Positionssteuerung. Das Problem ein direkts übernehmen der bewegung (wie bei einem Servo) ist viel zu ruckelig, da man ja auch mal zittert oder ungleichmäßig sich bewegt. Das wäre aber der Anspruch das zu Glätten. Ich habe im Moment eine art Tiefpassfilter eingebaut der Meinen Kamerakopf schön langsam der neuen vorgegebenen Position angleicht (fadet soft aus). Allerdings startet die transition nicht langsam und ansteigend sondern abrupt.hätt ich gerne auch langsam ansteigend bis wieder fallend. "Smothsteps" was im Playground zu finden ist, habe ich fersucht aber wohl falsch angewandt desshalb ohne ergebniss.. hat einer ne idee... Hier ist mein Programm vieleicht hat jemand zeit sich mal kurz reinzulesen?

#include "TimerOne.h"



volatile byte Takt_State = LOW;
int joyPin1 = 0;  // JoystickX
int joyPin3 = 2;  // JoystickZ


float value1 = 0;   // aktuelle rohdaten vom joystick
float value1_old = 0; // alte geglättete daten vom joystick
float value1_Glatt = 0; // aktuelle geglättete daten vom joystick
float value1T = 0;      //  ist das selbe wie value1_Glatt 

float value3 = 510;    // das gleiche 
float value3_old = 510;
float value3_Glatt = 0;

 int expander = 21333; // ist ein varriable die von joypin3 gesteuert wird (skaliert die joystickbewegungen auf den drehradius der kamera)


int Motor_drehrichtung_CC = 13; // Für schrittmotorensteuerung
int Takt_Out = 12;               // Für schrittmotorensteuerung
float motor_ist = 0;             // giebt den aktuelle pos des steppers an
//////////////////////////////////////////////////////////////////////////////
void setup()

{
Serial.begin(9600);
pinMode(Takt_Out, OUTPUT);
pinMode(Motor_drehrichtung_CC, OUTPUT);
  Timer1.initialize(60);        // interrupt zeug um ein rechteckimpuls zu erzeugen für den takteingang an der SM steuerung
  Timer1.pwm(9, 512);               
  Timer1.attachInterrupt(Takt); 
}
 int treatValue(int data) {
  return (data * 9 / 1024) + 48;      
}


///////////////////////////////////////////////////////////////////////////

// das erzeugt den rechteckimpuls und lässt den motor solange schritte machen bis er den sollwert erreicht hat
void Takt()
{

  if (value1T == motor_ist)
{digitalWrite(Takt_Out,LOW);
 digitalWrite(Motor_drehrichtung_CC,HIGH);
}

else
{  
  if (Takt_State == HIGH) 
     { 
      Takt_State = LOW;
      if (value1T < motor_ist)
         {
          digitalWrite(Motor_drehrichtung_CC,HIGH);                                                           
          motor_ist -= 1;
         }
      else if (value1T > motor_ist)
         {
         digitalWrite(Motor_drehrichtung_CC,LOW);                                                                  
         motor_ist += 1;
         }
     }
else if (Takt_State == LOW) 
     { 
      Takt_State = HIGH;
      if (value1T < motor_ist)
         {
          digitalWrite(Motor_drehrichtung_CC,HIGH);                                                             
     
         }
      else if (value1T > motor_ist)
         {
         digitalWrite(Motor_drehrichtung_CC,LOW);                                                                 
      
         }
     }
digitalWrite(Takt_Out, Takt_State);
}
} 
///////////////////////////////////////////////////////////////////////////
 void loop()
 {
 value1 = analogRead(joyPin1);   
 expander = expander + value3_Glatt;                        // somit erhöhe ich den drehwinkel meiner kamera manuell um im zoom genauer steuern zu können
 if (expander<0)
 expander = 0;                  

      if   (value1 < 10)                                 // das ganze in einen Rahmen beschränken
         value1 = 10;
      if   (value1 > 1000)
         value1 = 1000;
 value1 = map(value1, 10, 1000, 0, expander);                 // die werte auf meine gewünschte range bringen
 value1_Glatt =((value1 * 0.001) + (value1_old * 0.999)); // Tiefpass um soft auszufaden
 value1_old = value1_Glatt;                                // übergiebt aktuellen wert in die nächste runde
 value1T =  value1_Glatt;               // übergiebt wert zur Taktgenerierung

 value3 = analogRead(joyPin3);     // das ist das selbe für das poti das meinen drehwinkel der kamera skaliert auf meine min max joystick bewegung
  if   (value3 < 10)
         value3 = 10;
      if   (value3 > 1000)
         value3 = 1000;

 value3_Glatt =((value3 * 0.001) + (value3_old * 0.999));
 value3_old = value3_Glatt;


 if  (value3_Glatt < 507)                                  // da der poti eine mittelstellung hat und je mehr ich ihn nach links oder rechts drehe(drehrad) steigt oder sinkt ensprechend schnell der skalierungswert
      value3_Glatt = map(value3_Glatt,10,507, -23, 0);

 if  (value3_Glatt > 513) 
      value3_Glatt = map(value3_Glatt,513,1000,0,23);
      
 if  ((value3_Glatt > 506) && (value3_Glatt < 514) ) 
      value3_Glatt = 0;     
////////////////////////////////////////////////////////////////////

}

// sorry für das schnelle und halbgewalkte auskommentieren