Encoder fyrir position í int32, stöðuvél án null-pointera, nefndir fastar, LED gegnum context

This commit is contained in:
2026-09-30 11:55:41 +00:00
parent c46539a57b
commit 1e02205344
8 changed files with 91 additions and 99 deletions
+19 -35
View File
@@ -1,80 +1,70 @@
#include "rotary_encoder_driver.h"
#include <avr/interrupt.h>
RotaryEncoderDriver* driver = nullptr;
static RotaryEncoderDriver* driver = nullptr;
RotaryEncoderDriver::RotaryEncoderDriver()
: cycle(0)
, count(0)
, prev_count(0)
: count(0)
, delta(0)
, speed_ready(false)
, hist_idx(0)
, eA(2)
, eB(5)
, delta(0)
{
for (uint8_t i = 0; i < HIST_LEN; i++)
for (uint8_t i = 0; i < HIST_LEN; i++)
{
history[i] = 0;
}
}
void RotaryEncoderDriver::begin()
void RotaryEncoderDriver::begin()
{
driver = this;
//led.init();
eA.init();
eB.init();
EICRA |= (1<<ISC01) | (1<<ISC00);
EIMSK |= (1<<INT0);
timer.init(4000);
timer.init(SAMPLE_PERIOD_US);
}
void RotaryEncoderDriver::update()
void RotaryEncoderDriver::update()
{
count += eB.is_hi() ? 1 : -1;
//led.set_hi();
}
int RotaryEncoderDriver::position()
int32_t RotaryEncoderDriver::position()
{
uint8_t oldSREG = SREG;
cli();
int16_t local_count = count;
int32_t local_count = count;
SREG = oldSREG;
//led.set_lo();
return local_count;
}
}
void RotaryEncoderDriver::update_delta()
void RotaryEncoderDriver::update_delta()
{
int16_t oldest = history[hist_idx];
int32_t oldest = history[hist_idx];
history[hist_idx] = count;
hist_idx = (hist_idx + 1) % HIST_LEN;
delta = count - oldest; // breyting yfir HIST_LEN * Ts (16 ms) glugga
prev_count = count;
delta = (int16_t)(count - oldest); // breyting yfir HIST_LEN * Ts (16 ms) glugga
speed_ready = true;
//led.set_lo();
}
float RotaryEncoderDriver::count_per_sec()
float RotaryEncoderDriver::count_per_sec()
{
uint8_t oldSREG = SREG;
@@ -85,14 +75,12 @@ float RotaryEncoderDriver::count_per_sec()
SREG = oldSREG;
return local_delta / (HIST_LEN * 0.004f);
return local_delta / (HIST_LEN * SAMPLE_PERIOD_US * 1e-6f);
}
float RotaryEncoderDriver::rpm()
{
const float COUNTS_PER_REV = 1050.0f;
return count_per_sec() * 60.0f / COUNTS_PER_REV;
}
@@ -121,12 +109,10 @@ void RotaryEncoderDriver::reset_speed_measurement()
cli();
cycle = 0;
prev_count = count;
delta = 0;
speed_ready = false;
for (uint8_t i = 0; i < HIST_LEN; i++)
for (uint8_t i = 0; i < HIST_LEN; i++)
{
history[i] = count;
}
@@ -136,13 +122,11 @@ void RotaryEncoderDriver::reset_speed_measurement()
SREG = oldSREG;
}
ISR(INT0_vect)
ISR(INT0_vect)
{
driver->update();
}
ISR(TIMER1_COMPA_vect)
ISR(TIMER1_COMPA_vect)
{
driver->update_delta();
driver->update_delta();
}