diff --git a/controller/src/logic.rs b/controller/src/logic.rs
index 1403e276d71575fcc05c10fef284082bc3d9d1ab..17ee57c72465515bfcb1031b7ade3afe34c1dc32 100644
--- a/controller/src/logic.rs
+++ b/controller/src/logic.rs
@@ -13,13 +13,13 @@ use embassy_time::{Duration, Instant, Ticker};
 use heapless::Deque;
 use i2c2_target::{I2C2, MESSAGE_SIZE};
 
+static MAX_MOTOR_PERCENTAGE: AtomicU8 = AtomicU8::new(100);
 static WATCHDOG_TICKS: AtomicU8 = AtomicU8::new(5);
 
 struct State {
     i2c: I2C2,
     motors: Tb6612fng<'static>,
     encoders: Encoders<'static>,
-    max_motor_percentage: u8,
     motor_speed: [u8; 2],
     standby: bool,
 }
@@ -30,7 +30,6 @@ impl State {
             i2c: i2c2,
             motors,
             encoders,
-            max_motor_percentage: 100,
             motor_speed: [0, 0],
             standby: true,
         }
@@ -40,7 +39,7 @@ impl State {
     fn set_motor_speed(&mut self, ms: [u8; 2]) {
         let (max_pwm, mmp) = (
             self.motors.max_pwm() as i32,
-            i32::from(self.max_motor_percentage),
+            i32::from(MAX_MOTOR_PERCENTAGE.load(Ordering::Relaxed)),
         );
         let scaled_speed = |speed| match speed as i8 {
             -128 => None,
@@ -202,14 +201,16 @@ fn process_command(
         }
         &[CMD_MAX_MOTOR_PERCENTAGE, p] => {
             if (1..=100).contains(&p) {
-                state.max_motor_percentage = p;
+                MAX_MOTOR_PERCENTAGE.store(p, Ordering::Relaxed);
             } else {
                 defmt::warn!("incorrect max percentage {}", p);
                 return false;
             }
         }
         [CMD_MAX_MOTOR_PERCENTAGE] => {
-            response.push_back(state.max_motor_percentage).unwrap();
+            response
+                .push_back(MAX_MOTOR_PERCENTAGE.load(Ordering::Relaxed))
+                .unwrap();
         }
         [CMD_MOTOR_SPEED, ms @ ..] if ms.len() == 2 => {
             state.set_motor_speed([ms[0], ms[1]]);