diff --git a/embedded/atkbldcdriver/atkbldcdriver/bldc.c b/embedded/atkbldcdriver/atkbldcdriver/bldc.c
index d99f98b189982de81d7c6780fc43485e5cca4903..b138a376b1e389d02e53f05e777f3dbb6a19d79e 100644
--- a/embedded/atkbldcdriver/atkbldcdriver/bldc.c
+++ b/embedded/atkbldcdriver/atkbldcdriver/bldc.c
@@ -12,6 +12,9 @@ void bldc_init(bldc_t *bldc){
 	bldc->comState = 0;
 	bldc->comDir = 1;
 	bldc->comDuty = 0;
+	
+	bldc->targetSpeed = 0;
+	bldc->currentSpeed = 0;
 }
 
 void bldc_shutdown(bldc_t *bldc){
@@ -23,10 +26,22 @@ void bldc_shutdown(bldc_t *bldc){
 
 void bldc_setDuty(bldc_t *bldc, uint32_t duty){
 	// blind pwm duty 0-512
-	(duty > 512) ? duty = 512 : (0);
+	// hard stop at 256 to avoid breaking things 
+	(duty > 256) ? duty = 256 : (0);
 	bldc->comDuty = (uint16_t) duty;
 }
 
+void bldc_setTargetSpeed(bldc_t *bldc, int32_t speed){
+	// assert limits
+	if(speed > 20000){
+		speed = 20000;
+	} else if (speed < -20000){
+		speed = -20000;
+	}
+	
+	bldc->targetSpeed = speed;
+}
+
 void bldc_setSpeed(bldc_t *bldc, int32_t speed){
 	// speed in eRPM
 	// assert max
@@ -53,5 +68,5 @@ void bldc_setSpeed(bldc_t *bldc, int32_t speed){
 
 void bldc_newSpeed(bldc_t *bldc, int32_t speed, uint32_t duty){
 	bldc_setDuty(bldc, duty);
-	bldc_setSpeed(bldc, speed);
+	bldc_setTargetSpeed(bldc, speed);
 }
\ No newline at end of file
diff --git a/embedded/atkbldcdriver/atkbldcdriver/bldc.h b/embedded/atkbldcdriver/atkbldcdriver/bldc.h
index e0a911f8fdeef19285fa4010ea502b8cc6ac70ec..c48abb25ca8e58cc92f4deb02b996693fe650952 100644
--- a/embedded/atkbldcdriver/atkbldcdriver/bldc.h
+++ b/embedded/atkbldcdriver/atkbldcdriver/bldc.h
@@ -16,6 +16,8 @@ typedef struct{
 	uint8_t comDir;
 	uint16_t comDuty;
 	
+	int32_t currentSpeed;
+	int32_t targetSpeed;
 	uint16_t comPeriod;
 }bldc_t;
 
@@ -25,6 +27,8 @@ void bldc_shutdown(bldc_t *bldc);
 
 void bldc_setDuty(bldc_t *bldc, uint32_t duty);
 
+void bldc_setTargetSpeed(bldc_t *bldc, int32_t speed);
+
 void bldc_setSpeed(bldc_t *bldc, int32_t speed);
 
 void bldc_start(bldc_t *bldc, int32_t speed, uint32_t duty);
diff --git a/embedded/atkbldcdriver/atkbldcdriver/main.c b/embedded/atkbldcdriver/atkbldcdriver/main.c
index a90dc47329dd582d77bbffbfbd82b5c8827a0801..8d9def36694d50b5fab0dcc94b468a0a4bf15791 100644
--- a/embedded/atkbldcdriver/atkbldcdriver/main.c
+++ b/embedded/atkbldcdriver/atkbldcdriver/main.c
@@ -151,7 +151,7 @@ void tickers_init(void){
 	
 	// and a reasonable speed for acceleration ticking
 	
-	uint16_t perAccelRate = 2400;
+	uint16_t perAccelRate = 800;
 	uint8_t perAl = (uint8_t) perAccelRate;
 	uint8_t perAh = (uint8_t) (perAccelRate >> 8);
 	
@@ -188,7 +188,7 @@ int main(void)
 	// initialize the bldc state structure
 	bldc_init(&bldc);
 	// on startup speed and duty
-	bldc_setSpeed(&bldc, 1000);
+	bldc_setTargetSpeed(&bldc, 1000);
 	bldc_setDuty(&bldc, 10);
 	// startup the driver
 	drv_init();
@@ -241,7 +241,15 @@ ISR(TCD0_OVF_vect){
 
 // acceleration timer
 ISR(TCD1_OVF_vect){
-	//pin_toggle(&tstpin2);
+	if(bldc.currentSpeed != bldc.targetSpeed){
+		if(bldc.currentSpeed < bldc.targetSpeed){
+			bldc.currentSpeed ++;
+			bldc_setSpeed(&bldc, bldc.currentSpeed);
+		} else {
+			bldc.currentSpeed --;
+			bldc_setSpeed(&bldc, bldc.currentSpeed);
+		}
+	}
 }
 
 ISR(USARTE1_RXC_vect){