Building on what @markdibarry said, jitter is fundamental to fully pixel perfect display. If you don’t want to allow subpixel movement (which is your call, obviously; it’s an aesthetic choice), you’re going to get jitter.
For example, let’s say you’ve got a platform that’s moving horizontally. To make the example simple, let’s say initially it moves at 10 pixels/second for the first second. If we assume a 30Hz frame rate, that means for the first half second, the positions will be:
(Terminology note: On Commodore 8bit systems, a Jiffy was a unit of time equal to one frame…)
Ideal Actual
Jiffy Pos Pos
0 0.0 0
1 0.33 0
2 0.66 0
3 1.0 1
4 1.33 1
5 1.67 1
6 2.0 2
7 2.33 2
8 2.67 2
9 3.0 3
10 3.33 3
11 3.67 3
12 4.0 4
13 4.33 4
14 4.67 4
15 5.0 5
You can see how the positions are getting snapped to pixel coords, and how they’re only actually updating every few frames. That’s where your jitter is coming from. It’s fundamental to pixel perfect display.
It’s particularly obvious when things are moving slower, especially if you have something moving on a diagonal so it’s jittering in two dimensions.
If you want pixel perfect, this is one of the things you have to accept; there’s no way to get rid of that jitter without allowing subpixel positioning.
If, on the other hand, you want the pixel art aesthetic but don’t want the jitter, you need to allow for subpixel positioning. Using scaled up models (so each “pixel” in your sprites is actually 2x2, 3x3, or maybe 4x4 pixels) will let you do that, and if you still want to be mostly pixel perfect you could always require that the rest positions for objects were snapped to your larger grid. So, if you use 4x4 pixels, for instance, make sure any rest position’s dimensions are integer multiples of 4.