Two simple ways that I can think of off the top of my head:
1. convert the speeds to signed values then divide by two:
Code:
int signValue(int value)
{
return value - 127;
}
divide by two then:
Code:
int unsignValue(int value)
{
return value + 127;
}
2. This one allows for some interesting possibilities. An open-filter system.
Code:
char filter[255] = [64,64,65,65,etc,etc];
motorOutput = filter[joystickInput];
You can simply fill the filter array with [64,196] (middle 50% of speed range) in with a constant slope, or you can experiment with having a curve to, for example, put values near the center closer together to give even greater very low speed control. In fact, you may decided to leave the full range of possible speeds, just make it so the joystick has to be at the far extremes to reach full speed.