Browse Source

refactored code, moved user-relevant defines to config.h

master
Niklas Fauth 4 years ago
parent
commit
94907b91cf
  1. 3
      .gitignore
  2. 21
      Inc/config.h
  3. 9
      Inc/defines.h
  4. 22
      Makefile
  5. 218
      Src/bldc.c
  6. 50
      Src/comms.c
  7. 235
      Src/main.c
  8. 9
      Src/setup.c
  9. 782
      build/hover.hex

3
.gitignore vendored

@ -1 +1,2 @@ @@ -1 +1,2 @@
build/
build/*
!build/hover.hex

21
Inc/config.h

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
#pragma once
#include "stm32f1xx_hal.h"
#define R 0.27
#define P 15
#define PSI 0.02
#define V 23
#define MILLI_R (R * 1000)
#define MILLI_PSI (PSI * 1000)
#define MILLI_V (V * 1000)
#define PWM_FREQ 16000 // PWM frequency in Hz
#define DEAD_TIME 32 // PWM deadtime
#define DC_CUR_LIMIT 5 // Motor DC current limit in amps
#define DEBUG_SERIAL_SERVOTERM
//#define DEBUG_SERIAL_ASCII
#define DEBUG_BAUD 115200 // UART baud rate
//#define DEBUG_I2C_LCD

9
Inc/defines.h

@ -117,13 +117,8 @@ @@ -117,13 +117,8 @@
#define CHARGER_PIN GPIO_PIN_12
#define CHARGER_PORT GPIOA
#define PWM_FREQ 16000
#define DEAD_TIME 32
#define R 0.27
#define P 15
#define PSI 0.02
#define V 23
#define MOTOR_AMP_CONV_DC_AMP 0.02
#define ADC_BATTERY_VOLT 0.02647435897435897435897435897436
#define MILLI_R (R * 1000)
#define MILLI_PSI (PSI * 1000)

22
Makefile

@ -37,6 +37,8 @@ Src/system_stm32f1xx.c \ @@ -37,6 +37,8 @@ Src/system_stm32f1xx.c \
Src/setup.c \
Src/stm32f1xx_it.c \
Src/main.c \
Src/bldc.c \
Src/comms.c \
# ASM sources
ASM_SOURCES = \
@ -53,7 +55,7 @@ AR = $(PREFIX)ar @@ -53,7 +55,7 @@ AR = $(PREFIX)ar
SZ = $(PREFIX)size
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
#######################################
# CFLAGS
#######################################
@ -71,7 +73,7 @@ MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) @@ -71,7 +73,7 @@ MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
# macros for gcc
# AS defines
AS_DEFS =
AS_DEFS =
# C defines
C_DEFS = \
@ -80,7 +82,7 @@ C_DEFS = \ @@ -80,7 +82,7 @@ C_DEFS = \
# AS includes
AS_INCLUDES =
AS_INCLUDES =
# C includes
C_INCLUDES = \
@ -130,7 +132,7 @@ vpath %.c $(sort $(dir $(C_SOURCES))) @@ -130,7 +132,7 @@ vpath %.c $(sort $(dir $(C_SOURCES)))
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
@ -142,12 +144,12 @@ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile @@ -142,12 +144,12 @@ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(HEX) $< $@
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(BIN) $< $@
$(BIN) $< $@
$(BUILD_DIR):
mkdir $@
mkdir $@
format:
find Src/ Inc/ -iname '*.h' -o -iname '*.c' | xargs clang-format -i
@ -156,10 +158,10 @@ format: @@ -156,10 +158,10 @@ format:
#######################################
clean:
-rm -fR .dep $(BUILD_DIR)
#######################################
# dependencies
#######################################
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
# *** EOF ***
# *** EOF ***

218
Src/bldc.c

@ -0,0 +1,218 @@ @@ -0,0 +1,218 @@
#include "stm32f1xx_hal.h"
#include "defines.h"
#include "setup.h"
#include "config.h"
volatile int posl = 0;
volatile int posr = 0;
volatile int pwml = 0;
volatile int pwmr = 0;
extern volatile adc_buf_t adc_buffer;
const int pwm_res = 64000000 / 2 / PWM_FREQ; // = 2000
const uint8_t hall_to_pos[8] = {
0,
0,
2,
1,
4,
5,
3,
0,
};
inline void blockPWM(int pwm, int pos, int *u, int *v, int *w) {
switch(pos) {
case 0:
*u = 0;
*v = pwm;
*w = -pwm;
break;
case 1:
*u = -pwm;
*v = pwm;
*w = 0;
break;
case 2:
*u = -pwm;
*v = 0;
*w = pwm;
break;
case 3:
*u = 0;
*v = -pwm;
*w = pwm;
break;
case 4:
*u = pwm;
*v = -pwm;
*w = 0;
break;
case 5:
*u = pwm;
*v = 0;
*w = -pwm;
break;
default:
*u = 0;
*v = 0;
*w = 0;
}
}
inline void blockPhaseCurrent(int pos, int u, int v, int *q) {
switch(pos) {
case 0:
*q = u - v;
// *u = 0;
// *v = pwm;
// *w = -pwm;
break;
case 1:
*q = u;
// *u = -pwm;
// *v = pwm;
// *w = 0;
break;
case 2:
*q = u;
// *u = -pwm;
// *v = 0;
// *w = pwm;
break;
case 3:
*q = v;
// *u = 0;
// *v = -pwm;
// *w = pwm;
break;
case 4:
*q = v;
// *u = pwm;
// *v = -pwm;
// *w = 0;
break;
case 5:
*q = -(u - v);
// *u = pwm;
// *v = 0;
// *w = -pwm;
break;
default:
*q = 0;
// *u = 0;
// *v = 0;
// *w = 0;
}
}
int last_pos = 0;
int timer = 0;
int max_time = PWM_FREQ / 10;
volatile int vel = 0;
int offsetcount = 0;
int offsetrl1 = 2000;
int offsetrl2 = 2000;
int offsetrr1 = 2000;
int offsetrr2 = 2000;
int offsetdcl = 2000;
int offsetdcr = 2000;
int curl = 0;
// int errorl = 0;
// int kp = 5;
// volatile int cmdl = 0;
void DMA1_Channel1_IRQHandler() {
DMA1->IFCR = DMA_IFCR_CTCIF1;
// HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1);
if(offsetcount < 1000) { // calibrate ADC offsets
offsetcount++;
offsetrl1 = (adc_buffer.rl1 + offsetrl1) / 2;
offsetrl2 = (adc_buffer.rl2 + offsetrl2) / 2;
offsetrr1 = (adc_buffer.rr1 + offsetrr1) / 2;
offsetrr2 = (adc_buffer.rr2 + offsetrr2) / 2;
offsetdcl = (adc_buffer.dcl + offsetdcl) / 2;
offsetdcr = (adc_buffer.dcr + offsetdcr) / 2;
return;
}
if((adc_buffer.dcl - offsetdcl) * MOTOR_AMP_CONV_DC_AMP > DC_CUR_LIMIT) {
LEFT_TIM->BDTR &= ~TIM_BDTR_MOE;
//HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1);
} else {
LEFT_TIM->BDTR |= TIM_BDTR_MOE;
//HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0);
}
if((adc_buffer.dcr - offsetdcr) * MOTOR_AMP_CONV_DC_AMP > DC_CUR_LIMIT) {
RIGHT_TIM->BDTR &= ~TIM_BDTR_MOE;
} else {
RIGHT_TIM->BDTR |= TIM_BDTR_MOE;
}
int ul, vl, wl;
int ur, vr, wr;
uint8_t hall_ul = !(LEFT_HALL_U_PORT->IDR & LEFT_HALL_U_PIN);
uint8_t hall_vl = !(LEFT_HALL_V_PORT->IDR & LEFT_HALL_V_PIN);
uint8_t hall_wl = !(LEFT_HALL_W_PORT->IDR & LEFT_HALL_W_PIN);
uint8_t hall_ur = !(RIGHT_HALL_U_PORT->IDR & RIGHT_HALL_U_PIN);
uint8_t hall_vr = !(RIGHT_HALL_V_PORT->IDR & RIGHT_HALL_V_PIN);
uint8_t hall_wr = !(RIGHT_HALL_W_PORT->IDR & RIGHT_HALL_W_PIN);
uint8_t halll = hall_ul * 1 + hall_vl * 2 + hall_wl * 4;
posl = hall_to_pos[halll];
posl += 2;
posl %= 6;
uint8_t hallr = hall_ur * 1 + hall_vr * 2 + hall_wr * 4;
posr = hall_to_pos[hallr];
posr += 2;
posr %= 6;
blockPhaseCurrent(posl, adc_buffer.rl1 - offsetrl1, adc_buffer.rl2 - offsetrl2, &curl);
consoleScope(0, 0, (adc_buffer.rl1 - offsetrl1) / 8, (adc_buffer.rl2 - offsetrl1) / 8, 0, 0, 0, 0);
timer++;
// if(timer > max_time){
// timer = max_time;
// vel = 0;
// }
// if(pos != last_pos){
// vel = 1000 * PWM_FREQ / timer / P / 6 * 2;
// if((pos - last_pos + 6) % 6 > 2){
// vel = -vel;
// }
// timer = 0;
// }
// last_pos = pos;
//YOLOTEST
// errorl = cmdl - curl;
// pwml = kp * errorl;
blockPWM(pwml, posl, &ul, &vl, &wl);
blockPWM(pwmr, posr, &ur, &vr, &wr);
LEFT_TIM->LEFT_TIM_U = CLAMP(ul + pwm_res / 2, 10, pwm_res-10);
LEFT_TIM->LEFT_TIM_V = CLAMP(vl + pwm_res / 2, 10, pwm_res-10);
LEFT_TIM->LEFT_TIM_W = CLAMP(wl + pwm_res / 2, 10, pwm_res-10);
RIGHT_TIM->RIGHT_TIM_U = CLAMP(ur + pwm_res / 2, 10, pwm_res-10);
RIGHT_TIM->RIGHT_TIM_V = CLAMP(vr + pwm_res / 2, 10, pwm_res-10);
RIGHT_TIM->RIGHT_TIM_W = CLAMP(wr + pwm_res / 2, 10, pwm_res-10);
// HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0);blockPhaseCurrent
}

50
Src/comms.c

@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
#include "stm32f1xx_hal.h"
#include "defines.h"
#include "setup.h"
#include "config.h"
#include "stdio.h"
#include "string.h"
UART_HandleTypeDef huart2;
volatile uint8_t uart_buf[300];
//volatile char char_buf[300];
void consoleScope(int16_t ch0, int16_t ch1, int16_t ch2, int16_t ch3, int16_t ch4, int16_t ch5, int16_t ch6, int16_t ch7) {
#ifdef DEBUG_SERIAL_SERVOTERM
uart_buf[0] = 0xff;
uart_buf[1] = CLAMP(ch0+127, 0, 255);
uart_buf[2] = CLAMP(ch1+127, 0, 255);
uart_buf[3] = CLAMP(ch2+127, 0, 255);
uart_buf[4] = CLAMP(ch3+127, 0, 255);
uart_buf[5] = CLAMP(ch4+127, 0, 255);
uart_buf[6] = CLAMP(ch5+127, 0, 255);
uart_buf[7] = CLAMP(ch6+127, 0, 255);
uart_buf[8] = CLAMP(ch7+127, 0, 255);
uart_buf[9] = '\n';
if(DMA1_Channel2->CNDTR == 0) {
DMA1_Channel2->CCR &= ~DMA_CCR_EN;
DMA1_Channel2->CNDTR = 10;
DMA1_Channel2->CMAR = (uint32_t)uart_buf;
DMA1_Channel2->CCR |= DMA_CCR_EN;
}
#endif
#ifdef DEBUG_SERIAL_ASCII
memset(&uart_buf, 0, sizeof(uart_buf));
sprintf(uart_buf, "%i;%i;%i;%i;%i;%i;%i;%i\n\r", ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7);
if(DMA1_Channel2->CNDTR == 0) {
DMA1_Channel2->CCR &= ~DMA_CCR_EN;
DMA1_Channel2->CNDTR = strlen(uart_buf);
DMA1_Channel2->CMAR = (uint32_t)uart_buf;
DMA1_Channel2->CCR |= DMA_CCR_EN;
}
#endif
}
void consoleLog(char *message)
{
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)message, strlen(message));
}

235
Src/main.c

@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
#include "stm32f1xx_hal.h"
#include "defines.h"
#include "setup.h"
#include "config.h"
void SystemClock_Config(void);
@ -30,231 +31,9 @@ extern ADC_HandleTypeDef hadc1; @@ -30,231 +31,9 @@ extern ADC_HandleTypeDef hadc1;
extern ADC_HandleTypeDef hadc2;
extern volatile adc_buf_t adc_buffer;
volatile int posl = 0;
volatile int posr = 0;
volatile int pwml = 0;
volatile int pwmr = 0;
extern volatile int pwml;
extern volatile int pwmr;
const int pwm_res = 64000000 / 2 / PWM_FREQ;
const uint8_t hall_to_pos[8] = {
0,
0,
2,
1,
4,
5,
3,
0,
};
inline void block(int pwm, int pos, int *u, int *v, int *w) {
switch(pos) {
case 0:
*u = 0;
*v = pwm;
*w = -pwm;
break;
case 1:
*u = -pwm;
*v = pwm;
*w = 0;
break;
case 2:
*u = -pwm;
*v = 0;
*w = pwm;
break;
case 3:
*u = 0;
*v = -pwm;
*w = pwm;
break;
case 4:
*u = pwm;
*v = -pwm;
*w = 0;
break;
case 5:
*u = pwm;
*v = 0;
*w = -pwm;
break;
default:
*u = 0;
*v = 0;
*w = 0;
}
}
inline void block2(int pos, int u, int v, int *q) {
switch(pos) {
case 0:
*q = u - v;
// *u = 0;
// *v = pwm;
// *w = -pwm;
break;
case 1:
*q = u;
// *u = -pwm;
// *v = pwm;
// *w = 0;
break;
case 2:
*q = u;
// *u = -pwm;
// *v = 0;
// *w = pwm;
break;
case 3:
*q = v;
// *u = 0;
// *v = -pwm;
// *w = pwm;
break;
case 4:
*q = v;
// *u = pwm;
// *v = -pwm;
// *w = 0;
break;
case 5:
*q = -(u - v);
// *u = pwm;
// *v = 0;
// *w = -pwm;
break;
default:
*q = 0;
// *u = 0;
// *v = 0;
// *w = 0;
}
}
int last_pos = 0;
int timer = 0;
int max_time = PWM_FREQ / 10;
volatile int vel = 0;
int offsetcount = 0;
int offsetrl1 = 2000;
int offsetrl2 = 2000;
int offsetrr1 = 2000;
int offsetrr2 = 2000;
int offsetdcl = 2000;
int offsetdcr = 2000;
volatile uint8_t uart_buf[10];
int curl = 0;
// int errorl = 0;
// int kp = 5;
// volatile int cmdl = 0;
void DMA1_Channel1_IRQHandler() {
DMA1->IFCR = DMA_IFCR_CTCIF1;
// HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1);
if(offsetcount < 1000) {
offsetcount++;
offsetrl1 = (adc_buffer.rl1 + offsetrl1) / 2;
offsetrl2 = (adc_buffer.rl2 + offsetrl2) / 2;
offsetrr1 = (adc_buffer.rr1 + offsetrr1) / 2;
offsetrr2 = (adc_buffer.rr2 + offsetrr2) / 2;
offsetdcl = (adc_buffer.dcl + offsetdcl) / 2;
offsetdcr = (adc_buffer.dcr + offsetdcr) / 2;
return;
}
if(adc_buffer.dcl - offsetdcl > 40) {
LEFT_TIM->BDTR &= ~TIM_BDTR_MOE;
HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1);
} else {
LEFT_TIM->BDTR |= TIM_BDTR_MOE;
HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0);
}
if(adc_buffer.dcr - offsetdcr > 40) {
RIGHT_TIM->BDTR &= ~TIM_BDTR_MOE;
} else {
RIGHT_TIM->BDTR |= TIM_BDTR_MOE;
}
int ul, vl, wl;
int ur, vr, wr;
uint8_t hall_ul = !(LEFT_HALL_U_PORT->IDR & LEFT_HALL_U_PIN);
uint8_t hall_vl = !(LEFT_HALL_V_PORT->IDR & LEFT_HALL_V_PIN);
uint8_t hall_wl = !(LEFT_HALL_W_PORT->IDR & LEFT_HALL_W_PIN);
uint8_t hall_ur = !(RIGHT_HALL_U_PORT->IDR & RIGHT_HALL_U_PIN);
uint8_t hall_vr = !(RIGHT_HALL_V_PORT->IDR & RIGHT_HALL_V_PIN);
uint8_t hall_wr = !(RIGHT_HALL_W_PORT->IDR & RIGHT_HALL_W_PIN);
uint8_t halll = hall_ul * 1 + hall_vl * 2 + hall_wl * 4;
posl = hall_to_pos[halll];
posl += 2;
posl %= 6;
uint8_t hallr = hall_ur * 1 + hall_vr * 2 + hall_wr * 4;
posr = hall_to_pos[hallr];
posr += 2;
posr %= 6;
block2(posl, adc_buffer.rl1 - offsetrl1, adc_buffer.rl2 - offsetrl2, &curl);
uart_buf[0] = 0xff;
uart_buf[1] = 127; //adc_buffer.dcl - 1850 + 127;
uart_buf[2] = 127; //adc_buffer.dcr - 1850 + 127;
uart_buf[3] = 127; ////CLAMP((adc_buffer.rr1 - offsetrr1) / 8 + 127,0,255);
uart_buf[4] = 127; ////CLAMP((adc_buffer.rr2 - offsetrr2) / 8 + 127,0,255);
uart_buf[5] = CLAMP((adc_buffer.rl1 - offsetrl1) / 8 + 127, 0, 255);
uart_buf[6] = CLAMP((adc_buffer.rl2 - offsetrl2) / 8 + 127, 0, 255);
uart_buf[7] = 127; //CLAMP(curl / 8 + 127,0,255);//adc_buffer.batt1 - 1550 + 127;
uart_buf[8] = 127 + posl * 20; //adc_buffer.bat1 - 1550 + 127;
uart_buf[9] = '\n';
if(DMA1_Channel2->CNDTR == 0) {
DMA1_Channel2->CCR &= ~DMA_CCR_EN;
DMA1_Channel2->CNDTR = 10;
DMA1_Channel2->CMAR = (uint32_t)uart_buf;
DMA1_Channel2->CCR |= DMA_CCR_EN;
}
timer++;
// if(timer > max_time){
// timer = max_time;
// vel = 0;
// }
// if(pos != last_pos){
// vel = 1000 * PWM_FREQ / timer / P / 6 * 2;
// if((pos - last_pos + 6) % 6 > 2){
// vel = -vel;
// }
// timer = 0;
// }
// last_pos = pos;
//YOLOTEST
// errorl = cmdl - curl;
// pwml = kp * errorl;
block(pwml, posl, &ul, &vl, &wl);
block(pwmr, posr, &ur, &vr, &wr);
LEFT_TIM->LEFT_TIM_U = CLAMP(ul + pwm_res / 2, 10, pwm_res-10);
LEFT_TIM->LEFT_TIM_V = CLAMP(vl + pwm_res / 2, 10, pwm_res-10);
LEFT_TIM->LEFT_TIM_W = CLAMP(wl + pwm_res / 2, 10, pwm_res-10);
RIGHT_TIM->RIGHT_TIM_U = CLAMP(ur + pwm_res / 2, 10, pwm_res-10);
RIGHT_TIM->RIGHT_TIM_V = CLAMP(vr + pwm_res / 2, 10, pwm_res-10);
RIGHT_TIM->RIGHT_TIM_W = CLAMP(wr + pwm_res / 2, 10, pwm_res-10);
// HAL_GPIO_WritePin(LED_PORT, LED_PIN, 0);
}
int milli_vel_error_sum = 0;
@ -323,7 +102,7 @@ void SystemClock_Config(void) { @@ -323,7 +102,7 @@ void SystemClock_Config(void) {
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
@ -333,7 +112,7 @@ void SystemClock_Config(void) { @@ -333,7 +112,7 @@ void SystemClock_Config(void) {
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
/**Initializes the CPU, AHB and APB busses clocks
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
@ -347,11 +126,11 @@ void SystemClock_Config(void) { @@ -347,11 +126,11 @@ void SystemClock_Config(void) {
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
/**Configure the Systick interrupt time
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / 1000);
/**Configure the Systick
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

9
Src/setup.c

@ -35,6 +35,7 @@ pb10 usart3 dma1 channel2/3 @@ -35,6 +35,7 @@ pb10 usart3 dma1 channel2/3
*/
#include "defines.h"
#include "config.h"
TIM_HandleTypeDef htim_right;
TIM_HandleTypeDef htim_left;
@ -48,7 +49,7 @@ void UART_Init() { @@ -48,7 +49,7 @@ void UART_Init() {
UART_HandleTypeDef huart3;
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.BaudRate = DEBUG_BAUD;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
@ -330,11 +331,11 @@ void MX_ADC1_Init(void) { @@ -330,11 +331,11 @@ void MX_ADC1_Init(void) {
hadc1.Init.NbrOfConversion = 5;
HAL_ADC_Init(&hadc1);
/**Enable or disable the remapping of ADC1_ETRGREG:
* ADC1 External Event regular conversion is connected to TIM8 TRG0
* ADC1 External Event regular conversion is connected to TIM8 TRG0
*/
__HAL_AFIO_REMAP_ADC1_ETRGREG_ENABLE();
/**Configure the ADC multi-mode
/**Configure the ADC multi-mode
*/
multimode.Mode = ADC_DUALMODE_REGSIMULT;
HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode);
@ -388,7 +389,7 @@ void MX_ADC2_Init(void) { @@ -388,7 +389,7 @@ void MX_ADC2_Init(void) {
// HAL_ADC_DeInit(&hadc2);
// hadc2.Instance->CR2 = 0;
/**Common config
/**Common config
*/
hadc2.Instance = ADC2;
hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;

782
build/hover.hex

@ -0,0 +1,782 @@ @@ -0,0 +1,782 @@
:020000040800F2
:1000000000C000206D2F00082D29000831290008AC
:1000100035290008392900083D29000800000000A2
:10002000000000000000000000000000412900085E
:100030004529000800000000492900084D29000852
:10004000B52F0008B52F0008B52F0008B52F000800
:10005000B52F0008B52F0008B52F0008B52F0008F0
:10006000B52F0008B52F0008B52F0008A92A0008F1
:10007000B52F0008B52F0008B52F0008B52F0008D0
:10008000B52F0008B52F0008B52F0008B52F0008C0
:10009000B52F0008B52F0008B52F0008B52F0008B0
:1000A000B52F0008B52F0008B52F0008B52F0008A0
:1000B000B52F0008B52F0008B52F0008B52F000890
:1000C000B52F0008B52F0008B52F0008B52F000880
:1000D000B52F0008B52F0008B52F0008B52F000870
:1000E000B52F0008B52F0008B52F0008B52F000860
:1000F000B52F0008B52F0008B52F0008B52F000850
:10010000B52F0008B52F0008B52F0008B52F00083F
:10011000B52F0008B52F0008B52F0008B52F00082F
:10012000B52F0008B52F0008B52F0008B52F00081F
:1001300000000000000000000000000000000000BF
:1001400000000000000000000000000000000000AF
:10015000000000000000000000000000000000009F
:10016000000000000000000000000000000000008F
:10017000000000000000000000000000000000007F
:10018000000000000000000000000000000000006F
:10019000000000000000000000000000000000005F
:1001A000000000000000000000000000000000004F
:1001B000000000000000000000000000000000003F
:1001C000000000000000000000000000000000002F
:1001D000000000000000000000000000000000001F
:0401E0005FF8E0F1F3
:1001E800044B05481B1A062B02D9044B03B11847C8
:1001F800704700BF1F0000201C0000200000000006
:1002080005490648091A891001EBD171491002D035
:10021800034B03B1184770471C0000201C00002046
:100228000000000010B5064C237843B9FFF7D8FF4B
:10023800044B13B10448AFF300800123237010BDB1
:100248001C000020000000000430000808B5084B1E
:100258001BB108480849AFF300800848036813B980
:10026800BDE80840CCE7064B002BF9D09847F7E7E4
:100278000000000004300008200000201C000020BE
:100288000000000081F0004102E000BF83F000435D
:1002980030B54FEA41044FEA430594EA050F08BF19
:1002A80090EA020F1FBF54EA000C55EA020C7FEADD
:1002B800645C7FEA655C00F0E2804FEA5454D4EB5A
:1002C8005555B8BF6D420CDD2C4480EA020281EA24
:1002D800030382EA000083EA010180EA020281EA5C
:1002E8000303362D88BF30BD11F0004F4FEA0131AE
:1002F8004FF4801C4CEA113102D0404261EB4101BD
:1003080013F0004F4FEA03334CEA133302D0524242
:1003180063EB430394EA050F00F0A780A4F10104FE
:10032800D5F1200E0DDB02FA0EFC22FA05F2801838
:1003380041F1000103FA0EF2801843FA05F359411E
:100348000EE0A5F120050EF1200E012A03FA0EFC9D
:1003580028BF4CF0020C43FA05F3C01851EBE371C7
:1003680001F0004507D54FF0000EDCF1000C7EEBE4
:1003780000006EEB0101B1F5801F1BD3B1F5001F22
:100388000CD349085FEA30004FEA3C0C04F1010441
:100398004FEA445212F5800F80F09A80BCF1004F6A
:1003A80008BF5FEA500C50F1000041EB045141EAEC
:1003B800050130BD5FEA4C0C404141EB010111F4ED
:1003C800801FA4F10104E9D191F0000F04BF014698
:1003D8000020B1FA81F308BF2033A3F10B03B3F176
:1003E80020020CDA0C3208DD02F1140CC2F10C0206
:1003F80001FA0CF021FA02F10CE002F11402D8BF64
:10040800C2F1200C01FA02F120FA0CFCDCBF41EA2F
:100418000C019040E41AA2BF01EB0451294330BDFE
:100428006FEA04041F3C1CDA0C340EDC04F11404DB
:10043800C4F1200220FA04F001FA02F340EA0300B2
:1004480021FA04F345EA030130BDC4F10C04C4F1F8
:10045800200220FA02F001FA04F340EA03002946D8
:1004680030BD21FA04F0294630BD94F0000F83F422
:10047800801306BF81F480110134013D4EE77FEA05
:10048800645C18BF7FEA655C29D094EA050F08BF51
:1004980090EA020F05D054EA000C04BF1946104632
:1004A80030BD91EA030F1EBF0021002030BD5FEA76
:1004B800545C05D14000494128BF41F0004130BD9E
:1004C80014F580043CBF01F5801130BD01F00045F2
:1004D80045F0FE4141F470014FF0000030BD7FEA65
:1004E800645C1ABF194610467FEA655C1CBF0B4660
:1004F800024650EA013406BF52EA033591EA030F77
:1005080041F4002130BD00BF90F0000F04BF00216E
:10051800704730B54FF4806404F132044FF00005A1
:100528004FF0000150E700BF90F0000F04BF00211A
:10053800704730B54FF4806404F1320410F0004580
:1005480048BF40424FF000013EE700BF42004FEA7B
:10055800E2014FEA31014FEA02701FBF12F07F43F8
:1005680093F07F4F81F06051704792F0000F14BFF5
:1005780093F07F4F704730B54FF4607401F0004539
:1005880021F0004120E700BF50EA010208BF704790
:1005980030B54FF000050AE050EA010208BF704785
:1005A80030B511F0004502D5404261EB41014FF4EE
:1005B800806404F132045FEA915C3FF4DCAE4FF0F2
:1005C80003025FEADC0C18BF03325FEADC0C18BFD9
:1005D800033202EBDC02C2F1200300FA03FC20FA2A
:1005E80002F001FA03FE40EA0E0021FA02F1144477
:1005F800C1E600BF70B54FF0FF0C4CF4E06C1CEA8C
:1006080011541DBF1CEA135594EA0C0F95EA0C0F00
:1006180000F0DEF82C4481EA030621EA4C5123EA73
:100628004C5350EA013518BF52EA033541F48011A2
:1006380043F4801338D0A0FB02CE4FF00005E1FB55
:1006480002E506F00042E0FB03E54FF00006E1FB9F
:1006580003569CF0000F18BF4EF0010EA4F1FF04E2
:10066800B6F5007F64F5407404D25FEA4E0E6D4122
:1006780046EB060642EAC62141EA55514FEAC52033
:1006880040EA5E504FEACE2EB4F1FD0C88BFBCF5AF
:10069800E06F1ED8BEF1004F08BF5FEA500E50F160
:1006A800000041EB045170BD06F0004646EA010126
:1006B80040EA020081EA0301B4EB5C04C2BFD4EB58
:1006C8000C0541EA045170BD41F480114FF0000E51
:1006D800013C00F3AB8014F1360FDEBF002001F0BF
:1006E800004170BDC4F10004203C35DA0C341BDC39
:1006F80004F11404C4F1200500FA05F320FA04F00B
:1007080001FA05F240EA020001F0004221F000413E
:1007180010EBD37021FA04F642EB06015EEA430EB1
:1007280008BF20EAD37070BDC4F10C04C4F12005E1
:1007380000FA04F320FA05F001FA04F240EA020094
:1007480001F0004110EBD37041F100015EEA430E65
:1007580008BF20EAD37070BDC4F1200500FA05F285
:100768004EEA020E20FA04F301FA05F243EA020304
:1007780021FA04F001F0004121FA04F220EA020013
:1007880000EBD3705EEA430E08BF20EAD37070BD59
:1007980094F0000F0FD101F00046400041EB010139
:1007A80011F4801F08BF013CF7D041EA060195F01B
:1007B800000F18BF704703F00046520043EB0303D5
:1007C80013F4801F08BF013DF7D043EA06037047C2
:1007D80094EA0C0F0CEA135518BF95EA0C0F0CD0CD
:1007E80050EA410618BF52EA4306D1D181EA030113
:1007F80001F000414FF0000070BD50EA410606BF0D
:100808001046194652EA430619D094EA0C0F02D151
:1008180050EA013613D195EA0C0F05D152EA033696
:100828001CBF104619460AD181EA030101F00041B4
:1008380041F0FE4141F470014FF0000070BD41F0FD
:10084800FE4141F4780170BD70B54FF0FF0C4CF4D7
:10085800E06C1CEA11541DBF1CEA135594EA0C0FF6
:1008680095EA0C0F00F0A7F8A4EB050481EA030E43
:1008780052EA03354FEA013100F088804FEA03332A
:100888004FF0805545EA131343EA12634FEA0222F8
:1008980045EA111545EA10654FEA00260EF00041B9
:1008A8009D4208BF964244F1FD0404F5407402D20B
:1008B8005B084FEA3202B61A65EB03055B084FEA9C
:1008C80032024FF480104FF4002CB6EB020E75EB99
:1008D800030E22BFB61A754640EA0C005B084FEAC1
:1008E8003202B6EB020E75EB030E22BFB61A75463E
:1008F80040EA5C005B084FEA3202B6EB020E75EB89
:10090800030E22BFB61A754640EA9C005B084FEA00
:100918003202B6EB020E75EB030E22BFB61A75460D
:1009280040EADC0055EA060E18D04FEA051545EAFC
:1009380016754FEA06164FEAC30343EA52734FEAA5
:10094800C2025FEA1C1CC0D111F4801F0BD141EA1E
:1009580000014FF000004FF0004CB6E711F4801F83
:1009680004BF01430020B4F1FD0C88BFBCF5E06F63
:100978003FF6AFAEB5EB030C04BFB6EB020C5FEA73
:10098800500C50F1000041EB045170BD0EF0004EC8
:100998004EEA113114EB5C04C2BFD4EB0C0541EAFA
:1009A800045170BD41F480114FF0000E013C90E6F7
:1009B80045EA060E8DE60CEA135594EA0C0F08BFBB
:1009C80095EA0C0F3FF43BAF94EA0C0F0AD150EABA
:1009D80001347FF434AF95EA0C0F7FF425AF10464D
:1009E80019462CE795EA0C0F06D152EA03353FF475
:1009F800FDAE1046194622E750EA410618BF52EAF2
:100A080043067FF4C5AE50EA41047FF40DAF52EAC5
:100A180043057FF4EBAE12E74FF0FF3C06E000BF62
:100A28004FF0010C02E000BF4FF0010C4DF804CD6F
:100A38004FEA410C7FEA6C5C4FEA430C18BF7FEA2F
:100A48006C5C1BD001B050EA410C0CBF52EA430C5D
:100A580091EA030F02BF90EA020F0020704710F1DD
:100A6800000F91EA030F58BF994208BF90422CBF6C
:100A7800D8176FEAE37040F0010070474FEA410C65
:100A88007FEA6C5C02D150EA013C07D14FEA430C83
:100A98007FEA6C5CD6D152EA033CD3D05DF8040BF4
:100AA800704700BF8446104662468C461946634626
:100AB80000E000BF01B5FFF7B7FF002848BF10F1FD
:100AC800000F01BD4DF808EDFFF7F4FF0CBF012042
:100AD80000205DF808FB00BF4DF808EDFFF7EAFFBE
:100AE80034BF012000205DF808FB00BF4DF808ED79
:100AF800FFF7E0FF94BF012000205DF808FB00BF6E
:100B08004DF808EDFFF7CEFF94BF012000205DF8F7
:100B180008FB00BF4DF808EDFFF7C4FF34BF012004
:100B280000205DF808FB00BF82B0084B1B68084A2C
:100B3800A2FB03235B0A00FB03F0019000BF019BAB
:100B48005A1E0192002BF9D102B070470000002014
:100B5800D34D621070B582B00446036813F0010FDC
:100B68006BD0A84B5B6803F00C03042B0AD0A54B91
:100B78005B6803F00C03082B0DD1A24B5B6813F4E0
:100B8800803F08D09F4B1B6813F4003F55D0636823
:100B9800002B52D1B8E16368B3F5803F05D1994A7B
:100BA800136843F48033136026E063B903F180438C
:100BB80003F504331A6822F480321A601A6822F4A2
:100BC80080221A6018E0B3F5A02F0CD103F18043FE
:100BD800A3F53C331A6842F480221A601A6842F47A
:100BE80080321A6008E0874B1A6822F480321A6053
:100BF8001A6822F480221A6063687BB101F010F849
:100C0800054605E001F00CF8401B642800F27E81DF
:100C18007C4B1B6813F4003FF4D00EE001F000F8A1
:100C2800054605E000F0FCFF401B642800F27081D7
:100C3800744B1B6813F4003FF4D1236813F0020FC0
:100C480050D0704B5B6813F00C0F0AD06D4B5B688B
:100C580003F00C03082B16D16A4B5B6813F4803F32
:100C680011D1684B1B6813F0020F03D02369012BC5
:100C780040F05081634A136823F0F803616943EA3E
:100C8800C10313602EE02369D3B101225E4B1A60C1
:100C980000F0C6FF054605E000F0C2FF401B022831
:100CA80000F23A81574B1B6813F0020FF4D0554AF3
:100CB800136823F0F803616943EAC103136011E084
:100CC8000022514B1A6000F0ABFF054605E000F02A
:100CD800A7FF401B022800F221814A4B1B6813F032
:100CE800020FF4D1236813F0080F29D0A369ABB120
:100CF8000122464B1A6000F093FF054605E000F01C
:100D08008FFF401B022800F20B813E4B5B6A13F0F9
:100D1800020FF4D00120FFF707FF11E000223B4B40
:100D28001A6000F07DFF054605E000F079FF401BE2
:100D3800022800F2F780334B5B6A13F0020FF4D1FC
:100D4800236813F0040F00F089802E4BDB6913F041
:100D5800805F0BD12B4BDA6942F08052DA61DB6994
:100D680003F080530193019B012500E00025284BE7
:100D78001B6813F4807F13D1254A136843F48073EA
:100D8800136000F04DFF064605E000F049FF801BA8
:100D9800642800F2C9801E4B1B6813F4807FF4D0CE
:100DA800E368012B05D1174A136A43F00103136264
:100DB80022E063B903F1804303F504331A6A22F091
:100DC80001021A621A6A22F004021A6214E0052B60
:100DD80009D10C4B1A6A42F004021A621A6A42F0EC
:100DE80001021A6208E0074B1A6A22F001021A622D
:100DF8001A6A22F004021A62E368CBB100F010FF0D
:100E080006460FE0001002400000424280044242C1
:100E18000070004000F004FF801B41F288339842C4
:100E280000F28480494B1B6A13F0020FF2D00FE0E6
:100E380000F0F6FE064606E000F0F2FE801B41F2E6
:100E48008833984274D8414B1B6A13F0020FF3D1D0
:100E580025B13E4AD36923F08053D361E369002B5F
:100E680068D03A4A526802F00C02082A64D0022B71
:100E780037D10022364B1A6000F0D2FE054604E056
:100E880000F0CEFE401B022858D8304B1B6813F0E8
:100E9800007FF5D1236AB3F5803F06D12B494B6813
:100EA80023F40032A36813434B602848436823F4B3
:100EB8007411236A626A13430B4343600122244B73
:100EC8001A6000F0ADFE044604E000F0A9FE001B25
:100ED800022835D81D4B1B6813F0007FF5D0002081
:100EE80031E000221A4B1A6000F09AFE044604E032
:100EF80000F096FE001B022824D8144B1B6813F040
:100F0800007FF5D100201EE001201CE003201AE03C
:100F1800032018E0012016E0032014E0032012E06B
:100F2800032010E003200EE003200CE003200AE079
:100F3800032008E0002006E0012004E0032002E08E
:100F4800032000E0032002B070BD00BF0010024083
:100F58006000424230B486B0164D02AC2868696819
:100F6800AA68EB680FC42B8AADF80430124B5A6894
:100F780002F00C03082B19D1C2F3834306A90B44D2
:100F880013F8103C12F4803F0CD00B4A5268C2F39D
:100F980040420A4412F8140C084AB2FBF0F003FB72
:100FA80000F004E0064800FB03F000E0034806B048
:100FB80030BC70471C3000080010024000127A0054
:100FC80000093D0070B55C4B1B6803F007038B42BA
:100FD8000BD2594A136823F007030B4313601368B5
:100FE80003F007038B4240F09780036813F0020F69
:100FF80006D0524C636823F0F002836813436360A1
:101008000D460446036813F0010F4DD04268012ACB
:1010180005D14A4B1B6813F4003F0DD17EE0022A2C
:1010280005D1464B1B6813F0007F05D178E0434B90
:101038001B6813F0020F75D040494B6823F0030377
:1010480013434B6000F0ECFD06466368012B0ED19C
:1010580006E000F0E5FD801B41F28833984263D832
:10106800364B5B6803F00C03042BF2D11CE0022B17
:1010780015D106E000F0D4FD801B41F28833984278
:1010880054D82E4B5B6803F00C03082BF2D10BE00D
:1010980000F0C6FD801B41F28833984248D8274BA0
:1010A8005B6813F00C0FF3D1234B1B6803F00703A5
:1010B800AB420AD9204A136823F007032B43136075
:1010C800136803F00703AB4234D1236813F0040F0D
:1010D80006D01A494B6823F4E062E36813434B6077
:1010E800236813F0080F07D0144A536823F4605399
:1010F800216943EAC1035360FFF72CFF0F4B5B687C
:10110800C3F303130E4AD35CD8400E4B186000207B
:1011180000F056FD002070BD012070BD012070BD9B
:10112800012070BD012070BD032070BD032070BD7B
:10113800032070BD012070BD002002400010024055
:101148003030000800000020014B1868704700BFCD
:101158000000002008B5FFF7F7FF044B5B68C3F3F6
:101168000223034AD35CD84008BD00BF00100240E8
:101178004030000808B5FFF7E7FF044B5B68C3F38E
:10118800C223034AD35CD84008BD00BF0010024008
:101198004030000830B4036A23F001030362036A95
:1011A8004468826922F073020D682A4323F002031F
:1011B8008D682B43104DA84203D005F50065A84261
:1011C80005D123F00803CD682B4323F004030A4D0F
:1011D800A84203D005F50065A84205D124F440745F
:1011E8004D692C438D692C43446082614A6842638F
:1011F800036230BC704700BF002C014030B4036A62
:1012080023F480730362036A4468C26922F073029C
:101218000D682A4323F400738D6843EA0523124DB1
:10122800A84203D005F50065A84206D123F400635F
:10123800CD6843EA052323F480630B4DA84203D00D
:1012480005F50065A84207D124F440544D6944EAE5
:1012580005148D6944EA05144460C2614A68C26392
:10126800036230BC704700BF002C014030B4036AF1
:1012780023F480530362036A4468C26922F4E64295
:101288000D6842EA052223F400538D6843EA0533CA
:10129800094DA84203D005F50065A84204D124F4FD
:1012A80080444D6944EA85144460C2614A68026416
:1012B800036230BC704700BF002C014010B4036AC1
:1012C800046A24F001040462846924F0F00444EA06
:1012D800021223F00A031943826101625DF8044B8C
:1012E800704700BF10B4036A23F0100303628469D7
:1012F800036A24F4704444EA023223F0A00343EA68
:101308000111826101625DF8044B704710B4846872
:1013180024F47F4442EA032319430C4384605DF8B4
:10132800044B704710B50C460268936823F07003AD
:1013380049680B4323F0070321680B4393606368F4
:10134800502B1FD002D8402B0BD010BD602B1FD0C4
:10135800702B22D10068E168A2682369FFF7D6FFE5
:1013680010BD0368196A1A6A22F001021A6202683B
:10137800936923F0F003246943EA04139361036833
:10138800196210BD0068A1682269FFF797FF10BDB8
:101398000068A1682269FFF7A5FF10BD704700BF6C
:1013A80038B590F83C30012B18D00446012580F858
:1013B8003C50022380F83D30FFF7B4FF2268D36821
:1013C80023F04003D3602268D36823F48043D360BA
:1013D80084F83D50002084F83C0038BD022038BD18
:1013E8000368244A904212D002F5006290420ED05F
:1013F800B0F1804F0BD0A2F59832904207D002F599
:101408008062904203D002F58062904203D123F0BB
:1014180070034A681343174A904212D002F50062DB
:1014280090420ED0B0F1804F0BD0A2F59832904286
:1014380007D002F58062904203D002F580629042A4
:1014480003D123F44073CA68134323F080034A6925
:10145800134303608B68C3620B688362054B984231
:1014680003D003F50063984201D10B69036301239C
:1014780043617047002C0140C0B110B5044690F894
:101488003D3013F0FF0F04D1002380F83C30FFF704
:1014980085FF022384F83D30214651F8040BFFF7FD
:1014A8009FFF012384F83D30002010BD01207047C4
:1014B80030B4036A23F010030362036A4468826944
:1014C80022F4E6420D6842EA052223F020038D68E3
:1014D80043EA0513114DA84203D005F50065A8425B
:1014E80006D123F08003CD6843EA051323F04003B7
:1014F8000A4DA84203D005F50065A84207D124F497
:1015080040644D6944EA85048D6944EA8504446071
:1015180082614A688263036230BC7047002C0140D4
:1015280038B590F83C30012B66D00D4604460123AF
:1015380080F83C30022380F83D300C2A55D8DFE88B
:1015480002F0075454541A5454542E54545441001D
:101558000068FFF71FFE2268936943F00803936150
:101568002268936923F004039361226891692B69C7
:101578000B43936139E00068FFF79AFF226893698B
:1015880043F4006393612268936923F48063936151
:1015980022689369296943EA0123936125E0006879
:1015A800FFF72CFE2268D36943F00803D361226851
:1015B800D36923F00403D3612268D1692B690B43F3
:1015C800D36112E00068FFF751FE2268D36943F443
:1015D8000063D3612268D36923F48063D3612268EE
:1015E800D369296943EA0123D361012384F83D3093
:1015F800002084F83C0038BD022038BD10B4012317
:101608008B40046A24EA03030362036A8A401A438C
:1016180002625DF8044B704710B504460068012269
:10162800FFF7ECFF23680C4A934205D002F50062ED
:10163800934203D1012202E0012200E000221AB104
:101648005A6C42F400425A642268136843F001035A
:101658001360002010BD00BF002C014010B404230B
:101668008B40046A24EA03030362036A8A401A432C
:1016780002625DF8044B704710B504460068042206
:10168800FFF7ECFF2268536C43F40043536422686D
:10169800136843F001031360002010BD90F83C303C
:1016A800012B22D0012380F83C30CB6823F4407210
:1016B8008B68134323F480624B68134323F400625E
:1016C8000B68134323F480520B69134323F400522D
:1016D8004B6913438A6923F44043134302685364F4
:1016E800002380F83C30184670470220704700BF3E
:1016F80090F83C30012B21D030B4012280F83C20F6
:10170800022380F83D300468636823F07003636047
:10171800046865680B682B4363600468A36823F05A
:101728008003A3600468A5684B682B43A36080F816
:101738003D20002380F83C30184601E00220704725
:1017480030BC704790F82430012B27D0012380F853
:10175800243003689A6812F0010F10D1124A926877
:1017680012F0010F0BD1114A934208D110B45A68F4
:1017780022F470240A6822435A60002309E0836A2D
:1017880043F0200383620123002280F824201846B6
:101798007047002280F82420184601E00220704794
:1017A8005DF8044B704700BF002801400024014049
:1017B80000F00700064AD36823F4E0631B041B0CFF
:1017C80043EA002040F0BF6040F40030D06070472A
:1017D80000ED00E030B4164BDC68C4F30224C4F119
:1017E8000705042D28BF0425231D062B01D9033C1A
:1017F80000E00024012303FA05F5013D2940A1403A
:10180800A340013B1A400A43002806DA00F00F0003
:101818001201D2B2074B1A5407E01201D2B200F1FA
:10182800604000F5614080F8002330BC704700BF7D
:1018380000ED00E014ED00E0410900F01F00012375
:101848008340024A42F82130704700BF00E100E0BF
:101858000138B0F1807F0AD2064B5860F021064A61
:1018680082F823100020986007221A607047012030
:10187800704700BF10E000E000ED00E0042805D14B
:10188800054A136843F0040313607047024A13685B
:1018980023F004031360704710E000E0704700BFB6
:1018A80008B5FFF7FBFF08BDF0B583B000273C463D
:1018B800E2E00122A2400B681340934240F0DB8033
:1018C8004D68122D2DD00BD8022D27D003D85DB32B
:1018D800012D1ED035E0032D30D0112D1BD030E066
:1018E800684EB54220D008D8A6F58016B5421BD060
:1018F80006F58036B54224D116E0634EB54213D0C2
:1019080006F58036B5420FD0A6F58016B54218D137
:101918000AE0CF6815E0CF68043712E0CF680837CF
:101928000FE0CF680C370CE08D684DB1012D02D166
:101938000261082705E04261082702E0002700E06D
:101948000427FF2B01D8844601E000F1040CFF2B8B
:1019580002D84FEA840E03E0A4F1080E4FEA8E0E77
:10196800DCF800600F2202FA0EF226EA020507FAF6
:101978000EF22A43CCF800204A6812F0805F7AD031
:10198800424A956945F001059561926902F00102A4
:101998000192019AA208961C3D4D55F8266004F064
:1019A800030E4FEA8E0E0F2505FA0EF526EA0506F8
:1019B800384DA8421FD005F58065A84219D005F515
:1019C8008065A84213D005F58065A8420DD005F5BD
:1019D8008065A84207D005F58065A84201D1052594
:1019E8000AE0062508E0042506E0032504E00225B0
:1019F80002E0012500E0002505FA0EF53543023224
:101A0800234E46F822504A6812F4803F04D0224DF3
:101A18002A681A432A6004E01F4D2A6822EA030252
:101A28002A604A6812F4003F04D01B4D6A681A43C2
:101A38006A6004E0184D6A6822EA03026A604A682C
:101A480012F4801F04D0144DAA681A43AA6004E057
:101A5800114DAA6822EA0302AA604A6812F4001F1C
:101A680004D00D4DEA681343EB6004E00A4DEA68C0
:101A780022EA0303EB6001340F2C7FF61AAF03B0A0
:101A8800F0BD00BF0000211000003110001002401E
:101A98000000014000080140000401400AB1016152
:101AA800704709040161704770B582B00446036845
:101AB80013F0010F5CD03E4BDB6913F0805F0BD154
:101AC8003B4BDA6942F08052DA61DB6903F08053FC
:101AD8000193019B012600E00026364B1B6813F496
:101AE800807F12D1334A136843F48073136000F087
:101AF80097F8054604E000F093F8401B64284FD897
:101B08002C4B1B6813F4807FF5D0294B1B6A13F408
:101B1800407321D0626802F440729A421CD0244A71
:101B2800136A23F44070244901250D6000250D60D7
:101B3800106213F0010F0FD000F072F8054606E0AE
:101B480000F06EF8401B41F2883398422AD8184BAF
:101B58001B6A13F0020FF3D015490B6A23F4407285
:101B6800636813430B621EB1CB6923F08053CB61CA
:101B7800236813F0020F06D00D494B6823F4404246
:101B8800A36813434B60236813F0100F0CD0084967
:101B98004B6823F48002636913434B60002004E020
:101BA800032002E0032000E0002002B070BD00BF67
:101BB800001002400070004040044242704700BFDD
:101BC80010B50446074B1B680748A0FB0330800983
:101BD800FFF73EFE4FF0FF3021460022FFF7FAFDE7
:101BE800002010BD00000020D34D621008B5074A40
:101BF800136843F0100313600320FFF7D9FD00209A
:101C0800FFF7DEFFFFF7DAFF002008BD00200240E3
:101C1800024A136801331360704700BF5400002064
:101C2800014B1868704700BF5400002030B583B0DE
:101C38000190FFF7F5FF0546019CB4F1FF3F00D086
:101C48000134FFF7EDFF401BA042FAD303B030BDCB
:101C5800704700BF70B483B00023019390F824301C
:101C6800012B00F08380012380F824304B68062B79
:101C78000DD80668756B03EB8303053B1F229A405A
:101C880025EA02040A689A40224372631CE00C2B7E
:101C98000DD80668356B03EB8303233B1F229A405C
:101CA80025EA02040A689A40224332630CE0066877
:101CB800F56A03EB8303413B1F229A4025EA02049D
:101CC8000A689A402243F2620B68092B0DD906680C
:101CD800F56803EB43031E3B07229A4025EA0204FA
:101CE8008A689A402243F2600BE00668356903EB84
:101CF800430307229A4025EA02048A689A4022434D
:101D080032610B68103B012B26D80368194A9342AD
:101D18001CD19A6812F4000F20D19A6842F400028C
:101D28009A600B68102B1BD1134B1B68134AA2FB3C
:101D380003239B0C03EB83035B00019302E0019BED
:101D4800013B0193019B002BF9D10AE0836A43F020
:101D580020038362012304E0002302E0002300E063
:101D68000023002280F82420184600E0022003B057
:101D780070BC7047002401400000002083DE1B4334
:101D880030B583B00023019303689A6812F0010FFD
:101D98002FD19A6842F001029A60174B1B68174AC4
:101DA800A2FB03239B0C019302E0019B013B0193DF
:101DB800019B002BF9D10446FFF732FF054611E0DD
:101DC800FFF72EFF401B02280CD9A36A43F010032B
:101DD800A362E36A43F00103E362002384F824303A
:101DE800012007E023689B6813F0010FE8D000206A
:101DF80000E0002003B030BD0000002083DE1B435C
:101E080090F82430012B70D010B50446012380F8D7
:101E18002430FFF7B5FF0346002861D1A26A22F4F7
:101E2800407222F0010242F48072A26222683049B4
:101E38008A4205D1A1F58061496811F4702F0ED14D
:101E4800A16A21F48011A162516811F4806F1CD03D
:101E5800A16A21F4405141F48051A16215E0A16AC0
:101E680041F48011A16223498A4203D001F58061BF
:101E78008A420AD11F49496811F4806F05D0A16AC6
:101E880021F4405141F48051A162A16A11F4805FAC
:101E980004D0E16A21F00601E16201E00021E1627B
:101EA800002184F824106FF0020111602268916803
:101EB80001F46021B1F5602F0DD10D498A4205D199
:101EC800A1F58061496811F4702F04D1916841F43B
:101ED800A001916007E0916841F48011916002E0EF
:101EE800002284F82420184610BD0220704700BF45
:101EF800002801400024014038B503689A6812F0B0
:101F0800010F1ED004469A6822F001029A60FFF77A
:101F180087FE05460EE0FFF783FE401B022809D91D
:101F2800A36A43F01003A362E36A43F00103E36288
:101F3800012038BD23689B6813F0010FEBD1002006
:101F480038BD002038BD00BF002800F0888070B57B
:101F58000446836A23B9C36280F82430FFF778FE09
:101F68002046FFF7C9FFA36A13F0100F71D10028AC
:101F78006FD1A36A23F4885323F0020343F00203CA
:101F8800A36262682168374B994206D1E369B3F5C9
:101F9800402F03D14FF4002300E0E3691343E568C1
:101FA80043EA4503A268B2F5807F04D0012A05D12F
:101FB8004FF4807203E04FF4807200E000226669FB
:101FC800012E0FD135B9A569013D42EA453242F4E7
:101FD800006207E0A56A45F02005A562E56A45F0BC
:101FE8000105E5624D6825F469452A434A60216880
:101FF8008D681D4A2A401A438A60A268B2F5807F1C
:1020080001D0012A03D12269013A110500E000211B
:102018002568EA6A22F470020A43EA622268916833
:10202800124A0A40934208D10023E362A36A23F0CC
:10203800030343F00103A36270BDA36A23F01203F4
:1020480043F01003A362E36A43F00103E362012053
:1020580070BDA36A43F01003A362012070BD012084
:10206800704700BF003C0140FDF7E1FFFE0E1FFF77
:102078002DE9F843814601680B6923F44052C3688F
:1020880013430B6181680369194343691943006865
:10209800C26822F4B05323F00C030B43C360D9F891
:1020A80000104B6923F44072D9F8183013434B6180
:1020B800D9F800505B4B9D4259D1FFF75BF800EB14
:1020C800800000EB8000D9F80440A400B0FBF4F4D1
:1020D800554EA6FB043464092401FFF74BF800EBC6
:1020E800800000EB8000D9F804309B00B0FBF3F7C8
:1020F800FFF740F800EB800000EB8000D9F80430CF
:102108009B00B0FBF3F3A6FB03235B094FF06408C5
:1021180008FB13731B013233A6FB03235B0903F08F
:10212800F0031C44FFF726F800EB800000EB80006A
:10213800D9F804309B00B0FBF3F7FFF71BF800EB6E
:10214800800000EB8000D9F804309B00B0FBF3F36B
:10215800A6FB03235B0908FB13731B013233A6FBA1
:102168000323C3F343131C44AC60BDE8F883FEF7B4
:10217800F1FF00EB800000EB8000D9F80440A400D8
:10218800B0FBF4F4284EA6FB043464092401FEF7DE
:10219800E1FF00EB800000EB8000D9F804309B00E1
:1021A800B0FBF3F7FEF7D6FF00EB800000EB8000F2
:1021B800D9F804309B00B0FBF3F3A6FB03235B09BB
:1021C8004FF0640808FB13731B013233A6FB03238B
:1021D8005B0903F0F0031C44FEF7BCFF00EB800032
:1021E80000EB8000D9F804309B00B0FBF3F7FEF752
:1021F800B1FF00EB800000EB8000D9F804309B00B1
:10220800B0FBF3F3A6FB03235B0908FB13731B0165
:102218003233A6FB0323C3F343131C44AC60BDE86D
:10222800F88300BF003801401F85EB51704700BF9D
:1022380068B310B5044690F8393013F0FF0F04D195
:10224800002380F83830FFF7F1FF242384F8393071
:102258002268D36823F40053D3602046FFF708FFB1
:102268002268136923F4904313612268536923F0A9
:102278002A0353612268D36843F40053D3600020D3
:10228800E063202384F8393084F83A3010BD012007
:10229800704700BF0F4B1A6842F001021A60596874
:1022A8000D4A0A405A601A6822F0847222F4803279
:1022B8001A601A6822F480221A605A6822F4FE0210
:1022C8005A604FF41F029A604FF00062034B9A6005
:1022D800704700BF001002400000FFF800ED00E06A
:1022E80030B597B01F4BDA6942F48022DA61DA69B7
:1022F80002F480220092009A5A6942F001025A615F
:102308005B6903F001030193019B174D06954FF498
:10231800E13307930024089409940A9408230B9343
:102328000C940D9406A8FFF783FF6B6943F08003B4
:102338006B614FF480630293012304930223039398
:1023480003230593094802A9FFF7AEFA084B1C605E
:10235800084A9A605C6090221A6070221C3B5A609E
:1023680017B030BD0010024000480040000C01408A
:102378001C000240044800402DE9F04F89B0734B1F
:102388009A6942F004029A619A6902F00402019281
:10239800019A9A6942F008029A619A6902F0080261
:1023A8000292029A9A6942F010029A619B6903F0BC
:1023B80010030393039B0023059306934FF0020831
:1023C800CDF81C804FF0200B0DEB0B0444F810BD2A
:1023D8005F482146FFF768FA402504955C48214686
:1023E800FFF762FA4FF0800ACDF810A0584821464E
:1023F800FFF75AFA4FF48066049656482146FFF7CD
:1024080053FA4FF40063049352482146FFF74CFAFD
:102418004FF4805704974F482146FFF745FA049731
:102428004D482146FFF740FA4FF00109CDF81490C6
:102438000427049746482146FFF736FA10230493E9
:1024480045482146FFF730FACDF810B042482146FA
:10245800FFF72AFA03230593CDF810903D4821464B
:10246800FFF722FACDF810903B482146FFF71CFAF7
:102478000823049337482146FFF716FACDF8108051
:1024880034482146FFF710FA1023049331482146B7
:10249800FFF70AFACDF810B02E482146FFF704FAE4
:1024A80004972C482146FFF7FFF9CDF814800495CE
:1024B80028482146FFF7F8F9CDF810A0254821460D
:1024C800FFF7F2F94FF4807BCDF810B02148214690
:1024D800FFF7EAF9CDF810A01F482146FFF7E4F905
:1024E800CDF810901A482146FFF7DEF9CDF8108094
:1024F80017482146FFF7D8F9CDF810B016482146FD
:10250800FFF7D2F94FF40073049313482146FFF7FD
:10251800CBF9049610482146FFF7C6F94FF400534B
:1025280004930B482146FFF7BFF94FF48043049307
:1025380007482146FFF7B8F94FF4004304930448CD
:102548002146FFF7B1F909B0BDE8F08F001002404D
:10255800000C014000100140000801402DE9F04F37
:1025680099B0754B9A6942F400629A619A6902F4CB
:1025780000620192019A9A6942F400529A619B6939
:1025880003F400530293029B6C4EDFF8B891C6F82F
:102598000090002474604FF02008C6F808804FF4BB
:1025A800FA6BC6F80CB034617461B4613046FEF75A
:1025B80063FF102316931794304616A9FFF798F86F
:1025C80060230F931094119408271297139414946E
:1025D8004FF40073159330460FA92246FEF7A0FF6B
:1025E80030460FA90422FEF79BFF30460FA93A4652
:1025F800FEF796FF4FF4006308934FF48063099346
:102608000A94CDF82C800C940D940E9430460DEB62
:102618000801FFF743F84A4DDFF82CA1C5F800A0E0
:102628006C60C5F80880C5F80CB02C616C61AC61B1
:102638002846FEF721FFCDF85880802317932846B7
:1026480016A9FFF755F8049418A9052341F8543D35
:102658002846FEF7A5FE60230F9310941194129755
:10266800139414944FF40073159328460FA9224627
:10267800FEF756FF28460FA90422FEF751FF284609
:102688000FA93A46FEF74CFF4FF4006308934FF446
:10269800806309930A94CDF82C800C940D940E94C1
:1026A80028460DEB0801FEF7F9FFDAF8443023F469
:1026B8000043CAF84430D9F8443023F40043C9F839
:1026C800443028462146FEF7A7FF28460421FEF796
:1026D800A3FF28463946FEF79FFF28462146FEF706
:1026E800CBFF28460421FEF7C7FF28463946FEF7E8
:1026F800C3FF30462146FEF78FFF30460421FEF720
:102708008BFF30463946FEF787FF30462146FEF7F5
:10271800B3FF30460421FEF7AFFF30463946FEF7D7
:10272800ABFF2B6801221A633268136843F0010378
:10273800136019B0BDE8F08F001002408800002037
:102748000C010020002C0140003401402DE9F04329
:1027580087B0414EB36943F40073B361B36903F4BE
:1027680000730093009B3D4C3D4B23604FF48073F6
:10277800A3600025E56065614FF44023E36165606F
:102788004FF00508C4F810802046FFF7DDFB354AF6
:10279800536843F48023536006A94FF4C02341F8DB
:1027A800043D2046FEF7CEFF012304930E22029239
:1027B8000393204602A9FFF74DFA029502270397D3
:1027C800204602A9FFF746FA04970B27029703232E
:1027D8000393204602A9FFF73DFA4FF00C09CDF804
:1027E800089004230393204602A9FFF733FACDF893
:1027F8000890CDF80C80204602A9FFF72BFA236831
:102808009A6842F480729A609A6842F001029A606B
:10281800736943F001037361736903F00103019362
:10282800019B114B1D60C3F80480104A9A60104A3E
:10283800DA6040F6A2221A601A6842F001021A60B1
:10284800384629462A46FEF7C5FF3846FEF7F4FF04
:1028580007B0BDE8F08300BF00100240C8000020A8
:102868000024014000000140080002404C240140BF
:10287800F8000020F0B585B0274B9A6942F48062D1
:102888009A619B6903F480630093009B234C244B5B
:1028980023604FF48073A3600023E36063614FF407
:1028A8006022E2616360052626612046FFF74CFB43
:1028B800012303930F2201920293204601A9FFF7F7
:1028C800C9F90D23019302250295204601A9FFF7B6
:1028D800C1F903950A23019303270297204601A90A
:1028E800FFF7B8F901950423029320460DEB030185
:1028F800FFF7B0F901970296204601A9FFF7AAF958
:1029080023689A6842F480729A609A6842F00102D9
:102918009A6005B0F0BD00BF0010024058000020CA
:1029280000280140704700BFFEE700BFFEE700BF78
:10293800FEE700BFFEE700BF704700BF704700BF5B
:10294800704700BF08B5FFF763F9FEF7A9FF08BD98
:1029580030B597B002250C950123109310231193DD
:102968001395002414944FF4601315930CA8FEF7E4
:10297800F1F80F230793089509944FF480630A939D
:102988000B9407A82946FEF71DFB01954FF4404319
:10299800039301A8FFF788F8FEF7D6FB084BA3FBC3
:1029A80000308009FEF754FF0420FEF767FF4FF060
:1029B800FF3021462246FEF70DFF17B030BD00BF9D
:1029C800D34D621010B582B0FFF710F92D4CA369F2
:1029D80043F00103A361A36903F001030193019B81
:1029E8000320FEF7E5FE6FF00B0000210A46FEF714
:1029F800F1FE6FF00A0000210A46FEF7EBFE6FF0C9
:102A0800090000210A46FEF7E5FE6FF004000021E8
:102A18000A46FEF7DFFE6FF0030000210A46FEF7C4
:102A2800D9FE6FF0010000210A46FEF7D3FE4FF0F1
:102A3800FF3000210A46FEF7CDFEFFF789FF6369E4
:102A480023F001036361FFF797FCFFF787FDFFF7AA
:102A58007DFEFFF70FFFFFF743FC0B482021012203
:102A6800FFF71CF80948FFF7CBF90948FFF7C8F941
:102A78000020FFF7DBF89623064A1360064A136026
:102A8800F6E700BF0010024000080140C80000201F
:102A980058000020380000204000002000000000FE
:102AA8000222994B5A60994B1B68B3F57A7F3ADA40
:102AB8000133964A1360964A938899B295480368F9
:102AC8000B4403EBD3735B100360D38899B292482D
:102AD80003680B4403EBD3735B100360138899B24C
:102AE8008E4803680B4403EBD3735B100360538871
:102AF80099B28B4803680B4403EBD3735B100360F4
:102B0800538999B2874803680B4403EBD3735B106E
:102B1800036013899AB284490B68134403EBD37397
:102B28005B100B60704770B584B0794B5B899BB2C2
:102B38007C4A1068181AFDF7F7FC71A3D3E9002343
:102B4800FDF758FD0022794BFDF7E4FF28B1784ADC
:102B5800536C23F40043536404E0754A536C43F404
:102B6800004353646A4B1B899BB26F4A1068181A5A
:102B7800FDF7DAFC62A3D3E90023FDF73BFD002251
:102B88006A4BFDF7C7FF28B16A4A536C23F4004328
:102B9800536404E0674A536C43F400435364664A41
:102BA800936813F0200F0CBF01210021936813F0E4
:102BB800400F0CBF01230023926812F0800F0CBF56
:102BC800012400245D4A906810F4806F0CBF012036
:102BD8000020956815F4006F0CBF01260026926846
:102BE80012F4805F03EB440301EB4303544DEB5CA9
:102BF80054490B600B6803F102030B600C68524BDD
:102C080083FB04E2A2EBE47202EB42024FEA4202C7
:102C1800A4EB02020A600CBF02220022324400EB3D
:102C28004202A85C494A10601068023010601068BF
:102C380083FB0043A3EBE07303EB43035B00C31A7E
:102C480013600968324883889BB2324A12689A1A1C
:102C5800C3889BB2304800681B1A052918D8DFE8DA
:102C680001F003070A0D1013D31A394A136012E052
:102C7800374B1A600FE0364B1A600CE0344A136089
:102C880009E0334A136006E09B1A314A136002E0F8
:102C980000222F4B1A601E4B988880B21D4A11687B
:102CA800401ADB889BB2591A0246002800DAC21D76
:102CB800D2100B46002900DACB1D002100910191AA
:102CC800029103910846DB1000F0D8F8214A1368F6
:102CD80001331360204B1A681A4B1B68052B48D820
:102CE800DFE803F003070B3C3F431446524200253C
:102CF80042E05542144600223EE0554200243BE0A3
:102D08007B14AE47E17A943F000002403C0000206B
:102D1800F800002004000020080000201400002013
:102D2800180000200C0000201000002000001440B3
:102D380000340140002C0140000C0140001001400B
:102D48004830000844000020ABAAAA2A4800002006
:102D58004C0000205000002038000020544200257C
:102D68000AE054421546002206E015465242002465
:102D780002E00022144615463C4B1B683C49096892
:102D880005291AD8DFE801F003070B0E11151946BB
:102D98005B42002014E058421946002310E05842D4
:102DA80000210DE0594200200AE05942184600234C
:102DB80006E018465B42002102E000231946184647
:102DC80005F57A7540F2C676B54203DC0A2DB8BF20
:102DD8000A2501E040F2C675264E756304F57A743B
:102DE80040F2C675AC4203DC0A2CB8BF0A2401E0E5
:102DF80040F2C6741F4DAC6302F57A7240F2C67495
:102E0800A24203DC0A2AB8BF0A2201E040F2C672D5
:102E1800184CE26300F57A7240F2C670824203DC15
:102E28000A2AB8BF0A2201E040F2C6721248426379
:102E380001F57A7240F2C6718A4203DC0A2AB8BFE9
:102E48000A2201E040F2C6720B498A6303F57A73DD
:102E580040F2C672934203DC0A2BB8BF0A2301E092
:102E680040F2C673044AD36304B070BD400000202A
:102E78004800002000340140002C014030B4FF25F8
:102E8800364C25707F30A84203DC20EAE070C0B2DF
:102E980000E0FF20314C60707F31FF2903DC21EA1C
:102EA800E171C9B200E0FF212C4881707F32FF2A0E
:102EB80003DC22EAE272D2B200E0FF222749CA709C
:102EC8007F33FF2B03DC23EAE373DBB200E0FF234D
:102ED800224A1371BDF908307F33FF2B03DC23EA44
:102EE800E373DBB200E0FF231C4A5371BDF90C30D9
:102EF8007F33FF2B03DC23EAE373DBB200E0FF231D
:102F0800164A9371BDF910307F33FF2B03DC23EA97
:102F1800E373DBB200E0FF23104AD371BDF914302C
:102F28007F33FF2B03DC23EAE373DBB200E0FF23EC
:102F38000A4A13720A235372094B5B6863B9084B38
:102F48001A6822F001021A600A225A60034ADA60FB
:102F58001A6842F001021A6030BC70474C01002028
:102F68001C000240002103E00B4B5B584350043126
:102F78000A480B4B42189A42F6D30A4A02E0002349
:102F880042F8043B084B9A42F9D3FFF783F900F063
:102F98000FF8FFF717FD70475830000800000020B1
:102FA8001C0000201C000020B8020020FEE70000E2
:102FB8000E4B70B51E460E4C0025E41AA410A5420F
:102FC80004D056F8253098470135F8E700F016F890
:102FD800084B094C1E46E41AA4100025A54204D04B
:102FE80056F8253098470135F8E770BD503000088D
:102FF800503000085030000854300008F8B500BFC1
:10300800F8BC08BC9E467047F8B500BFF8BC08BCC1
:043018009E46704719
:10301C0002030405060708090A0B0C0D0E0F10100D
:10302C000102000000000000000000000102030487
:10303C000607080900000000010203040000020159
:04304C000405030074
:04305000550200081D
:043054002D02000841
:1030580000A24A04D0070000D0070000D0070000F3
:0C306800D0070000D0070000D0070000D7
:0400000508002F6D53
:00000001FF
Loading…
Cancel
Save