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){