fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <math.h>
  4.  
  5. #define SETPOINT_MAX_VALUE (63000)
  6. #define NUM_POS_CAL_BITS (8)
  7. #define NUM_POS_CAL_FRAC_BITS (17 - NUM_POS_CAL_BITS)
  8. #define NUM_POS_CALS (1 << NUM_POS_CAL_BITS)
  9. typedef struct pos_cal_struct POS_CAL;
  10. struct pos_cal_struct
  11. {
  12. int32_t posCal; /* Calibrated position at start of segment */
  13. int32_t posSlope_Q16; /* Slope within the segment */
  14. };
  15. static POS_CAL posCals[NUM_POS_CALS];
  16. static float Quad_geo;
  17. static float ScaleFactor_geo = 1;
  18. static float Offset_geo;
  19.  
  20. static float prv_cal_pos_from_index_geo(float y)
  21. {
  22. return (((Quad_geo * y) + ScaleFactor_geo) * y) + Offset_geo;
  23. }
  24.  
  25. static float prv_cal_pos_from_index(int32_t segIndex,
  26. float quad,
  27. float scale_factor,
  28. int32_t offset)
  29. {
  30. int32_t binWidth = 1u << NUM_POS_CAL_FRAC_BITS;
  31. float adcDiff =
  32. (float) segIndex * (float) binWidth; /* Raw ADC difference reading */
  33. float y = (((quad * adcDiff) + scale_factor) * adcDiff) - offset;
  34. return prv_cal_pos_from_index_geo(y);
  35. }
  36. int main(void) {
  37. // your code goes here
  38.  
  39. int32_t setpointMax = SETPOINT_MAX_VALUE;
  40. const float scale_factor = 1.0f;
  41. setpointMax *= scale_factor;
  42. const float quad = 0;
  43. const int32_t offset = 0;
  44. /*
  45.   * Update the position calibration table.
  46.   * For now, we only have scale and offset, so fill table linear.
  47.   */
  48. for (uint32_t i = 0; i < NUM_POS_CALS; i++)
  49. {
  50. POS_CAL *pc = &posCals[i];
  51. int32_t segIndex = i;
  52. if (segIndex >= (NUM_POS_CALS / 2))
  53. {
  54. segIndex -= NUM_POS_CALS; /* Sign extend */
  55. }
  56. pc->posCal = lroundf(
  57. prv_cal_pos_from_index(segIndex, quad, scale_factor, offset));
  58. int32_t posCal2 = lroundf(prv_cal_pos_from_index(
  59. segIndex + 1, quad, scale_factor, offset));
  60. uint32_t uslope = ((uint32_t)(posCal2 - pc->posCal))
  61. << ((16 - NUM_POS_CAL_FRAC_BITS) + 1);
  62. int32_t slopex2 = (int32_t) uslope;
  63. pc->posSlope_Q16 = (slopex2 + 1) / 2; /* Round to times 1 */
  64. printf("\ncal %u: posCal=%d slope=%d", i, pc->posCal, pc->posSlope_Q16);
  65. }
  66.  
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
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