#include #include #include #include "main.h" #define DEF_F_BAUD 19200 #define DEF_BAUD 64 * F_CPU / 16 / DEF_F_BAUD #define ADC_MUXPOS_CARTRIDGE_RESISTANCE ADC_MUXPOS_AIN4_gc #define ADC_MUXPOS_CARTRIDGE_CURRENT ADC_MUXPOS_AIN7_gc #define ADC_MUXPOS_CARTRIDGE_TEMPERATURE ADC_MUXPOS_AIN8_gc #define ADC_MUXPOS_V_IN ADC_MUXPOS_AIN9_gc #define BUFFER_SIZE (64) volatile uint8_t debugRxStateMachine = 0x00; volatile uint8_t debugRxBuffer[BUFFER_SIZE]; volatile uint8_t debugRxBufferIndex = 0; volatile uint8_t debugRxFrameLength = 0; volatile uint8_t debugTxStateMachine = 0x00; volatile uint8_t debugTxBuffer[BUFFER_SIZE]; volatile uint8_t debugTxBufferIndex = 0; volatile uint8_t debugTxFrameLength = 0; volatile uint8_t adc_channel = 0; volatile uint8_t adc_counter = 0; volatile uint16_t cartridge_temperature_data[8]; volatile uint8_t cartridge_temperature_data_pointer = 0; //~ volatile uint8_t out_data[32]; //~ volatile uint8_t out_data_pointer = 0; volatile uint16_t sleep_kp_value = 0; volatile uint16_t sleep_counter = 0; volatile uint8_t sleep_state = 1; volatile uint16_t out_avg = 0; volatile int8_t out_avg_counter = 0; #define Kp 30 #define Kd 0 #define Ki 0.5 #define Kit 400 #define errSumMax 1 / Ki * Kit volatile float controllerKp = 0; volatile float controllerKpBuff = Kp; volatile uint8_t controllerKpBuffFlag = 1; volatile float controllerKd = 0; volatile float controllerKdBuff = Kd; volatile uint8_t controllerKdBuffFlag = 1; volatile float controllerKi = 0; volatile float controllerKiBuff = Ki; volatile uint8_t controllerKiBuffFlag = 1; volatile float controllerKit = 0; volatile float controllerKitBuff = Kit; volatile uint8_t controllerKitBuffFlag = 1; volatile float controllerErrSumMax = 0; volatile float tSet = 0; volatile float tSetBuff = 200; volatile uint8_t tSetBuffFlag = 1; #define OUT_MAX 800 volatile float tAct = 0; volatile float err = 0; volatile float errAlt = 0; volatile float errSum = 0; volatile float outOrig = 0; volatile uint16_t out = 0; volatile uint16_t outOld = 0; volatile uint8_t outSettlingCounter = 0; volatile uint8_t outSettlingState = 0; volatile uint8_t debugDataEnable = 0; void DebugAppendData(uint8_t data) { if (debugTxStateMachine == 0x00) { if (debugTxFrameLength < BUFFER_SIZE) { debugTxBuffer[debugTxFrameLength] = data; debugTxFrameLength++; } } } void DebugSendData(void) { if (debugTxStateMachine == 0x00) { debugTxStateMachine = 0x01; while ((USART0.STATUS & 0b00100000) == 0) {} USART0.CTRLA |= 0b00100000; USART0.TXDATAL = 0xff; } } ISR(USART0_RXC_vect) { uint8_t data = USART0.RXDATAL; switch (debugRxStateMachine) { case 0x00: if (data == 0xff) { debugRxStateMachine = 0x01; } break; case 0x01: if (data == 0xf1) { debugRxStateMachine = 0x02; } else { debugRxStateMachine = 0x00; } break; case 0x02: debugRxFrameLength = data; if (debugRxFrameLength <= BUFFER_SIZE) { debugRxStateMachine = 0x03; } else { debugRxStateMachine = 0xff; } break; case 0x03: if (debugRxBufferIndex < BUFFER_SIZE) { debugRxBuffer[debugRxBufferIndex] = data; debugRxBufferIndex++; if (debugRxBufferIndex >= debugRxFrameLength) { debugRxBufferIndex = 0; debugRxStateMachine = 0x04; } } else { debugRxStateMachine = 0xff; } break; default: break; } } ISR(USART0_DRE_vect) { switch (debugTxStateMachine) { case 0x01: debugTxStateMachine = 0x02; USART0.TXDATAL = 0xf1; break; case 0x02: debugTxStateMachine = 0x03; debugTxBufferIndex = 0; USART0.TXDATAL = debugTxFrameLength; break; case 0x03: if (debugTxBufferIndex == debugTxFrameLength - 1) { debugTxStateMachine = 0x04; } USART0.TXDATAL = debugTxBuffer[debugTxBufferIndex]; debugTxBufferIndex++; break; case 0x04: USART0.CTRLA &= 0b11011111; debugTxFrameLength = 0; debugTxStateMachine = 0; break; default: break; } } ISR(ADC0_RESRDY_vect) { //~ uint16_t adc_value = ADC0.RES >> 5; uint16_t adc_value = ADC0.RES; switch (adc_channel) { case 100: cartridge_temperature_data[cartridge_temperature_data_pointer] = adc_value; cartridge_temperature_data_pointer++; cartridge_temperature_data_pointer &= 7; uint16_t cartridge_temperature = 0; for (uint8_t i = 0; i < 8; i++) { cartridge_temperature += cartridge_temperature_data[i]; } cartridge_temperature >>= 3; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (tSetBuffFlag > 0) { tSet = tSetBuff; tSetBuffFlag = 0; if (tSet > 250) { sleep_state = 0; sleep_counter = 0; } else { sleep_state++; } } if (controllerKpBuffFlag > 0) { controllerKp = controllerKpBuff; controllerKpBuffFlag = 0; sleep_kp_value = (uint16_t) (controllerKp * 2.0); } if (controllerKdBuffFlag > 0) { controllerKd = controllerKdBuff; controllerKdBuffFlag = 0; } if (controllerKiBuffFlag > 0) { if (controllerKiBuff == 0) { controllerKiBuff = 1; } controllerKi = controllerKiBuff; controllerErrSumMax = 1 / controllerKi * controllerKit; controllerKiBuffFlag = 0; } if (controllerKitBuffFlag > 0) { controllerKit = controllerKitBuff; controllerErrSumMax = 1 / controllerKi * controllerKit; controllerKitBuffFlag = 0; } float m = 0.4833149757, b = 35.1689715661; tAct = ((float) cartridge_temperature) * m + b; err = tSet - tAct; errSum = errSum + err; if (errSum < -controllerErrSumMax) { errSum = -controllerErrSumMax; } if (errSum > controllerErrSumMax) { errSum = controllerErrSumMax; } outOrig = controllerKp * err + controllerKi * errSum + controllerKd * (err - errAlt); errAlt = err; outOld = out; if (outOrig < 0) { out = 0; } else if (outOrig > OUT_MAX) { out = OUT_MAX; } else { out = (uint16_t) outOrig; } TCA0.SINGLE.CMP0BUF = out; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (out == 0 || out == OUT_MAX) { outSettlingState = 0; outSettlingCounter = 0; } else { if (outSettlingState == 0) { outSettlingCounter++; int16_t outDiff = (int16_t) (out - outOld); if (outDiff > 25) { outSettlingCounter = 0; } if (outDiff < -25) { outSettlingCounter = 0; } if (outSettlingCounter > 180) { outSettlingState = 1; } } } if (outSettlingState == 0) { out_avg = out; } else { if (out > out_avg) { if (out < out_avg + sleep_kp_value) { out_avg_counter++; } //~ out_avg_counter++; } else if (out < out_avg) { out_avg_counter--; } if (out_avg_counter > 10) { if (out_avg < 800) { out_avg++; } out_avg_counter = 0; } else if (out_avg_counter < -3) { if (out_avg > 0) { out_avg--; } out_avg_counter = 0; } if (sleep_state == 0) { sleep_counter++; } if (out > out_avg + sleep_kp_value) { sleep_counter = 0; if (sleep_state > 0) { tSetBuff = 330; tSetBuffFlag++; sleep_state = 0; } } if (sleep_counter > 2350) { tSetBuff = 200; tSetBuffFlag++; sleep_counter = 0; sleep_state++; } } //~ if (adc_counter > 4) //~ { //~ out_data[out_data_pointer] = (uint8_t) (out >> 2); //~ out_data_pointer++; //~ out_data_pointer &= 31; //~ out_avg = 0; //~ for (uint8_t i = 0; i < 32; i++) //~ { //~ out_avg += out_data[i]; //~ } //~ out_avg >>= 3; //~ } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (adc_counter > 8) { adc_counter = 0; if (debugDataEnable > 0) { DebugAppendData(0x8d); DebugAppendData((uint8_t) (cartridge_temperature >> 8)); DebugAppendData((uint8_t) (cartridge_temperature)); uint32_t value = *(uint32_t*) &tAct; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &tSet; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &err; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &errSum; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &outOrig; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); DebugAppendData((uint8_t) ((out & 0xFF00) >> 8)); DebugAppendData((uint8_t) (out & 0x00FF)); DebugAppendData((uint8_t) ((out_avg & 0xFF00) >> 8)); DebugAppendData((uint8_t) (out_avg & 0x00FF)); DebugAppendData((uint8_t) ((sleep_counter & 0xFF00) >> 8)); DebugAppendData((uint8_t) (sleep_counter & 0x00FF)); DebugSendData(); } else { DebugAppendData(0x8c); uint32_t value = *(uint32_t*) &tAct; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &tSet; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); DebugSendData(); } } else { adc_counter++; } break; default: break; } //~ if (adc_channel < 100) //~ { //~ DebugAppendData(0x11); //~ DebugAppendData(adc_channel); //~ DebugAppendData((uint8_t) (adc_value >> 8)); //~ DebugAppendData((uint8_t) (adc_value)); //~ DebugSendData(); //~ } //~ else //~ { //~ } adc_channel = 0; } ISR(TCA0_CMP1_vect) { TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm; VREF.CTRLA = VREF_ADC0REFSEL_1V5_gc | VREF_DAC0REFSEL_0V55_gc; ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_TEMPERATURE; _delay_us(10); ADC0.COMMAND = ADC_STCONV_bm; adc_channel = 100; } int main(void) { CPU_CCP = CCP_IOREG_gc; //~ CLKCTRL.MCLKCTRLB = CLKCTRL_PDIV_4X_gc | CLKCTRL_PEN_bm; CLKCTRL.MCLKCTRLB = 0; /* * PA2: power_mosfet * PA4: cartridge_resistance_measure (AIN4) * PA7: cartridge_current_measure (AIN7) */ PORTA.DIR = 0b00000100; PORTA.OUT = 0b00000000; //~ PORTA.INTFLAGS = ; //~ PORTA.PIN0CTRL = ; //~ PORTA.PIN1CTRL = ; //~ PORTA.PIN2CTRL = ; //~ PORTA.PIN3CTRL = ; PORTA.PIN4CTRL = PORT_ISC_INPUT_DISABLE_gc; //~ PORTA.PIN5CTRL = ; //~ PORTA.PIN6CTRL = ; PORTA.PIN7CTRL = PORT_ISC_INPUT_DISABLE_gc; /* * PB2: TxD * PB3: RxD * PB4: v_in_measure (AIN9) * PB5: cartridge_temperature_measure (AIN8) */ PORTB.DIR = 0b00000100; PORTB.OUT = 0b00001000; //~ PORTB.INTFLAGS = ; //~ PORTB.PIN0CTRL = ; //~ PORTB.PIN1CTRL = ; //~ PORTB.PIN2CTRL = ; //~ PORTB.PIN3CTRL = ; PORTB.PIN4CTRL = PORT_ISC_INPUT_DISABLE_gc; PORTB.PIN5CTRL = PORT_ISC_INPUT_DISABLE_gc; //~ PORTB.PIN6CTRL = ; //~ PORTB.PIN7CTRL = ; /* * PC0: measure_mosfet */ PORTC.DIR = 0b00000001; PORTC.OUT = 0b00000000; //~ PORTC.INTFLAGS = ; //~ PORTC.PIN0CTRL = ; //~ PORTC.PIN1CTRL = ; //~ PORTC.PIN2CTRL = ; //~ PORTC.PIN3CTRL = ; //~ PORTC.PIN4CTRL = ; //~ PORTC.PIN5CTRL = ; // configure USART USART0.BAUD = DEF_BAUD; USART0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_SBMODE_1BIT_gc | USART_CHSIZE_8BIT_gc; USART0.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_RXMODE_NORMAL_gc; USART0.CTRLA = USART_RXCIE_bm | USART_RS485_OFF_gc; //~ while (RTC.STATUS > 0) {} // Wait for all register to be synchronized //~ RTC.CLKSEL = 0b00000000; //~ //RTC.CNTL = 0; //~ //RTC.CNTH = 0; //~ //RTC.CMPL = 10; //~ //RTC.CMPH = 0; //~ RTC.PERL = 0; //~ RTC.PERH = 134; //~ RTC.INTCTRL = 0b00000010; //~ RTC.CTRLA = 0b10000001; // configure VREF VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc; VREF.CTRLB = VREF_ADC0REFEN_bm | VREF_DAC0REFEN_bm; // configure ADC ADC0.CTRLB = ADC_SAMPNUM_ACC1_gc; ADC0.CTRLC = ADC_REFSEL_INTREF_gc | ADC_PRESC_DIV256_gc; ADC0.CTRLD = ADC_INITDLY_DLY0_gc; ADC0.CTRLE = ADC_WINCM_NONE_gc; ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_RESISTANCE; ADC0.INTCTRL = ADC_RESRDY_bm; ADC0.CTRLA = ADC_ENABLE_bm; // configure DAC DAC0.DATA = 112; DAC0.CTRLA = DAC_RUNSTDBY_bm |DAC_ENABLE_bm; // configure AC0 AC0.MUXCTRLA = AC_MUXPOS_PIN0_gc | AC_MUXNEG_DAC_gc; AC0.CTRLA = AC_RUNSTDBY_bm | AC_ENABLE_bm; //~ AC0.CTRLA = AC_RUNSTDBY_bm | AC_OUTEN_bm | AC_LPMODE_bm | AC_ENABLE_bm; // configure TCA0 TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_SINGLESLOPE_gc; TCA0.SINGLE.INTCTRL = TCA_SINGLE_CMP1EN_bm; TCA0.SINGLE.CNT = 0; TCA0.SINGLE.PER = 976; TCA0.SINGLE.CMP0BUF = 0; TCA0.SINGLE.CMP1BUF = 900; // configure TCB0 TCB0.CTRLB = TCB_ASYNC_bm | TCB_CCMPEN_bm | TCB_CNTMODE_SINGLE_gc; TCB0.EVCTRL = TCB_CAPTEI_bm; TCB0.CCMP = 50; TCB0.CNT = 0; // configure CCL CCL.SEQCTRL0 = CCL_SEQSEL_RS_gc; //~ CCL.LUT0CTRLB = CCL_INSEL1_AC0_gc | CCL_INSEL0_TCA0_gc; //~ CCL.TRUTH0 = 0b00001010; //~ CCL.LUT0CTRLB = CCL_INSEL1_TCB0_gc; //~ CCL.LUT0CTRLB = CCL_INSEL0_TCA0_gc; CCL.LUT0CTRLB = CCL_INSEL1_TCB0_gc | CCL_INSEL0_TCA0_gc; CCL.LUT0CTRLC = CCL_INSEL2_FEEDBACK_gc; CCL.TRUTH0 = 0b00000010; CCL.LUT0CTRLA = CCL_EDGEDET_bm | CCL_ENABLE_bm; //~ CCL.LUT1CTRLB = CCL_INSEL1_AC0_gc | CCL_INSEL0_TCA0_gc; //~ CCL.TRUTH1 = 0b00001101; CCL.LUT1CTRLB = CCL_INSEL1_AC0_gc | CCL_INSEL0_TCA0_gc; CCL.TRUTH1 = 0b00001101; //~ CCL.LUT1CTRLA = CCL_EDGEDET_bm | CCL_FILTSEL_SYNCH_gc | CCL_ENABLE_bm; CCL.LUT1CTRLA = CCL_ENABLE_bm; CCL.CTRLA = CCL_ENABLE_bm; // configure EVSYS EVSYS.ASYNCCH0 = EVSYS_ASYNCCH0_CCL_LUT0_gc; EVSYS.ASYNCCH1 = EVSYS_ASYNCCH1_AC0_OUT_gc; EVSYS.ASYNCUSER_EVOUT0 = EVSYS_ASYNCUSER_ASYNCCH0_gc; EVSYS.ASYNCUSER_TCB0 = EVSYS_ASYNCUSER_ASYNCCH1_gc; //~ EVSYS.ASYNCUSER_CCL_LUT0EV0 = EVSYS_ASYNCUSER_ASYNCCH2_gc; PORTMUX.CTRLA = PORTMUX_EVOUT0_bm; sei(); TCB0.CTRLA = TCB_ENABLE_bm; TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1024_gc | TCA_SINGLE_ENABLE_bm; //~ _delay_ms(2000); //~ DebugAppendData(0xab); //~ DebugAppendData(0xcd); //~ DebugAppendData(0xef); //~ DebugSendData(); uint32_t value; while(1) { /* * debug protocol: 0xff, 0xf1, [length_of_data], [data] */ if (debugRxStateMachine == 0x04) { switch (debugRxBuffer[0]) { //~ case 0x10: //~ DebugAppendData(debugRxBuffer[0]); //~ if (adc_channel == 0) //~ { //~ switch (debugRxBuffer[1]) //~ { //~ case 1: //~ VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc; //~ ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_RESISTANCE; //~ _delay_us(10); //~ ADC0.COMMAND = ADC_STCONV_bm; //~ adc_channel = 1; //~ break; //~ case 2: //~ VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc; //~ ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_CURRENT; //~ _delay_us(10); //~ ADC0.COMMAND = ADC_STCONV_bm; //~ adc_channel = 2; //~ break; //~ case 3: //~ VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc; //~ ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_TEMPERATURE; //~ _delay_us(10); //~ ADC0.COMMAND = ADC_STCONV_bm; //~ adc_channel = 3; //~ break; //~ case 4: //~ VREF.CTRLA = VREF_ADC0REFSEL_4V34_gc | VREF_DAC0REFSEL_0V55_gc; //~ ADC0.MUXPOS = ADC_MUXPOS_V_IN; //~ _delay_us(10); //~ ADC0.COMMAND = ADC_STCONV_bm; //~ adc_channel = 4; //~ break; //~ default: //~ break; //~ } //~ DebugAppendData(adc_channel); //~ } //~ else //~ { //~ DebugAppendData(255); //~ } //~ break; //~ case 0x20: //~ DebugAppendData(debugRxBuffer[0]); //~ if (debugRxBuffer[1] > 0) //~ { //~ PORTC.OUTSET = 0b00000001; //~ DebugAppendData(1); //~ } //~ else //~ { //~ PORTC.OUTCLR = 0b00000001; //~ DebugAppendData(0); //~ } //~ break; case 0x33: DebugAppendData(debugRxBuffer[0]); debugDataEnable = 1; break; case 0x34: DebugAppendData(debugRxBuffer[0]); debugDataEnable = 0; break; case 0x91: DebugAppendData(debugRxBuffer[0]); uint16_t receivedTemperatureSet = (uint16_t) (debugRxBuffer[1] * 256 + debugRxBuffer[2]); if (receivedTemperatureSet > 400) { receivedTemperatureSet = 400; } tSetBuff = (float) receivedTemperatureSet; tSetBuffFlag++; value = *(uint32_t*) &tSetBuff; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); break; case 0xa0: DebugAppendData(debugRxBuffer[0]); value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]); controllerKpBuff = *(float*) &value; controllerKpBuffFlag++; value = *(uint32_t*) &controllerKpBuff; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); break; case 0xa1: DebugAppendData(debugRxBuffer[0]); value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]); controllerKiBuff = *(float*) &value; controllerKiBuffFlag++; value = *(uint32_t*) &controllerKiBuff; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); break; case 0xa2: DebugAppendData(debugRxBuffer[0]); value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]); controllerKdBuff = *(float*) &value; controllerKdBuffFlag++; value = *(uint32_t*) &controllerKdBuff; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); break; case 0xa3: DebugAppendData(debugRxBuffer[0]); value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]); controllerKitBuff = *(float*) &value; controllerKitBuffFlag++; value = *(uint32_t*) &controllerKitBuff; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); break; case 0xf0: DebugAppendData(debugRxBuffer[0]); value = *(uint32_t*) &tSet; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &controllerKp; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &controllerKi; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &controllerKd; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); value = *(uint32_t*) &controllerKit; DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24)); DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16)); DebugAppendData((uint8_t) ((value & 0xFF00) >> 8)); DebugAppendData((uint8_t) (value & 0x00FF)); break; default: DebugAppendData(0xff); DebugAppendData(0xde); DebugAppendData(0xad); DebugAppendData(0xbe); DebugAppendData(0xef); break; } DebugSendData(); debugRxFrameLength = 0; debugRxStateMachine = 0x00; } } }