#include <avr/io.h>
|
|
#include <avr/interrupt.h>
|
|
#include <util/delay.h>
|
|
|
|
#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;
|
|
}
|
|
}
|
|
}
|