forked from catompiler/stm32libs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e07a838
commit ac7443c
Showing
14 changed files
with
906 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
#include "avg.h" | ||
|
||
|
||
err_t avg_init(avg_t* avg) | ||
{ | ||
avg->count = 0; | ||
avg->data = 0; | ||
avg->sum = 0; | ||
|
||
return E_NO_ERROR; | ||
} | ||
|
||
void avg_reset(avg_t* avg) | ||
{ | ||
avg->sum = 0; | ||
avg->data = 0; | ||
avg->count = 0; | ||
} | ||
|
||
void avg_put(avg_t* avg, avg_data_t data) | ||
{ | ||
avg->sum = iq15_add(avg->sum, data); | ||
avg->count ++; | ||
} | ||
|
||
avg_data_t avg_calc(avg_t* avg) | ||
{ | ||
if(avg->count > 1){ | ||
avg->data = iq15_idiv(avg->sum, (int32_t)avg->count); | ||
}else if(avg->count == 1){ | ||
avg->data = avg->sum; | ||
}else{ | ||
avg->data = 0; | ||
} | ||
avg->sum = 0; | ||
avg->count = 0; | ||
|
||
return avg->data; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
/** | ||
* @file avg.h Библиотека усреднениея. | ||
*/ | ||
|
||
#ifndef AVG_H_ | ||
#define AVG_H_ | ||
|
||
#include <stdint.h> | ||
#include <stddef.h> | ||
#include <stdbool.h> | ||
#include "errors/errors.h" | ||
#include "defs/defs.h" | ||
#include "q15/q15.h" | ||
|
||
//! Тип данных для усреднения. | ||
typedef q15_t avg_data_t; | ||
|
||
//! Тип суммы данных для усреднения. | ||
typedef iq15_t avg_sum_t; | ||
|
||
//! Структура усреднения. | ||
typedef struct _Avg { | ||
size_t count; //!< Количество элементов для усреднения. | ||
avg_sum_t sum; //!< Сумма данных. | ||
avg_data_t data; //!< Текущие данные. | ||
} avg_t; | ||
|
||
|
||
/** | ||
* Инициализирует усреднение. | ||
* @param avg Усреднение. | ||
* @return Код ошибки. | ||
*/ | ||
extern err_t avg_init(avg_t* avg); | ||
|
||
/** | ||
* Сбрасывает усреднение. | ||
* @param avg Усреднение. | ||
*/ | ||
extern void avg_reset(avg_t* avg); | ||
|
||
/** | ||
* Помещает данные в усреднение. | ||
* @param avg Усреднение. | ||
* @param data Данные. | ||
*/ | ||
extern void avg_put(avg_t* avg, avg_data_t data); | ||
|
||
/** | ||
* Вычисляет среднее. | ||
* @param avg Усреднение. | ||
* @return Последние данные. | ||
*/ | ||
extern avg_data_t avg_calc(avg_t* avg); | ||
|
||
/** | ||
* Получает последние данные. | ||
* @param avg Усреднение. | ||
* @return Последние данные. | ||
*/ | ||
ALWAYS_INLINE static avg_data_t avg_data(avg_t* avg) | ||
{ | ||
return avg->data; | ||
} | ||
|
||
#endif /* AVG_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
#include "decim.h" | ||
|
||
|
||
err_t decim_init(decim_t* decim, size_t scale) | ||
{ | ||
if(scale == 0) return E_INVALID_VALUE; | ||
|
||
decim->scale = scale; | ||
decim->index = 0; | ||
decim->data = 0; | ||
|
||
return E_NO_ERROR; | ||
} | ||
|
||
void decim_reset(decim_t* decim) | ||
{ | ||
decim->data = 0; | ||
decim->index = 0; | ||
} | ||
|
||
void decim_put(decim_t* decim, decim_data_t data) | ||
{ | ||
size_t next = decim->index + 1; | ||
|
||
if(next >= decim->scale){ | ||
decim->data = data; | ||
next = 0; | ||
} | ||
|
||
decim->index = next; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/** | ||
* @file decim.h Библиотека дециматора. | ||
*/ | ||
|
||
#ifndef DECIM_H_ | ||
#define DECIM_H_ | ||
|
||
#include <stdint.h> | ||
#include <stddef.h> | ||
#include <stdbool.h> | ||
#include "errors/errors.h" | ||
#include "defs/defs.h" | ||
#include "q15/q15.h" | ||
|
||
//! Тип данных для децимации. | ||
typedef q15_t decim_data_t; | ||
|
||
//! Структура дециматора. | ||
typedef struct _Decim { | ||
size_t scale; //!< Коэффициент децимации. | ||
size_t index; //!< Счётчик семплов. | ||
decim_data_t data; //!< Текущие данные. | ||
} decim_t; | ||
|
||
|
||
/** | ||
* Инициализирует дециматор. | ||
* @param decim Дециматор. | ||
* @param scale Коэффициент децимации. | ||
* @return Код ошибки. | ||
*/ | ||
extern err_t decim_init(decim_t* decim, size_t scale); | ||
|
||
/** | ||
* Сбрасывает дециматор. | ||
* @param decim Дециматор. | ||
*/ | ||
extern void decim_reset(decim_t* decim); | ||
|
||
/** | ||
* Помещает данные в дециматор. | ||
* @param decim Дециматор. | ||
* @param data Данные. | ||
*/ | ||
extern void decim_put(decim_t* decim, decim_data_t data); | ||
|
||
/** | ||
* Получает флаг готовности данных. | ||
* @param decim Дециматор. | ||
* @return Флаг готовности данных. | ||
*/ | ||
ALWAYS_INLINE static bool decim_ready(decim_t* decim) | ||
{ | ||
return decim->index == 0; | ||
} | ||
|
||
/** | ||
* Получает последние данные. | ||
* @param decim Дециматор. | ||
* @return Последние данные. | ||
*/ | ||
ALWAYS_INLINE static decim_data_t decim_data(decim_t* decim) | ||
{ | ||
return decim->data; | ||
} | ||
/** | ||
* Получает коэффициент децимации. | ||
* @param decim Дециматор. | ||
* @return Коэффициент децимации. | ||
*/ | ||
ALWAYS_INLINE static size_t decim_scale(decim_t* decim) | ||
{ | ||
return decim->scale; | ||
} | ||
|
||
/** | ||
* Получает смещение с последней выборки исходного сигнала. | ||
* @param decim Дециматор. | ||
* @return Смещение. | ||
*/ | ||
ALWAYS_INLINE static size_t decim_skew(decim_t* decim) | ||
{ | ||
return decim->index; | ||
} | ||
|
||
#endif /* DECIM_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#include "decim_avg.h" | ||
|
||
|
||
err_t decim_avg_init(decim_avg_t* decim, size_t scale) | ||
{ | ||
if(scale == 0) return E_INVALID_VALUE; | ||
|
||
decim->scale = scale; | ||
decim->index = 0; | ||
decim->data = 0; | ||
decim->sum = 0; | ||
|
||
return E_NO_ERROR; | ||
} | ||
|
||
void decim_avg_reset(decim_avg_t* decim) | ||
{ | ||
decim->sum = 0; | ||
decim->data = 0; | ||
decim->index = 0; | ||
} | ||
|
||
void decim_avg_put(decim_avg_t* decim, decim_avg_data_t data) | ||
{ | ||
size_t next = decim->index + 1; | ||
|
||
decim->sum = iq15_add(decim->sum, data); | ||
|
||
if(next >= decim->scale){ | ||
if(decim->scale > 1){ | ||
decim->data = iq15_idiv(decim->sum, (int32_t)decim->scale); | ||
}else if(decim->scale == 1){ | ||
decim->data = decim->sum; | ||
}else{ | ||
decim->data = 0; | ||
} | ||
decim->sum = 0; | ||
next = 0; | ||
} | ||
|
||
decim->index = next; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/** | ||
* @file decim_avg_avg.h Библиотека дециматора с усреднением. | ||
*/ | ||
|
||
#ifndef DECIM_AVG_H_ | ||
#define DECIM_AVG_H_ | ||
|
||
#include <stdint.h> | ||
#include <stddef.h> | ||
#include <stdbool.h> | ||
#include "errors/errors.h" | ||
#include "defs/defs.h" | ||
#include "q15.h" | ||
|
||
//! Тип данных для децимации. | ||
typedef q15_t decim_avg_data_t; | ||
|
||
//! Тип суммы данных для децимации. | ||
typedef iq15_t decim_avg_sum_t; | ||
|
||
//! Структура дециматора. | ||
typedef struct _Decim_Avg { | ||
size_t scale; //!< Коэффициент децимации. | ||
size_t index; //!< Счётчик семплов. | ||
decim_avg_sum_t sum; //!< Сумма данных. | ||
decim_avg_data_t data; //!< Текущие данные. | ||
} decim_avg_t; | ||
|
||
|
||
/** | ||
* Инициализирует дециматор. | ||
* @param decim Дециматор. | ||
* @param scale Коэффициент децимации. | ||
* @return Код ошибки. | ||
*/ | ||
extern err_t decim_avg_init(decim_avg_t* decim, size_t scale); | ||
|
||
/** | ||
* Сбрасывает дециматор. | ||
* @param decim Дециматор. | ||
*/ | ||
extern void decim_avg_reset(decim_avg_t* decim); | ||
|
||
/** | ||
* Помещает данные в дециматор. | ||
* @param decim Дециматор. | ||
* @param data Данные. | ||
*/ | ||
extern void decim_avg_put(decim_avg_t* decim, decim_avg_data_t data); | ||
|
||
/** | ||
* Получает флаг готовности данных. | ||
* @param decim Дециматор. | ||
* @return Флаг готовности данных. | ||
*/ | ||
ALWAYS_INLINE static bool decim_avg_ready(decim_avg_t* decim) | ||
{ | ||
return decim->index == 0; | ||
} | ||
|
||
/** | ||
* Получает последние данные. | ||
* @param decim Дециматор. | ||
* @return Последние данные. | ||
*/ | ||
ALWAYS_INLINE static decim_avg_data_t decim_avg_data(decim_avg_t* decim) | ||
{ | ||
return decim->data; | ||
} | ||
/** | ||
* Получает коэффициент децимации. | ||
* @param decim Дециматор. | ||
* @return Коэффициент децимации. | ||
*/ | ||
ALWAYS_INLINE static size_t decim_avg_scale(decim_avg_t* decim) | ||
{ | ||
return decim->scale; | ||
} | ||
|
||
/** | ||
* Получает смещение с последней выборки исходного сигнала. | ||
* @param decim Дециматор. | ||
* @return Смещение. | ||
*/ | ||
ALWAYS_INLINE static size_t decim_avg_skew(decim_avg_t* decim) | ||
{ | ||
return decim->index; | ||
} | ||
|
||
#endif /* DECIM_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
#include "edge_detect.h" | ||
|
||
//! Маска детектора фронта. | ||
#define EDGE_DETECT_MASK 0x3 | ||
|
||
|
||
|
||
void edge_detect_init(edge_detect_t* edge_detect) | ||
{ | ||
edge_detect->data = EDGE_DETECT_LOW; | ||
} | ||
|
||
void edge_detect_reset(edge_detect_t* edge_detect) | ||
{ | ||
edge_detect->data = EDGE_DETECT_LOW; | ||
} | ||
|
||
void edge_detect_reset_value(edge_detect_t* edge_detect, bool value) | ||
{ | ||
edge_detect->data = value ? EDGE_DETECT_HIGH : EDGE_DETECT_LOW; | ||
} | ||
|
||
edge_detect_state_t edge_detect_put(edge_detect_t* edge_detect, bool value) | ||
{ | ||
uint32_t data = edge_detect->data; | ||
uint32_t bit = value & 0x1; | ||
|
||
data = ((data << 1) | bit); | ||
|
||
edge_detect->data = (uint8_t)(data & EDGE_DETECT_MASK); | ||
|
||
return (edge_detect_state_t)edge_detect->data; | ||
} | ||
|
||
edge_detect_state_t edge_detect_state(edge_detect_t* edge_detect) | ||
{ | ||
return (edge_detect_state_t)edge_detect->data; | ||
} | ||
|
Oops, something went wrong.