добавление в bench_time измерения периода
улучшение фильтров (эксп и авераге)
This commit is contained in:
parent
513f56fe7d
commit
30fdbc35dd
@ -182,6 +182,61 @@ static inline uint32_t BenchTime_End(uint8_t channel, uint32_t ticks) {
|
||||
return elapsed_ticks;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Измерение периода на указанном канале
|
||||
* @param channel Номер канала (0..BENCH_TIME_MAX_CHANNELS-1)
|
||||
* @param ticks Источник тиков (например: HAL_GetTick(), TIM2->CNT, DWT->CYCCNT)
|
||||
* @param tick_period Период тиков для переполнения
|
||||
* @return Измеренное время в тиках, 0 - в случае первого запуска или ошибки
|
||||
*/
|
||||
static inline uint32_t BenchTime_Period(uint8_t channel, uint32_t ticks, uint32_t tick_period) {
|
||||
if (channel >= BENCH_TIME_MAX_CHANNELS) return 0;
|
||||
if (!hbt.channels[channel].is_running)
|
||||
{
|
||||
hbt.channels[channel].start_tick = ticks;
|
||||
hbt.channels[channel].tick_period = tick_period;
|
||||
hbt.channels[channel].is_running = 1;
|
||||
return 0;
|
||||
};
|
||||
|
||||
uint32_t end_tick = ticks;
|
||||
uint32_t start_tick = hbt.channels[channel].start_tick;
|
||||
uint32_t elapsed_ticks;
|
||||
|
||||
// Инит для следующего измерения
|
||||
hbt.channels[channel].start_tick = end_tick;
|
||||
hbt.channels[channel].tick_period = tick_period;
|
||||
|
||||
if (end_tick >= start_tick) {
|
||||
elapsed_ticks = end_tick - start_tick;
|
||||
} else {
|
||||
elapsed_ticks = (tick_period - start_tick) + end_tick + 1;
|
||||
}
|
||||
|
||||
if (elapsed_ticks > tick_period) {
|
||||
elapsed_ticks = tick_period;
|
||||
}
|
||||
|
||||
// Обновление статистики
|
||||
BenchTimeStats_t* stats = &hbt.channels[channel].stats;
|
||||
stats->last_ticks = elapsed_ticks;
|
||||
|
||||
if (elapsed_ticks < stats->min_ticks) {
|
||||
stats->min_ticks = elapsed_ticks;
|
||||
}
|
||||
|
||||
if (elapsed_ticks > stats->max_ticks) {
|
||||
stats->max_ticks = elapsed_ticks;
|
||||
}
|
||||
|
||||
stats->total_ticks += elapsed_ticks;
|
||||
stats->count++;
|
||||
|
||||
return elapsed_ticks;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Получение минимального времени измерения
|
||||
*/
|
||||
|
||||
@ -271,6 +271,25 @@ int FilterPoly_Init(FilterPoly_t* filter, float* coeffs, uint8_t order);
|
||||
float FilterPoly_Process(FilterPoly_t* filter, float input);
|
||||
int FilterLUT_Init(FilterLUT_t* filter, float* input_arr, float* output_arr, uint16_t size, uint8_t interpolation);
|
||||
float FilterLUT_Process(FilterLUT_t* filter, float input);
|
||||
|
||||
|
||||
// Расчет всякого
|
||||
#define FilterExp_CalcAlpha(tau, TsUs) (((float)TsUs/1000000) / (((float)TsUs/1000000) + (tau)))
|
||||
|
||||
/* Расчет alpha для времени нарастания до 63% */
|
||||
#define FilterExp_CalcAlpha63(rise_time, TsUs) FilterExp_CalcAlpha((rise_time) / 1.0f, TsUs)
|
||||
|
||||
/* Расчет alpha для времени нарастания до 86% */
|
||||
#define FilterExp_CalcAlpha86(rise_time, TsUs) FilterExp_CalcAlpha((rise_time) / 2.0f, TsUs)
|
||||
|
||||
/* Расчет alpha для времени нарастания до 95% */
|
||||
#define FilterExp_CalcAlpha95(rise_time, TsUs) FilterExp_CalcAlpha((rise_time) / 3.0f, TsUs)
|
||||
|
||||
/* Расчет alpha для времени нарастания до 98% */
|
||||
#define FilterExp_CalcAlpha98(rise_time, TsUs) FilterExp_CalcAlpha((rise_time) / 4.0f, TsUs)
|
||||
|
||||
/* Расчет alpha для времени нарастания до 99% */
|
||||
#define FilterExp_CalcAlpha99(rise_time, TsUs) FilterExp_CalcAlpha((rise_time) / 5.0f, TsUs)
|
||||
// ==================== INT32_T ВЕРСИИ ====================
|
||||
|
||||
/**
|
||||
|
||||
@ -158,7 +158,7 @@ float FilterAverage_Process(FilterAverage_t* filter, float input) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (filter->count > filter->size)
|
||||
if (filter->count >= filter->size)
|
||||
{
|
||||
filter->lastValue = filter->sum / filter->count;
|
||||
filter->count = 0;
|
||||
@ -431,7 +431,7 @@ int32_t FilterAverageInt_Process(FilterAverageInt_t* filter, int32_t input) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (filter->count == filter->size)
|
||||
if (filter->count >= filter->size)
|
||||
{
|
||||
filter->lastValue = filter->sum / filter->count;
|
||||
filter->count = 0;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user