adc average

This commit is contained in:
Kizarm 2024-03-04 14:09:45 +01:00
parent a4c3361300
commit 40cc0ee799
3 changed files with 8 additions and 9 deletions

View file

@ -44,8 +44,6 @@ $(BLD)%.o: %.cpp
@$(CXX) -std=c++17 -fno-rtti -c $(CFLAGS) $< -o $@ @$(CXX) -std=c++17 -fno-rtti -c $(CFLAGS) $< -o $@
$(BLD): $(BLD):
mkdir $(BLD) mkdir $(BLD)
sin.c: sin.py
./sin.py
flash: $(PRJ).elf flash: $(PRJ).elf
minichlink -w $(PRJ).bin flash -b minichlink -w $(PRJ).bin flash -b
# vycisti # vycisti

View file

@ -93,7 +93,7 @@ static inline void AdcPostInit (void) noexcept {
AdcClass::AdcClass() noexcept : pL (buffer), pH (buffer + HALF_LEN), dst (nullptr) { AdcClass::AdcClass() noexcept : pL (buffer), pH (buffer + HALF_LEN), dst (nullptr) {
pInstance = this; pInstance = this;
EnableClock (); EnableClock ();
Timer2Init (1000u); Timer2Init (100u);
NVIC.EnableIRQ (DMA1_Channel1_IRQn); NVIC.EnableIRQ (DMA1_Channel1_IRQn);
AdcCalibrate(); AdcCalibrate();
Dma1Ch1Init (buffer); Dma1Ch1Init (buffer);

View file

@ -10,16 +10,17 @@ class Process : public OneWay {
Print cout; Print cout;
FIFO<uint16_t, 8> data; FIFO<uint16_t, 8> data;
int pass_cnt; int pass_cnt;
unsigned average;
public: public:
explicit Process () noexcept : OneWay (), explicit Process () noexcept : OneWay (),
led (GPIOD, 4), serial (115200u), cout (DEC), data(), pass_cnt (0) { led (GPIOD, 4), serial (115200u), cout (DEC), data(), pass_cnt (0), average (0u) {
cout += serial; cout += serial;
} }
unsigned Send (uint16_t * const ptr, const unsigned len) override { unsigned Send (uint16_t * const ptr, const unsigned len) override {
unsigned sum = 0u; // Klouzavý průměr s exponenciálním zapomínáním lépe drží stálou hodnotu pro zobrazení.
for (unsigned n=0; n<len; n++) sum += ptr [n]; // Průměr je rozšířen na 12-bit (0 - 4096) násobením hodnoty 4.
sum >>= 4; for (unsigned n=0; n<len; n++) average = (15u * average + 4u * ptr [n]) >> 4;
data.Write (static_cast<uint16_t> (sum)); data.Write (static_cast<uint16_t> (average));
return len; return len;
} }
void pass () { void pass () {
@ -33,7 +34,7 @@ class Process : public OneWay {
}; };
////////////////////////////////////// //////////////////////////////////////
/* Tohle DEMO je složitější. ADC má /* Tohle DEMO je složitější. ADC má
* pevnou frekvenci vzorkování 1kHz, * pevnou frekvenci vzorkování 10kHz,
* vzorky se průměrují v přerušení a * vzorky se průměrují v přerušení a
* vypisují (v jiném přerušení) na * vypisují (v jiném přerušení) na
* sériový port. * sériový port.