You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

933 lines
25 KiB

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4. #include "main.h"
  5. #define DEF_F_BAUD 19200
  6. #define DEF_BAUD 64 * F_CPU / 16 / DEF_F_BAUD
  7. #define ADC_MUXPOS_CARTRIDGE_RESISTANCE ADC_MUXPOS_AIN4_gc
  8. #define ADC_MUXPOS_CARTRIDGE_CURRENT ADC_MUXPOS_AIN7_gc
  9. #define ADC_MUXPOS_CARTRIDGE_TEMPERATURE ADC_MUXPOS_AIN8_gc
  10. #define ADC_MUXPOS_V_IN ADC_MUXPOS_AIN9_gc
  11. #define BUFFER_SIZE (64)
  12. volatile uint8_t debugRxStateMachine = 0x00;
  13. volatile uint8_t debugRxBuffer[BUFFER_SIZE];
  14. volatile uint8_t debugRxBufferIndex = 0;
  15. volatile uint8_t debugRxFrameLength = 0;
  16. volatile uint8_t debugTxStateMachine = 0x00;
  17. volatile uint8_t debugTxBuffer[BUFFER_SIZE];
  18. volatile uint8_t debugTxBufferIndex = 0;
  19. volatile uint8_t debugTxFrameLength = 0;
  20. volatile uint8_t adc_channel = 0;
  21. volatile uint8_t adc_counter = 0;
  22. volatile uint16_t cartridge_temperature_data[8];
  23. volatile uint8_t cartridge_temperature_data_pointer = 0;
  24. //~ volatile uint8_t out_data[32];
  25. //~ volatile uint8_t out_data_pointer = 0;
  26. volatile uint16_t sleep_kp_value = 0;
  27. volatile uint16_t sleep_counter = 0;
  28. volatile uint8_t sleep_state = 1;
  29. volatile uint16_t out_avg = 0;
  30. volatile int8_t out_avg_counter = 0;
  31. #define Kp 30
  32. #define Kd 0
  33. #define Ki 0.5
  34. #define Kit 400
  35. #define errSumMax 1 / Ki * Kit
  36. volatile float controllerKp = 0;
  37. volatile float controllerKpBuff = Kp;
  38. volatile uint8_t controllerKpBuffFlag = 1;
  39. volatile float controllerKd = 0;
  40. volatile float controllerKdBuff = Kd;
  41. volatile uint8_t controllerKdBuffFlag = 1;
  42. volatile float controllerKi = 0;
  43. volatile float controllerKiBuff = Ki;
  44. volatile uint8_t controllerKiBuffFlag = 1;
  45. volatile float controllerKit = 0;
  46. volatile float controllerKitBuff = Kit;
  47. volatile uint8_t controllerKitBuffFlag = 1;
  48. volatile float controllerErrSumMax = 0;
  49. volatile float tSet = 0;
  50. volatile float tSetBuff = 200;
  51. volatile uint8_t tSetBuffFlag = 1;
  52. #define OUT_MAX 800
  53. volatile float tAct = 0;
  54. volatile float err = 0;
  55. volatile float errAlt = 0;
  56. volatile float errSum = 0;
  57. volatile float outOrig = 0;
  58. volatile uint16_t out = 0;
  59. volatile uint16_t outOld = 0;
  60. volatile uint8_t outSettlingCounter = 0;
  61. volatile uint8_t outSettlingState = 0;
  62. volatile uint8_t debugDataEnable = 0;
  63. void DebugAppendData(uint8_t data)
  64. {
  65. if (debugTxStateMachine == 0x00)
  66. {
  67. if (debugTxFrameLength < BUFFER_SIZE)
  68. {
  69. debugTxBuffer[debugTxFrameLength] = data;
  70. debugTxFrameLength++;
  71. }
  72. }
  73. }
  74. void DebugSendData(void)
  75. {
  76. if (debugTxStateMachine == 0x00)
  77. {
  78. debugTxStateMachine = 0x01;
  79. while ((USART0.STATUS & 0b00100000) == 0) {}
  80. USART0.CTRLA |= 0b00100000;
  81. USART0.TXDATAL = 0xff;
  82. }
  83. }
  84. ISR(USART0_RXC_vect)
  85. {
  86. uint8_t data = USART0.RXDATAL;
  87. switch (debugRxStateMachine)
  88. {
  89. case 0x00:
  90. if (data == 0xff)
  91. {
  92. debugRxStateMachine = 0x01;
  93. }
  94. break;
  95. case 0x01:
  96. if (data == 0xf1)
  97. {
  98. debugRxStateMachine = 0x02;
  99. }
  100. else
  101. {
  102. debugRxStateMachine = 0x00;
  103. }
  104. break;
  105. case 0x02:
  106. debugRxFrameLength = data;
  107. if (debugRxFrameLength <= BUFFER_SIZE)
  108. {
  109. debugRxStateMachine = 0x03;
  110. }
  111. else
  112. {
  113. debugRxStateMachine = 0xff;
  114. }
  115. break;
  116. case 0x03:
  117. if (debugRxBufferIndex < BUFFER_SIZE)
  118. {
  119. debugRxBuffer[debugRxBufferIndex] = data;
  120. debugRxBufferIndex++;
  121. if (debugRxBufferIndex >= debugRxFrameLength)
  122. {
  123. debugRxBufferIndex = 0;
  124. debugRxStateMachine = 0x04;
  125. }
  126. }
  127. else
  128. {
  129. debugRxStateMachine = 0xff;
  130. }
  131. break;
  132. default:
  133. break;
  134. }
  135. }
  136. ISR(USART0_DRE_vect)
  137. {
  138. switch (debugTxStateMachine)
  139. {
  140. case 0x01:
  141. debugTxStateMachine = 0x02;
  142. USART0.TXDATAL = 0xf1;
  143. break;
  144. case 0x02:
  145. debugTxStateMachine = 0x03;
  146. debugTxBufferIndex = 0;
  147. USART0.TXDATAL = debugTxFrameLength;
  148. break;
  149. case 0x03:
  150. if (debugTxBufferIndex == debugTxFrameLength - 1)
  151. {
  152. debugTxStateMachine = 0x04;
  153. }
  154. USART0.TXDATAL = debugTxBuffer[debugTxBufferIndex];
  155. debugTxBufferIndex++;
  156. break;
  157. case 0x04:
  158. USART0.CTRLA &= 0b11011111;
  159. debugTxFrameLength = 0;
  160. debugTxStateMachine = 0;
  161. break;
  162. default:
  163. break;
  164. }
  165. }
  166. ISR(ADC0_RESRDY_vect)
  167. {
  168. //~ uint16_t adc_value = ADC0.RES >> 5;
  169. uint16_t adc_value = ADC0.RES;
  170. switch (adc_channel)
  171. {
  172. case 100:
  173. cartridge_temperature_data[cartridge_temperature_data_pointer] = adc_value;
  174. cartridge_temperature_data_pointer++;
  175. cartridge_temperature_data_pointer &= 7;
  176. uint16_t cartridge_temperature = 0;
  177. for (uint8_t i = 0; i < 8; i++)
  178. {
  179. cartridge_temperature += cartridge_temperature_data[i];
  180. }
  181. cartridge_temperature >>= 3;
  182. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  183. if (tSetBuffFlag > 0)
  184. {
  185. tSet = tSetBuff;
  186. tSetBuffFlag = 0;
  187. if (tSet > 250)
  188. {
  189. sleep_state = 0;
  190. sleep_counter = 0;
  191. }
  192. else
  193. {
  194. sleep_state++;
  195. }
  196. }
  197. if (controllerKpBuffFlag > 0)
  198. {
  199. controllerKp = controllerKpBuff;
  200. controllerKpBuffFlag = 0;
  201. sleep_kp_value = (uint16_t) (controllerKp * 2.0);
  202. }
  203. if (controllerKdBuffFlag > 0)
  204. {
  205. controllerKd = controllerKdBuff;
  206. controllerKdBuffFlag = 0;
  207. }
  208. if (controllerKiBuffFlag > 0)
  209. {
  210. if (controllerKiBuff == 0)
  211. {
  212. controllerKiBuff = 1;
  213. }
  214. controllerKi = controllerKiBuff;
  215. controllerErrSumMax = 1 / controllerKi * controllerKit;
  216. controllerKiBuffFlag = 0;
  217. }
  218. if (controllerKitBuffFlag > 0)
  219. {
  220. controllerKit = controllerKitBuff;
  221. controllerErrSumMax = 1 / controllerKi * controllerKit;
  222. controllerKitBuffFlag = 0;
  223. }
  224. float m = 0.4833149757, b = 35.1689715661;
  225. tAct = ((float) cartridge_temperature) * m + b;
  226. err = tSet - tAct;
  227. errSum = errSum + err;
  228. if (errSum < -controllerErrSumMax)
  229. {
  230. errSum = -controllerErrSumMax;
  231. }
  232. if (errSum > controllerErrSumMax)
  233. {
  234. errSum = controllerErrSumMax;
  235. }
  236. outOrig = controllerKp * err + controllerKi * errSum + controllerKd * (err - errAlt);
  237. errAlt = err;
  238. outOld = out;
  239. if (outOrig < 0)
  240. {
  241. out = 0;
  242. }
  243. else if (outOrig > OUT_MAX)
  244. {
  245. out = OUT_MAX;
  246. }
  247. else
  248. {
  249. out = (uint16_t) outOrig;
  250. }
  251. TCA0.SINGLE.CMP0BUF = out;
  252. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  253. if (out == 0 || out == OUT_MAX)
  254. {
  255. outSettlingState = 0;
  256. outSettlingCounter = 0;
  257. }
  258. else
  259. {
  260. if (outSettlingState == 0)
  261. {
  262. outSettlingCounter++;
  263. int16_t outDiff = (int16_t) (out - outOld);
  264. if (outDiff > 25)
  265. {
  266. outSettlingCounter = 0;
  267. }
  268. if (outDiff < -25)
  269. {
  270. outSettlingCounter = 0;
  271. }
  272. if (outSettlingCounter > 180)
  273. {
  274. outSettlingState = 1;
  275. }
  276. }
  277. }
  278. if (outSettlingState == 0)
  279. {
  280. out_avg = out;
  281. }
  282. else
  283. {
  284. if (out > out_avg)
  285. {
  286. if (out < out_avg + sleep_kp_value)
  287. {
  288. out_avg_counter++;
  289. }
  290. //~ out_avg_counter++;
  291. }
  292. else if (out < out_avg)
  293. {
  294. out_avg_counter--;
  295. }
  296. if (out_avg_counter > 10)
  297. {
  298. if (out_avg < 800)
  299. {
  300. out_avg++;
  301. }
  302. out_avg_counter = 0;
  303. }
  304. else if (out_avg_counter < -3)
  305. {
  306. if (out_avg > 0)
  307. {
  308. out_avg--;
  309. }
  310. out_avg_counter = 0;
  311. }
  312. if (sleep_state == 0)
  313. {
  314. sleep_counter++;
  315. }
  316. if (out > out_avg + sleep_kp_value)
  317. {
  318. sleep_counter = 0;
  319. if (sleep_state > 0)
  320. {
  321. tSetBuff = 330;
  322. tSetBuffFlag++;
  323. sleep_state = 0;
  324. }
  325. }
  326. if (sleep_counter > 2350)
  327. {
  328. tSetBuff = 200;
  329. tSetBuffFlag++;
  330. sleep_counter = 0;
  331. sleep_state++;
  332. }
  333. }
  334. //~ if (adc_counter > 4)
  335. //~ {
  336. //~ out_data[out_data_pointer] = (uint8_t) (out >> 2);
  337. //~ out_data_pointer++;
  338. //~ out_data_pointer &= 31;
  339. //~ out_avg = 0;
  340. //~ for (uint8_t i = 0; i < 32; i++)
  341. //~ {
  342. //~ out_avg += out_data[i];
  343. //~ }
  344. //~ out_avg >>= 3;
  345. //~ }
  346. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  347. if (adc_counter > 8)
  348. {
  349. adc_counter = 0;
  350. if (debugDataEnable > 0)
  351. {
  352. DebugAppendData(0x8d);
  353. DebugAppendData((uint8_t) (cartridge_temperature >> 8));
  354. DebugAppendData((uint8_t) (cartridge_temperature));
  355. uint32_t value = *(uint32_t*) &tAct;
  356. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  357. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  358. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  359. DebugAppendData((uint8_t) (value & 0x00FF));
  360. value = *(uint32_t*) &tSet;
  361. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  362. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  363. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  364. DebugAppendData((uint8_t) (value & 0x00FF));
  365. value = *(uint32_t*) &err;
  366. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  367. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  368. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  369. DebugAppendData((uint8_t) (value & 0x00FF));
  370. value = *(uint32_t*) &errSum;
  371. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  372. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  373. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  374. DebugAppendData((uint8_t) (value & 0x00FF));
  375. value = *(uint32_t*) &outOrig;
  376. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  377. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  378. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  379. DebugAppendData((uint8_t) (value & 0x00FF));
  380. DebugAppendData((uint8_t) ((out & 0xFF00) >> 8));
  381. DebugAppendData((uint8_t) (out & 0x00FF));
  382. DebugAppendData((uint8_t) ((out_avg & 0xFF00) >> 8));
  383. DebugAppendData((uint8_t) (out_avg & 0x00FF));
  384. DebugAppendData((uint8_t) ((sleep_counter & 0xFF00) >> 8));
  385. DebugAppendData((uint8_t) (sleep_counter & 0x00FF));
  386. DebugSendData();
  387. }
  388. else
  389. {
  390. DebugAppendData(0x8c);
  391. uint32_t value = *(uint32_t*) &tAct;
  392. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  393. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  394. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  395. DebugAppendData((uint8_t) (value & 0x00FF));
  396. value = *(uint32_t*) &tSet;
  397. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  398. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  399. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  400. DebugAppendData((uint8_t) (value & 0x00FF));
  401. DebugSendData();
  402. }
  403. }
  404. else
  405. {
  406. adc_counter++;
  407. }
  408. break;
  409. default:
  410. break;
  411. }
  412. //~ if (adc_channel < 100)
  413. //~ {
  414. //~ DebugAppendData(0x11);
  415. //~ DebugAppendData(adc_channel);
  416. //~ DebugAppendData((uint8_t) (adc_value >> 8));
  417. //~ DebugAppendData((uint8_t) (adc_value));
  418. //~ DebugSendData();
  419. //~ }
  420. //~ else
  421. //~ {
  422. //~ }
  423. adc_channel = 0;
  424. }
  425. ISR(TCA0_CMP1_vect)
  426. {
  427. TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP1_bm;
  428. VREF.CTRLA = VREF_ADC0REFSEL_1V5_gc | VREF_DAC0REFSEL_0V55_gc;
  429. ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_TEMPERATURE;
  430. _delay_us(10);
  431. ADC0.COMMAND = ADC_STCONV_bm;
  432. adc_channel = 100;
  433. }
  434. int main(void)
  435. {
  436. CPU_CCP = CCP_IOREG_gc;
  437. //~ CLKCTRL.MCLKCTRLB = CLKCTRL_PDIV_4X_gc | CLKCTRL_PEN_bm;
  438. CLKCTRL.MCLKCTRLB = 0;
  439. /*
  440. * PA2: power_mosfet
  441. * PA4: cartridge_resistance_measure (AIN4)
  442. * PA7: cartridge_current_measure (AIN7)
  443. */
  444. PORTA.DIR = 0b00000100;
  445. PORTA.OUT = 0b00000000;
  446. //~ PORTA.INTFLAGS = ;
  447. //~ PORTA.PIN0CTRL = ;
  448. //~ PORTA.PIN1CTRL = ;
  449. //~ PORTA.PIN2CTRL = ;
  450. //~ PORTA.PIN3CTRL = ;
  451. PORTA.PIN4CTRL = PORT_ISC_INPUT_DISABLE_gc;
  452. //~ PORTA.PIN5CTRL = ;
  453. //~ PORTA.PIN6CTRL = ;
  454. PORTA.PIN7CTRL = PORT_ISC_INPUT_DISABLE_gc;
  455. /*
  456. * PB2: TxD
  457. * PB3: RxD
  458. * PB4: v_in_measure (AIN9)
  459. * PB5: cartridge_temperature_measure (AIN8)
  460. */
  461. PORTB.DIR = 0b00000100;
  462. PORTB.OUT = 0b00001000;
  463. //~ PORTB.INTFLAGS = ;
  464. //~ PORTB.PIN0CTRL = ;
  465. //~ PORTB.PIN1CTRL = ;
  466. //~ PORTB.PIN2CTRL = ;
  467. //~ PORTB.PIN3CTRL = ;
  468. PORTB.PIN4CTRL = PORT_ISC_INPUT_DISABLE_gc;
  469. PORTB.PIN5CTRL = PORT_ISC_INPUT_DISABLE_gc;
  470. //~ PORTB.PIN6CTRL = ;
  471. //~ PORTB.PIN7CTRL = ;
  472. /*
  473. * PC0: measure_mosfet
  474. */
  475. PORTC.DIR = 0b00000001;
  476. PORTC.OUT = 0b00000000;
  477. //~ PORTC.INTFLAGS = ;
  478. //~ PORTC.PIN0CTRL = ;
  479. //~ PORTC.PIN1CTRL = ;
  480. //~ PORTC.PIN2CTRL = ;
  481. //~ PORTC.PIN3CTRL = ;
  482. //~ PORTC.PIN4CTRL = ;
  483. //~ PORTC.PIN5CTRL = ;
  484. // configure USART
  485. USART0.BAUD = DEF_BAUD;
  486. USART0.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_SBMODE_1BIT_gc | USART_CHSIZE_8BIT_gc;
  487. USART0.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_RXMODE_NORMAL_gc;
  488. USART0.CTRLA = USART_RXCIE_bm | USART_RS485_OFF_gc;
  489. //~ while (RTC.STATUS > 0) {} // Wait for all register to be synchronized
  490. //~ RTC.CLKSEL = 0b00000000;
  491. //~ //RTC.CNTL = 0;
  492. //~ //RTC.CNTH = 0;
  493. //~ //RTC.CMPL = 10;
  494. //~ //RTC.CMPH = 0;
  495. //~ RTC.PERL = 0;
  496. //~ RTC.PERH = 134;
  497. //~ RTC.INTCTRL = 0b00000010;
  498. //~ RTC.CTRLA = 0b10000001;
  499. // configure VREF
  500. VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc;
  501. VREF.CTRLB = VREF_ADC0REFEN_bm | VREF_DAC0REFEN_bm;
  502. // configure ADC
  503. ADC0.CTRLB = ADC_SAMPNUM_ACC1_gc;
  504. ADC0.CTRLC = ADC_REFSEL_INTREF_gc | ADC_PRESC_DIV256_gc;
  505. ADC0.CTRLD = ADC_INITDLY_DLY0_gc;
  506. ADC0.CTRLE = ADC_WINCM_NONE_gc;
  507. ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_RESISTANCE;
  508. ADC0.INTCTRL = ADC_RESRDY_bm;
  509. ADC0.CTRLA = ADC_ENABLE_bm;
  510. // configure DAC
  511. DAC0.DATA = 112;
  512. DAC0.CTRLA = DAC_RUNSTDBY_bm |DAC_ENABLE_bm;
  513. // configure AC0
  514. AC0.MUXCTRLA = AC_MUXPOS_PIN0_gc | AC_MUXNEG_DAC_gc;
  515. AC0.CTRLA = AC_RUNSTDBY_bm | AC_ENABLE_bm;
  516. //~ AC0.CTRLA = AC_RUNSTDBY_bm | AC_OUTEN_bm | AC_LPMODE_bm | AC_ENABLE_bm;
  517. // configure TCA0
  518. TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_SINGLESLOPE_gc;
  519. TCA0.SINGLE.INTCTRL = TCA_SINGLE_CMP1EN_bm;
  520. TCA0.SINGLE.CNT = 0;
  521. TCA0.SINGLE.PER = 976;
  522. TCA0.SINGLE.CMP0BUF = 0;
  523. TCA0.SINGLE.CMP1BUF = 900;
  524. // configure TCB0
  525. TCB0.CTRLB = TCB_ASYNC_bm | TCB_CCMPEN_bm | TCB_CNTMODE_SINGLE_gc;
  526. TCB0.EVCTRL = TCB_CAPTEI_bm;
  527. TCB0.CCMP = 50;
  528. TCB0.CNT = 0;
  529. // configure CCL
  530. CCL.SEQCTRL0 = CCL_SEQSEL_RS_gc;
  531. //~ CCL.LUT0CTRLB = CCL_INSEL1_AC0_gc | CCL_INSEL0_TCA0_gc;
  532. //~ CCL.TRUTH0 = 0b00001010;
  533. //~ CCL.LUT0CTRLB = CCL_INSEL1_TCB0_gc;
  534. //~ CCL.LUT0CTRLB = CCL_INSEL0_TCA0_gc;
  535. CCL.LUT0CTRLB = CCL_INSEL1_TCB0_gc | CCL_INSEL0_TCA0_gc;
  536. CCL.LUT0CTRLC = CCL_INSEL2_FEEDBACK_gc;
  537. CCL.TRUTH0 = 0b00000010;
  538. CCL.LUT0CTRLA = CCL_EDGEDET_bm | CCL_ENABLE_bm;
  539. //~ CCL.LUT1CTRLB = CCL_INSEL1_AC0_gc | CCL_INSEL0_TCA0_gc;
  540. //~ CCL.TRUTH1 = 0b00001101;
  541. CCL.LUT1CTRLB = CCL_INSEL1_AC0_gc | CCL_INSEL0_TCA0_gc;
  542. CCL.TRUTH1 = 0b00001101;
  543. //~ CCL.LUT1CTRLA = CCL_EDGEDET_bm | CCL_FILTSEL_SYNCH_gc | CCL_ENABLE_bm;
  544. CCL.LUT1CTRLA = CCL_ENABLE_bm;
  545. CCL.CTRLA = CCL_ENABLE_bm;
  546. // configure EVSYS
  547. EVSYS.ASYNCCH0 = EVSYS_ASYNCCH0_CCL_LUT0_gc;
  548. EVSYS.ASYNCCH1 = EVSYS_ASYNCCH1_AC0_OUT_gc;
  549. EVSYS.ASYNCUSER_EVOUT0 = EVSYS_ASYNCUSER_ASYNCCH0_gc;
  550. EVSYS.ASYNCUSER_TCB0 = EVSYS_ASYNCUSER_ASYNCCH1_gc;
  551. //~ EVSYS.ASYNCUSER_CCL_LUT0EV0 = EVSYS_ASYNCUSER_ASYNCCH2_gc;
  552. PORTMUX.CTRLA = PORTMUX_EVOUT0_bm;
  553. sei();
  554. TCB0.CTRLA = TCB_ENABLE_bm;
  555. TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1024_gc | TCA_SINGLE_ENABLE_bm;
  556. //~ _delay_ms(2000);
  557. //~ DebugAppendData(0xab);
  558. //~ DebugAppendData(0xcd);
  559. //~ DebugAppendData(0xef);
  560. //~ DebugSendData();
  561. uint32_t value;
  562. while(1)
  563. {
  564. /*
  565. * debug protocol: 0xff, 0xf1, [length_of_data], [data]
  566. */
  567. if (debugRxStateMachine == 0x04)
  568. {
  569. switch (debugRxBuffer[0])
  570. {
  571. //~ case 0x10:
  572. //~ DebugAppendData(debugRxBuffer[0]);
  573. //~ if (adc_channel == 0)
  574. //~ {
  575. //~ switch (debugRxBuffer[1])
  576. //~ {
  577. //~ case 1:
  578. //~ VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc;
  579. //~ ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_RESISTANCE;
  580. //~ _delay_us(10);
  581. //~ ADC0.COMMAND = ADC_STCONV_bm;
  582. //~ adc_channel = 1;
  583. //~ break;
  584. //~ case 2:
  585. //~ VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc;
  586. //~ ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_CURRENT;
  587. //~ _delay_us(10);
  588. //~ ADC0.COMMAND = ADC_STCONV_bm;
  589. //~ adc_channel = 2;
  590. //~ break;
  591. //~ case 3:
  592. //~ VREF.CTRLA = VREF_ADC0REFSEL_0V55_gc | VREF_DAC0REFSEL_0V55_gc;
  593. //~ ADC0.MUXPOS = ADC_MUXPOS_CARTRIDGE_TEMPERATURE;
  594. //~ _delay_us(10);
  595. //~ ADC0.COMMAND = ADC_STCONV_bm;
  596. //~ adc_channel = 3;
  597. //~ break;
  598. //~ case 4:
  599. //~ VREF.CTRLA = VREF_ADC0REFSEL_4V34_gc | VREF_DAC0REFSEL_0V55_gc;
  600. //~ ADC0.MUXPOS = ADC_MUXPOS_V_IN;
  601. //~ _delay_us(10);
  602. //~ ADC0.COMMAND = ADC_STCONV_bm;
  603. //~ adc_channel = 4;
  604. //~ break;
  605. //~ default:
  606. //~ break;
  607. //~ }
  608. //~ DebugAppendData(adc_channel);
  609. //~ }
  610. //~ else
  611. //~ {
  612. //~ DebugAppendData(255);
  613. //~ }
  614. //~ break;
  615. //~ case 0x20:
  616. //~ DebugAppendData(debugRxBuffer[0]);
  617. //~ if (debugRxBuffer[1] > 0)
  618. //~ {
  619. //~ PORTC.OUTSET = 0b00000001;
  620. //~ DebugAppendData(1);
  621. //~ }
  622. //~ else
  623. //~ {
  624. //~ PORTC.OUTCLR = 0b00000001;
  625. //~ DebugAppendData(0);
  626. //~ }
  627. //~ break;
  628. case 0x33:
  629. DebugAppendData(debugRxBuffer[0]);
  630. debugDataEnable = 1;
  631. break;
  632. case 0x34:
  633. DebugAppendData(debugRxBuffer[0]);
  634. debugDataEnable = 0;
  635. break;
  636. case 0x91:
  637. DebugAppendData(debugRxBuffer[0]);
  638. uint16_t receivedTemperatureSet = (uint16_t) (debugRxBuffer[1] * 256 + debugRxBuffer[2]);
  639. if (receivedTemperatureSet > 400)
  640. {
  641. receivedTemperatureSet = 400;
  642. }
  643. tSetBuff = (float) receivedTemperatureSet;
  644. tSetBuffFlag++;
  645. value = *(uint32_t*) &tSetBuff;
  646. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  647. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  648. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  649. DebugAppendData((uint8_t) (value & 0x00FF));
  650. break;
  651. case 0xa0:
  652. DebugAppendData(debugRxBuffer[0]);
  653. value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]);
  654. controllerKpBuff = *(float*) &value;
  655. controllerKpBuffFlag++;
  656. value = *(uint32_t*) &controllerKpBuff;
  657. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  658. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  659. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  660. DebugAppendData((uint8_t) (value & 0x00FF));
  661. break;
  662. case 0xa1:
  663. DebugAppendData(debugRxBuffer[0]);
  664. value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]);
  665. controllerKiBuff = *(float*) &value;
  666. controllerKiBuffFlag++;
  667. value = *(uint32_t*) &controllerKiBuff;
  668. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  669. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  670. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  671. DebugAppendData((uint8_t) (value & 0x00FF));
  672. break;
  673. case 0xa2:
  674. DebugAppendData(debugRxBuffer[0]);
  675. value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]);
  676. controllerKdBuff = *(float*) &value;
  677. controllerKdBuffFlag++;
  678. value = *(uint32_t*) &controllerKdBuff;
  679. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  680. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  681. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  682. DebugAppendData((uint8_t) (value & 0x00FF));
  683. break;
  684. case 0xa3:
  685. DebugAppendData(debugRxBuffer[0]);
  686. value = ((uint32_t) debugRxBuffer[1]) << 24 | ((uint32_t) debugRxBuffer[2]) << 16 | ((uint32_t) debugRxBuffer[3]) << 8 | ((uint32_t) debugRxBuffer[4]);
  687. controllerKitBuff = *(float*) &value;
  688. controllerKitBuffFlag++;
  689. value = *(uint32_t*) &controllerKitBuff;
  690. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  691. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  692. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  693. DebugAppendData((uint8_t) (value & 0x00FF));
  694. break;
  695. case 0xf0:
  696. DebugAppendData(debugRxBuffer[0]);
  697. value = *(uint32_t*) &tSet;
  698. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  699. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  700. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  701. DebugAppendData((uint8_t) (value & 0x00FF));
  702. value = *(uint32_t*) &controllerKp;
  703. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  704. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  705. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  706. DebugAppendData((uint8_t) (value & 0x00FF));
  707. value = *(uint32_t*) &controllerKi;
  708. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  709. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  710. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  711. DebugAppendData((uint8_t) (value & 0x00FF));
  712. value = *(uint32_t*) &controllerKd;
  713. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  714. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  715. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  716. DebugAppendData((uint8_t) (value & 0x00FF));
  717. value = *(uint32_t*) &controllerKit;
  718. DebugAppendData((uint8_t) ((value & 0xFF000000) >> 24));
  719. DebugAppendData((uint8_t) ((value & 0xFF0000) >> 16));
  720. DebugAppendData((uint8_t) ((value & 0xFF00) >> 8));
  721. DebugAppendData((uint8_t) (value & 0x00FF));
  722. break;
  723. default:
  724. DebugAppendData(0xff);
  725. DebugAppendData(0xde);
  726. DebugAppendData(0xad);
  727. DebugAppendData(0xbe);
  728. DebugAppendData(0xef);
  729. break;
  730. }
  731. DebugSendData();
  732. debugRxFrameLength = 0;
  733. debugRxStateMachine = 0x00;
  734. }
  735. }
  736. }