diff --git a/firmware/cl-step-controller/src/drivers/step_cl.cpp b/firmware/cl-step-controller/src/drivers/step_cl.cpp index 513d74cdec0e584e04aa49611d989b9dd1f5317e..4ec2736418bd661aff7fa0f5851b390f854607ca 100644 --- a/firmware/cl-step-controller/src/drivers/step_cl.cpp +++ b/firmware/cl-step-controller/src/drivers/step_cl.cpp @@ -106,11 +106,6 @@ void Step_CL::print_table(void){ // the calib routine boolean Step_CL::calibrate(void){ - flash_write_init(); - for(uint32_t i = 0; i < ENCODER_COUNTS; i ++){ - flash_write_value(i * 1.1F); - } - return true; // (1) first, build a table for 200 full steps w/ encoder averaged values at each step float phase_angle = 0.0F; for(uint8_t i = 0; i < 200; i ++){ @@ -167,7 +162,7 @@ boolean Step_CL::calibrate(void){ // now to build the actual table... // want to start with the 0 indice, flash_write_init(); - for(uint16_t e = 0; e < 4; e ++){ + for(uint16_t e = 0; e < ENCODER_COUNTS; e ++){ // find the interval that spans this sample boolean bi = false; int16_t interval = -1; @@ -258,7 +253,7 @@ boolean Step_CL::calibrate(void){ delay(10); } // ok, have the real angle (ra) at the encoder tick (e), now write it - //flash_write_value(ra); // this just happens in order, we zeroe'd out global counters at the start + flash_write_value(ra); // this just happens in order, we zeroe'd out global counters at the start } // end sweep thru 2^14 pts sysError("calib complete"); return true; // went OK diff --git a/log/cl-step-control-log.md b/log/cl-step-control-log.md index 63e9b30c4335450da45dae55da2fcf9f3a0e26f4..168c8c230c5a4fb54d12b172ef802159419e16a3 100644 --- a/log/cl-step-control-log.md +++ b/log/cl-step-control-log.md @@ -899,7 +899,69 @@ OK this is crazy, I have every fn in the class commented out, and the thing stil So, tried my way around that, I have honestly no idea what is going on here. I'm going to try writing from the base class again. -OK, did that and seems like I'm writing into the thing. +OK, did that and seems like I'm writing into the thing. Crazy. Here's the code: -- neil suggests watching the power rails, flash req -- nuclear option is asking neil to chat w/ microchip contacts \ No newline at end of file +```cpp +#define BYTES_PER_BLOCK 8192 +#define FLOATS_PER_BLOCK 2048 + +const float __attribute__((__aligned__(8192))) lut[16834] = {}; +FlashClass flashClass((const uint8_t*)lut); + +// write mechanics +const void* block_ptr; + +// write buffer +static float buffer[FLOATS_PER_BLOCK]; + +uint32_t bfi = 0; // buffer indice +uint32_t bli = 0; // block indice + +//FlashStorage(flash_storage, flts); + +void flash_write_init(void){ + block_ptr = (const uint8_t*) lut; + bfi = 0; + bli = 0; +} + +void flash_write_page(void){ + sysError("erasing"); + flashClass.erase(block_ptr, BYTES_PER_BLOCK); + sysError("writing"); + flashClass.write(block_ptr, (const uint8_t*)buffer, BYTES_PER_BLOCK); + delay(100); +} + +void flash_write_value(float val){ + buffer[bfi ++] = val; + if(bfi >= FLOATS_PER_BLOCK){ + flash_write_page(); + bfi = 0; + bli ++; + block_ptr = ((const uint8_t *)(&(lut[bli * FLOATS_PER_BLOCK]))); + } +} + +void Step_CL::print_table(void){ + sysError("reading from lut"); + for(uint32_t i = 0; i < ENCODER_COUNTS; i ++){ + float ra = lut[i]; + sysError(String(ra)); + delay(5); + } +} + +// the calib routine +boolean Step_CL::calibrate(void){ + flash_write_init(); + for(uint32_t i = 0; i < ENCODER_COUNTS; i ++){ + flash_write_value(i * 1.1F); + } + return true; +} +``` + +So I think now I'll carry on actually running the calibration, then see if I can send a 'torque' command down / operate a control loop. + +Great, this calibrates, so now I can roll a tiny control loop, yeah? \ No newline at end of file