       break;
     }
 
-    // read motor states and drive motors
+    // read motor states and drive motors    
     for(i = 0; i < 2; i++)
     {
+      if (abs(motor_drive_present[i] - motor_drive_target[i]) < 7)
+      {
+        // if close to target, set to target
+        motor_drive_present[i] = motor_drive_target[i];
+      }
+      else
+      {
+        // move PWM closer to target
+        if (motor_drive_present[i] > motor_drive_target[i])
+        {
+          // PWM is greater than target, decrease PWM
+          motor_drive_present[i] -= MOTOR_RAMP_STEP;
+        }
+        else
+        {
+          // PWM is less than target, increase PWM
+          motor_drive_present[i] += MOTOR_RAMP_STEP;    
+        }
+      }
+      
       switch(motor_state[i])
       {
         // drive motors: forward: a = high, b = low; reverse: a = low, b = high; off: both low

          digitalWrite(rear_motor_b[i], LOW);
          analogWrite(front_motor_en[i], TURN_SPEED);
          analogWrite(rear_motor_en[i], TURN_SPEED);
        break;

        case MOTOR_REVERSE_FULL:

          digitalWrite(front_motor_b[i], LOW);
          digitalWrite(rear_motor_a[i], HIGH);
          digitalWrite(rear_motor_b[i], LOW);
          //analogWrite(front_motor_en[i], FULL_SPEED);
          //analogWrite(rear_motor_en[i], FULL_SPEED);
          analogWrite(front_motor_en[i], motor_drive_present[i]);
          analogWrite(rear_motor_en[i], motor_drive_present[i]);
          motor_drive_target[i] = FULL_SPEED;
        break;

        case MOTOR_FORWARD_TURN:
