1 /* Firmware file for lx-rocon tumbl coprocessor */
27 axis_settings a_settings;
31 int16_t current_a_reg;
33 int16_t phase_table[1][1];
39 a_settings.irc_period = 7000;
40 a_settings.req_current = 500;
41 a_settings.acc_dev = 0;
44 void read_input(axis_io* io)
46 io->irc_last = io->irc;
47 io->irc = *((int32_t*)0x8000);
50 void update_axis(axis_settings *settings, axis_io* io)
54 int32_t mag, irc_diff;
56 dev = settings->req_current - io->current;
57 settings->acc_dev += dev;
59 if (settings->acc_dev > settings->max_acc)
60 settings->acc_dev = settings->max_acc;
61 else if (-(settings->acc_dev) <= -(settings->max_acc))
62 settings->acc_dev = -(settings->max_acc);
64 mag = settings->acc_dev * settings->i + dev * settings->p;
66 irc_diff = io->irc - io->irc_last;
67 io->irc_last = io->irc;
68 io->irc_norm += irc_diff;
70 if (io->irc_norm > settings->irc_period)
71 io->irc_norm -= settings->irc_period;
72 else if (io->irc_norm < 0)
73 io->irc_norm += settings->irc_period;
75 for (i = 0; i < 3; i++)
76 io->pwm[i] = (uint16_t)((mag * phase_table[/*i*/ 0][/*irc_norm*/ 0]) >> 16);
84 update_axis(&a_settings, &a_io);
86 a_io.current = current_a_reg;