#include <stdio.h> #include <stdint.h> #include <math.h> #define SETPOINT_MAX_VALUE (63000) #define NUM_POS_CAL_BITS (8) #define NUM_POS_CAL_FRAC_BITS (17 - NUM_POS_CAL_BITS) #define NUM_POS_CALS (1 << NUM_POS_CAL_BITS) typedef struct pos_cal_struct POS_CAL; struct pos_cal_struct { int32_t posCal; /* Calibrated position at start of segment */ int32_t posSlope_Q16; /* Slope within the segment */ }; static POS_CAL posCals[NUM_POS_CALS]; static float Quad_geo; static float ScaleFactor_geo = 1; static float Offset_geo; static float prv_cal_pos_from_index_geo(float y) { return (((Quad_geo * y) + ScaleFactor_geo) * y) + Offset_geo; } static float prv_cal_pos_from_index(int32_t segIndex, float quad, float scale_factor, int32_t offset) { int32_t binWidth = 1u << NUM_POS_CAL_FRAC_BITS; float adcDiff = (float) segIndex * (float) binWidth; /* Raw ADC difference reading */ float y = (((quad * adcDiff) + scale_factor) * adcDiff) - offset; return prv_cal_pos_from_index_geo(y); } int main(void) { // your code goes here int32_t setpointMax = SETPOINT_MAX_VALUE; const float scale_factor = 1.0f; setpointMax *= scale_factor; const float quad = 0; const int32_t offset = 0; /* * Update the position calibration table. * For now, we only have scale and offset, so fill table linear. */ for (uint32_t i = 0; i < NUM_POS_CALS; i++) { POS_CAL *pc = &posCals[i]; int32_t segIndex = i; if (segIndex >= (NUM_POS_CALS / 2)) { segIndex -= NUM_POS_CALS; /* Sign extend */ } pc->posCal = lroundf( prv_cal_pos_from_index(segIndex, quad, scale_factor, offset)); int32_t posCal2 = lroundf(prv_cal_pos_from_index( segIndex + 1, quad, scale_factor, offset)); uint32_t uslope = ((uint32_t)(posCal2 - pc->posCal)) << ((16 - NUM_POS_CAL_FRAC_BITS) + 1); int32_t slopex2 = (int32_t) uslope; pc->posSlope_Q16 = (slopex2 + 1) / 2; /* Round to times 1 */ } return 0; }
Standard input is empty
cal 0: posCal=0 slope=65536 cal 1: posCal=512 slope=65536 cal 2: posCal=1024 slope=65536 cal 3: posCal=1536 slope=65536 cal 4: posCal=2048 slope=65536 cal 5: posCal=2560 slope=65536 cal 6: posCal=3072 slope=65536 cal 7: posCal=3584 slope=65536 cal 8: posCal=4096 slope=65536 cal 9: posCal=4608 slope=65536 cal 10: posCal=5120 slope=65536 cal 11: posCal=5632 slope=65536 cal 12: posCal=6144 slope=65536 cal 13: posCal=6656 slope=65536 cal 14: posCal=7168 slope=65536 cal 15: posCal=7680 slope=65536 cal 16: posCal=8192 slope=65536 cal 17: posCal=8704 slope=65536 cal 18: posCal=9216 slope=65536 cal 19: posCal=9728 slope=65536 cal 20: posCal=10240 slope=65536 cal 21: posCal=10752 slope=65536 cal 22: posCal=11264 slope=65536 cal 23: posCal=11776 slope=65536 cal 24: posCal=12288 slope=65536 cal 25: posCal=12800 slope=65536 cal 26: posCal=13312 slope=65536 cal 27: posCal=13824 slope=65536 cal 28: posCal=14336 slope=65536 cal 29: posCal=14848 slope=65536 cal 30: posCal=15360 slope=65536 cal 31: posCal=15872 slope=65536 cal 32: posCal=16384 slope=65536 cal 33: posCal=16896 slope=65536 cal 34: posCal=17408 slope=65536 cal 35: posCal=17920 slope=65536 cal 36: posCal=18432 slope=65536 cal 37: posCal=18944 slope=65536 cal 38: posCal=19456 slope=65536 cal 39: posCal=19968 slope=65536 cal 40: posCal=20480 slope=65536 cal 41: posCal=20992 slope=65536 cal 42: posCal=21504 slope=65536 cal 43: posCal=22016 slope=65536 cal 44: posCal=22528 slope=65536 cal 45: posCal=23040 slope=65536 cal 46: posCal=23552 slope=65536 cal 47: posCal=24064 slope=65536 cal 48: posCal=24576 slope=65536 cal 49: posCal=25088 slope=65536 cal 50: posCal=25600 slope=65536 cal 51: posCal=26112 slope=65536 cal 52: posCal=26624 slope=65536 cal 53: posCal=27136 slope=65536 cal 54: posCal=27648 slope=65536 cal 55: posCal=28160 slope=65536 cal 56: posCal=28672 slope=65536 cal 57: posCal=29184 slope=65536 cal 58: posCal=29696 slope=65536 cal 59: posCal=30208 slope=65536 cal 60: posCal=30720 slope=65536 cal 61: posCal=31232 slope=65536 cal 62: posCal=31744 slope=65536 cal 63: posCal=32256 slope=65536 cal 64: posCal=32768 slope=65536 cal 65: posCal=33280 slope=65536 cal 66: posCal=33792 slope=65536 cal 67: posCal=34304 slope=65536 cal 68: posCal=34816 slope=65536 cal 69: posCal=35328 slope=65536 cal 70: posCal=35840 slope=65536 cal 71: posCal=36352 slope=65536 cal 72: posCal=36864 slope=65536 cal 73: posCal=37376 slope=65536 cal 74: posCal=37888 slope=65536 cal 75: posCal=38400 slope=65536 cal 76: posCal=38912 slope=65536 cal 77: posCal=39424 slope=65536 cal 78: posCal=39936 slope=65536 cal 79: posCal=40448 slope=65536 cal 80: posCal=40960 slope=65536 cal 81: posCal=41472 slope=65536 cal 82: posCal=41984 slope=65536 cal 83: posCal=42496 slope=65536 cal 84: posCal=43008 slope=65536 cal 85: posCal=43520 slope=65536 cal 86: posCal=44032 slope=65536 cal 87: posCal=44544 slope=65536 cal 88: posCal=45056 slope=65536 cal 89: posCal=45568 slope=65536 cal 90: posCal=46080 slope=65536 cal 91: posCal=46592 slope=65536 cal 92: posCal=47104 slope=65536 cal 93: posCal=47616 slope=65536 cal 94: posCal=48128 slope=65536 cal 95: posCal=48640 slope=65536 cal 96: posCal=49152 slope=65536 cal 97: posCal=49664 slope=65536 cal 98: posCal=50176 slope=65536 cal 99: posCal=50688 slope=65536 cal 100: posCal=51200 slope=65536 cal 101: posCal=51712 slope=65536 cal 102: posCal=52224 slope=65536 cal 103: posCal=52736 slope=65536 cal 104: posCal=53248 slope=65536 cal 105: posCal=53760 slope=65536 cal 106: posCal=54272 slope=65536 cal 107: posCal=54784 slope=65536 cal 108: posCal=55296 slope=65536 cal 109: posCal=55808 slope=65536 cal 110: posCal=56320 slope=65536 cal 111: posCal=56832 slope=65536 cal 112: posCal=57344 slope=65536 cal 113: posCal=57856 slope=65536 cal 114: posCal=58368 slope=65536 cal 115: posCal=58880 slope=65536 cal 116: posCal=59392 slope=65536 cal 117: posCal=59904 slope=65536 cal 118: posCal=60416 slope=65536 cal 119: posCal=60928 slope=65536 cal 120: posCal=61440 slope=65536 cal 121: posCal=61952 slope=65536 cal 122: posCal=62464 slope=65536 cal 123: posCal=62976 slope=65536 cal 124: posCal=63488 slope=65536 cal 125: posCal=64000 slope=65536 cal 126: posCal=64512 slope=65536 cal 127: posCal=65024 slope=65536 cal 128: posCal=-65536 slope=65536 cal 129: posCal=-65024 slope=65536 cal 130: posCal=-64512 slope=65536 cal 131: posCal=-64000 slope=65536 cal 132: posCal=-63488 slope=65536 cal 133: posCal=-62976 slope=65536 cal 134: posCal=-62464 slope=65536 cal 135: posCal=-61952 slope=65536 cal 136: posCal=-61440 slope=65536 cal 137: posCal=-60928 slope=65536 cal 138: posCal=-60416 slope=65536 cal 139: posCal=-59904 slope=65536 cal 140: posCal=-59392 slope=65536 cal 141: posCal=-58880 slope=65536 cal 142: posCal=-58368 slope=65536 cal 143: posCal=-57856 slope=65536 cal 144: posCal=-57344 slope=65536 cal 145: posCal=-56832 slope=65536 cal 146: posCal=-56320 slope=65536 cal 147: posCal=-55808 slope=65536 cal 148: posCal=-55296 slope=65536 cal 149: posCal=-54784 slope=65536 cal 150: posCal=-54272 slope=65536 cal 151: posCal=-53760 slope=65536 cal 152: posCal=-53248 slope=65536 cal 153: posCal=-52736 slope=65536 cal 154: posCal=-52224 slope=65536 cal 155: posCal=-51712 slope=65536 cal 156: posCal=-51200 slope=65536 cal 157: posCal=-50688 slope=65536 cal 158: posCal=-50176 slope=65536 cal 159: posCal=-49664 slope=65536 cal 160: posCal=-49152 slope=65536 cal 161: posCal=-48640 slope=65536 cal 162: posCal=-48128 slope=65536 cal 163: posCal=-47616 slope=65536 cal 164: posCal=-47104 slope=65536 cal 165: posCal=-46592 slope=65536 cal 166: posCal=-46080 slope=65536 cal 167: posCal=-45568 slope=65536 cal 168: posCal=-45056 slope=65536 cal 169: posCal=-44544 slope=65536 cal 170: posCal=-44032 slope=65536 cal 171: posCal=-43520 slope=65536 cal 172: posCal=-43008 slope=65536 cal 173: posCal=-42496 slope=65536 cal 174: posCal=-41984 slope=65536 cal 175: posCal=-41472 slope=65536 cal 176: posCal=-40960 slope=65536 cal 177: posCal=-40448 slope=65536 cal 178: posCal=-39936 slope=65536 cal 179: posCal=-39424 slope=65536 cal 180: posCal=-38912 slope=65536 cal 181: posCal=-38400 slope=65536 cal 182: posCal=-37888 slope=65536 cal 183: posCal=-37376 slope=65536 cal 184: posCal=-36864 slope=65536 cal 185: posCal=-36352 slope=65536 cal 186: posCal=-35840 slope=65536 cal 187: posCal=-35328 slope=65536 cal 188: posCal=-34816 slope=65536 cal 189: posCal=-34304 slope=65536 cal 190: posCal=-33792 slope=65536 cal 191: posCal=-33280 slope=65536 cal 192: posCal=-32768 slope=65536 cal 193: posCal=-32256 slope=65536 cal 194: posCal=-31744 slope=65536 cal 195: posCal=-31232 slope=65536 cal 196: posCal=-30720 slope=65536 cal 197: posCal=-30208 slope=65536 cal 198: posCal=-29696 slope=65536 cal 199: posCal=-29184 slope=65536 cal 200: posCal=-28672 slope=65536 cal 201: posCal=-28160 slope=65536 cal 202: posCal=-27648 slope=65536 cal 203: posCal=-27136 slope=65536 cal 204: posCal=-26624 slope=65536 cal 205: posCal=-26112 slope=65536 cal 206: posCal=-25600 slope=65536 cal 207: posCal=-25088 slope=65536 cal 208: posCal=-24576 slope=65536 cal 209: posCal=-24064 slope=65536 cal 210: posCal=-23552 slope=65536 cal 211: posCal=-23040 slope=65536 cal 212: posCal=-22528 slope=65536 cal 213: posCal=-22016 slope=65536 cal 214: posCal=-21504 slope=65536 cal 215: posCal=-20992 slope=65536 cal 216: posCal=-20480 slope=65536 cal 217: posCal=-19968 slope=65536 cal 218: posCal=-19456 slope=65536 cal 219: posCal=-18944 slope=65536 cal 220: posCal=-18432 slope=65536 cal 221: posCal=-17920 slope=65536 cal 222: posCal=-17408 slope=65536 cal 223: posCal=-16896 slope=65536 cal 224: posCal=-16384 slope=65536 cal 225: posCal=-15872 slope=65536 cal 226: posCal=-15360 slope=65536 cal 227: posCal=-14848 slope=65536 cal 228: posCal=-14336 slope=65536 cal 229: posCal=-13824 slope=65536 cal 230: posCal=-13312 slope=65536 cal 231: posCal=-12800 slope=65536 cal 232: posCal=-12288 slope=65536 cal 233: posCal=-11776 slope=65536 cal 234: posCal=-11264 slope=65536 cal 235: posCal=-10752 slope=65536 cal 236: posCal=-10240 slope=65536 cal 237: posCal=-9728 slope=65536 cal 238: posCal=-9216 slope=65536 cal 239: posCal=-8704 slope=65536 cal 240: posCal=-8192 slope=65536 cal 241: posCal=-7680 slope=65536 cal 242: posCal=-7168 slope=65536 cal 243: posCal=-6656 slope=65536 cal 244: posCal=-6144 slope=65536 cal 245: posCal=-5632 slope=65536 cal 246: posCal=-5120 slope=65536 cal 247: posCal=-4608 slope=65536 cal 248: posCal=-4096 slope=65536 cal 249: posCal=-3584 slope=65536 cal 250: posCal=-3072 slope=65536 cal 251: posCal=-2560 slope=65536 cal 252: posCal=-2048 slope=65536 cal 253: posCal=-1536 slope=65536 cal 254: posCal=-1024 slope=65536 cal 255: posCal=-512 slope=65536