








3. Нас интересует энергопотребление всего устройства, поэтому ставим минимальную скорость измерения





accel.Accelerometer_ = Accelerometer_;
accel.Accelerometer_(ACCEL_ADDRESS_V1, &(accel.LIS331DLH_TWI));
gyro.Gyroscope_ = Gyroscope_;
gyro.Gyroscope_(GYRO_ADDRESS_V1, &(gyro.L3G4200D_TWI));
compass.Compass_ = Compass_;
compass.Compass_(COMPASS_ADDRESS_V1, &(compass.LIS3MDL_TWI));
barometer.Barometer_ = Barometer_;
barometer.Barometer_(BARO_ADDRESS_V1, &(barometer.LPS331));
accel.LIS331DLH_TWI.begin(&(accel.LIS331DLH_TWI));
gyro.L3G4200D_TWI.begin(&(gyro.L3G4200D_TWI));
compass.LIS3MDL_TWI.begin(&(compass.LIS3MDL_TWI));
barometer.LPS331.begin(&(barometer.LPS331));
// устанавливаем чувствительность компаса
// ±4 gauss Ч по умолчанию, ±8 gauss, ±12 gauss, ±16 gauss
compass.LIS3MDL_TWI.setRange(RANGE_4_GAUSS, &(compass.LIS3MDL_TWI));
// калибровка компаса
compass.LIS3MDL_TWI.calibrateMatrix(compassCalibrationMatrix, compassCalibrationBias, &(compass.LIS3MDL_TWI));
//create filter object
Filter.Filter_=Filter_;
Filter.Filter_(&(Filter.Madgwick));
uint8_t whoiam = accel.LIS331DLH_TWI.readWhoIAm(&(accel.LIS331DLH_TWI));

if(htim->Instance == TIM1)
{//прерывание из таймера TIM1 - настроен на обновление раз в 1 мс
//timeout sleep
if(count_tim1_timeout_sleep!=0)
count_tim1_timeout_sleep--;
else
{
count_tim1_timeout_sleep=TIMEOUT_SLEEP_TIM1;
signal_timeout_sleep=1;
}
//генерируем событие "раз в 10 мс проверка объектов"
htim1_event_10ms_count_obj--; //уменьшаем счетчик для события
if(htim1_event_10ms_count_obj==0)
{//счетчик достиг конца - генерим событие
htim1_event_10ms_count_obj = HTIM1_EVENT_10ms_obj; //установим счетчик в изначальное состояние
event_10ms_flag_obj = 1; //установим флаг события
}
//update imu
if(count_tim1_update_imu!=0)
count_tim1_update_imu--;
else
{
count_tim1_update_imu=UPDATE_IMU_TIM1;
to_update_imu=1;
}
btn_bounce_tim1--;
if(btn_bounce_tim1==0)
{//update 100 ms
//keys
if(HAL_GPIO_ReadPin(BUTENC_GPIO_Port,BUTENC_Pin)==GPIO_PIN_RESET)
state_btn=0;
else
state_btn=1; 
btn_bounce_tim1--;
if(btn_bounce_tim1==0)
{//update 100 ms
//keys
if(HAL_GPIO_ReadPin(BUTENC_GPIO_Port,BUTENC_Pin)==GPIO_PIN_RESET)
state_btn=0;
else
state_btn=1;
if(state_btn_old==0 && state_btn==1)
{
btn_try_poll=1;
count_tim1_timeout_sleep=TIMEOUT_SLEEP_TIM1;
}
if(state_btn_old==1 && state_btn==0)
{
btn_try_push=1;
count_tim1_timeout_sleep=TIMEOUT_SLEEP_TIM1;
}
state_btn_old=state_btn;
//encoder roller
int32_t lev_enc = 0;
state_enc = HAL_LPTIM_ReadCounter(&hlptim1);
if(state_enc > state_enc_old + lev_enc)
enc_try_inc=1;
if(state_enc < state_enc_old - lev_enc)
enc_try_dec=1;
state_enc_old = state_enc;
btn_bounce_tim1=BTN_BOUNCE_PERIOD_TIM1;
}
}
} 
//encoder roller
int32_t lev_enc = 0;
state_enc = HAL_LPTIM_ReadCounter(&hlptim1);
if(state_enc > state_enc_old + lev_enc)
enc_try_inc=1;
if(state_enc < state_enc_old - lev_enc)
enc_try_dec=1;
state_enc_old = state_enc;
btn_bounce_tim1=BTN_BOUNCE_PERIOD_TIM1;
}
}
} 
if(htim->Instance == TIM2)
{//прерывание из таймера TIM2 - настроен на обновление раз в 200 мс
}
if(htim->Instance == TIM1)
{//прерывание из таймера TIM1 - настроен на обновление раз в 1 мс
//timeout sleep
if(count_tim1_timeout_sleep!=0)
count_tim1_timeout_sleep--;
else
{
count_tim1_timeout_sleep=TIMEOUT_SLEEP_TIM1;
signal_timeout_sleep=1;
}
//генерируем событие "раз в 10 мс проверка объектов"
htim1_event_10ms_count_obj--; //уменьшаем счетчик для события
if(htim1_event_10ms_count_obj==0)
{//счетчик достиг конца - генерим событие
htim1_event_10ms_count_obj = HTIM1_EVENT_10ms_obj; //установим счетчик в изначальное состояние
event_10ms_flag_obj = 1; //установим флаг события
}
//update imu
if(count_tim1_update_imu!=0)
count_tim1_update_imu--;
else
{
count_tim1_update_imu=UPDATE_IMU_TIM1;
to_update_imu=1;
} 
| Стартуем! |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Дальше |
| Проверить |
| Узнать результат |
| Пройти еще раз |
| Пройти еще раз |
| Пройти еще раз |