Commit 24f47d6c authored by Adam Wujek's avatar Adam Wujek

main_fw/ADC: support different sets of channel mappings

Fantray has different ADC channel assignments comparing to previous designs.
Signed-off-by: 's avatarAdam Wujek <dev_public@wujek.eu>
parent 3266b9f4
Pipeline #3784 failed with stage
in 1 minute and 15 seconds
......@@ -128,8 +128,88 @@ const float temp_coeff_a[3] = {0, 0, 0};
const float temp_coeff_b[3] = {0, 0, 0};
#endif
uint16_t adc_ch __xMR;
uint16_t adc_vals[ADC_CH_MAX+1];
#if defined MMRTSB
/* FIXME: to be verified */
enum {
adc_t1 = 0,
adc_t2 = 4,
adc_t3 = 5,
adc_v1 = 6,
adc_v2 = 3,
adc_v3 = 11,
adc_v4 = 18,
adc_i1 = 7,
adc_i2 = 2,
adc_i3 = 10,
};
uint8_t adc_ch_list[] __xMR = {adc_t1, adc_t2, adc_t3,
adc_v1, adc_v2, adc_v3, adc_v4,
adc_i1, adc_i2, adc_i3
};
#elif defined MMFANT
enum {
adc_t1 = 0,
adc_v1 = 3,
adc_v2 = 2,
adc_i1 = 7,
adc_i2 = 6,
adc_i3 = 10,
/* dummy values, e.g. unused ADC channels */
adc_t2 = 1,
adc_t3 = 4,
adc_v3 = 5,
};
uint8_t adc_ch_list[] __xMR = {adc_t1,
adc_v1, adc_v2,
adc_i1, adc_i2, adc_i3
};
#elif defined MMRATO
/* FIXME: to be verified */
enum {
adc_t1 = 0,
adc_t2 = 4,
adc_t3 = 5,
adc_v1 = 6,
adc_v2 = 3,
adc_v3 = 11,
adc_i1 = 7,
adc_i2 = 2,
adc_i3 = 10,
};
uint8_t adc_ch_list[] __xMR = {adc_t1, adc_t2, adc_t3,
adc_v1, adc_v2, adc_v3,
adc_i1, adc_i2, adc_i3
};
#elif defined MMPROT
/* FIXME: to be verified */
enum {
adc_t1 = 0,
adc_t2 = 4,
adc_t3 = 5,
adc_v1 = 6,
adc_v2 = 3,
adc_v3 = 11,
adc_i1 = 7,
adc_i2 = 2,
adc_i3 = 10,
};
uint8_t adc_ch_list[] __xMR = {adc_t1, adc_t2, adc_t3,
adc_v1, adc_v2, adc_v3,
adc_i1, adc_i2, adc_i3
};
#else
#error Exactly one of MMRTSB, MMFANT or MMRATO has to be defined
#endif
uint16_t adc_i __xMR;
uint16_t adc_vals[sizeof(adc_ch_list)];
float temps[3];
float volts[4];
float currs[3];
......@@ -223,10 +303,11 @@ void __xMR update_pwm()
#endif
void __xMR adc_cb(const struct adc_async_descriptor *const descr, const uint8_t channel)
{
adc_async_read_channel(&ADC_0, 0, (uint8_t *)&(adc_vals[adc_ch]), 2);
// debug("ADC has just read ch %u", adc_ch);
adc_async_read_channel(&ADC_0, 0, (uint8_t *)&(adc_vals[adc_i]), 2);
// debug("ADC has just read ch %u", adc_ch_list[adc_i]);
// channels are ordered from AIN0 to AIN11
// breakout board has the temp sensor connected to AIN10 and two pins at AIN4 and AIN5
// prototype mapping:
......@@ -247,7 +328,7 @@ void __xMR adc_cb(const struct adc_async_descriptor *const descr, const uint8_t
#ifdef USE_COAST
#ifdef TEST_TMR
// Test TMR by trying to corrupt the adc_ch variable. By using
// Test TMR by trying to corrupt the adc_i variable. By using
// assembly we trick the TMR logic: it just sees one of the
// three copies be corrupted, fixes it when it's accessed in
// the switch statement below (ADC readout remains unaffected)
......@@ -257,96 +338,87 @@ void __xMR adc_cb(const struct adc_async_descriptor *const descr, const uint8_t
"lsls r4, r4, 8;"
"adds r4, 0x34;"
"strh r4, [%0]"
::"r"(&adc_ch):"r4");
::"r"(&adc_i):"r4");
#endif
#endif
switch (adc_ch) {
case 0:
temps[0] = (VREF*(adc_vals[adc_ch] / ADC_MAX) + temp_coeff_a[0])*temp_coeff_b[0];
switch (adc_ch_list[adc_i]) {
case adc_t1:
temps[0] = (VREF*(adc_vals[adc_i] / ADC_MAX) + temp_coeff_a[0])*temp_coeff_b[0];
#ifdef DEBUG_PID
temps_lin[0] = float_to_linear(PID1.p_factor);
#else
temps_lin[0] = float_to_linear(temps[0]);
#endif
// set MUXPOS and MUXNEG, 0x18 is internal GND
adc_ch = 2;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 2:
currs[1] = VREF*(adc_vals[adc_ch] / ADC_MAX)*curr_scaling_coeff[1];
case adc_i2:
currs[1] = VREF*(adc_vals[adc_i] / ADC_MAX)*curr_scaling_coeff[1];
#ifdef DEBUG_PID
currs_lin[1] = float_to_linear(PID1.output_sum);
#else
currs_lin[1] = float_to_linear(currs[1]);
#endif
adc_ch = 3;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 3:
volts[1] = VREF*(adc_vals[adc_ch] / ADC_MAX)*volt_scaling_coeff[1];
case adc_v2:
volts[1] = VREF*(adc_vals[adc_i] / ADC_MAX)*volt_scaling_coeff[1];
#ifdef USE_LINEAR16
volts_lin[1] = float_to_linear16(volts[1]);
#else
volts_lin[1] = float_to_linear(volts[1]);
#endif
powrs_lin[1] = float_to_linear(volts[1] * currs[1]);
adc_ch = 4;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 4:
temps[1] = (VREF*(adc_vals[adc_ch] / ADC_MAX) + temp_coeff_a[1])*temp_coeff_b[1];
case adc_t2:
temps[1] = (VREF*(adc_vals[adc_i] / ADC_MAX) + temp_coeff_a[1])*temp_coeff_b[1];
#ifdef DEBUG_PID
temps_lin[1] = float_to_linear(PID1.i_factor);
#else
temps_lin[1] = float_to_linear(temps[1]);
#endif
adc_ch = 5;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 5:
temps[2] = (VREF*(adc_vals[adc_ch] / ADC_MAX) + temp_coeff_a[2])*temp_coeff_b[2];
case adc_t3:
temps[2] = (VREF*(adc_vals[adc_i] / ADC_MAX) + temp_coeff_a[2])*temp_coeff_b[2];
#ifdef DEBUG_PID
temps_lin[2] = float_to_linear(PID1.d_factor);
#else
temps_lin[2] = float_to_linear(temps[2]);
#endif
adc_ch = 6;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 6:
volts[0] = VREF*(adc_vals[adc_ch] / ADC_MAX)*volt_scaling_coeff[0];
case adc_v1:
volts[0] = VREF*(adc_vals[adc_i] / ADC_MAX)*volt_scaling_coeff[0];
#ifdef USE_LINEAR16
volts_lin[0] = float_to_linear16(volts[0]);
#else
volts_lin[0] = float_to_linear(volts[0]);
#endif
adc_ch = 7;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 7:
currs[0] = VREF*(adc_vals[adc_ch] / ADC_MAX)*curr_scaling_coeff[0];
case adc_i1:
currs[0] = VREF*(adc_vals[adc_i] / ADC_MAX)*curr_scaling_coeff[0];
#ifdef DEBUG_PID
currs_lin[0] = float_to_linear(PID1.last_input);
#else
currs_lin[0] = float_to_linear(currs[0]);
#endif
powrs_lin[0] = float_to_linear(volts[0] * currs[0]);
adc_ch = 10;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 10:
currs[2] = VREF*(adc_vals[adc_ch] / ADC_MAX)*curr_scaling_coeff[2];
case adc_i3:
currs[2] = VREF*(adc_vals[adc_i] / ADC_MAX)*curr_scaling_coeff[2];
#ifdef DEBUG_PID
currs_lin[2] = float_to_linear(PID1.setpoint);
#else
currs_lin[2] = float_to_linear(currs[2]);
#endif
adc_ch = 11;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
case 11:
volts[2] = VREF*(adc_vals[adc_ch] / ADC_MAX)*volt_scaling_coeff[2];
case adc_v3:
volts[2] = VREF*(adc_vals[adc_i] / ADC_MAX)*volt_scaling_coeff[2];
#ifdef DEBUG_PID
volts_lin[2] = float_to_linear(goal_pwm_duty1000_1);
#else
......@@ -357,27 +429,30 @@ void __xMR adc_cb(const struct adc_async_descriptor *const descr, const uint8_t
# endif
#endif
powrs_lin[2] = float_to_linear(volts[2] * currs[2]);
#ifdef MMRTSB
adc_ch = 18;
#else
adc_ch = 0;
#endif
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
#ifdef MMRTSB
case 18:
volts[3] = VREF*(adc_vals[adc_ch] / ADC_MAX)*volt_scaling_coeff[3];
case adc_v4:
volts[3] = VREF*(adc_vals[adc_i] / ADC_MAX)*volt_scaling_coeff[3];
volts_lin[3] = float_to_linear(volts[3]);
powrs_lin[3] = float_to_linear(0);
adc_ch = 0;
adc_async_set_inputs(&ADC_0, adc_ch, 0x18, 0);
break;
#endif
}
if (adc_ch == 0)
adc_i++;
if (adc_i >= sizeof(adc_ch_list)) {
adc_i = 0;
}
adc_async_set_inputs(&ADC_0, adc_ch_list[adc_i], 0x18, 0);
if (adc_i == 0) {
trig_adc_next_second = 1;
else
} else {
/* trigger conversion for the next channel */
adc_async_start_conversion(&ADC_0);
}
}
static void __xMR mytimercallback(const struct timer_task *const timer_task)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment