Skip to content

Commit 0d9356c

Browse files
Try removing a lot of noise
1 parent 78afba3 commit 0d9356c

3 files changed

Lines changed: 33 additions & 8 deletions

File tree

Inc/HALAL/Models/TimerDomain/TimerDomain.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,12 @@ struct TimerDomain {
746746
Scheduler_global_timer = cmsis_timers[timer_idxmap[SCHEDULER_TIMER_DOMAIN]];
747747
rcc_enable_timer(Scheduler_global_timer);
748748

749+
for(uint32_t inst = 0; inst < TimerDomain::max_instances; inst++) {
750+
for(uint32_t ch = 0; i < TimerDomain::input_capture_channels; ch++) {
751+
input_capture_info[inst][ch] = &input_capture_info_dummy;
752+
}
753+
}
754+
749755
TimerDomain::callbacks[0] = TIM_Default_Callback;
750756
TimerDomain::callbacks[1] = TIM_Default_Callback;
751757
TimerDomain::callbacks[2] = TIM_Default_Callback;

Inc/HALAL/Services/InputCapture/InputCapture.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class InputCapture {
5959
.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING,
6060
.ICSelection = TIM_ICSELECTION_DIRECTTI,
6161
.ICPrescaler = TIM_ICPSC_DIV1,
62-
.ICFilter = 0,
62+
/* filter out with hardware some noise */
63+
.ICFilter = 0x03,
6364
};
6465
timer->template config_input_compare_channel<pin_rising.channel>(&sConfigIC);
6566

Src/HALAL/Models/TimerDomain/TimerDomain.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,36 @@ void* TimerDomain::callback_data[TimerDomain::max_instances] = {nullptr};
2727
TimerDomain::InputCaptureInfo input_capture_info_dummy = {
2828
.channel_rising = 0xFF, // any value that isn't possible here
2929
.channel_falling = 0xFF, // any value that isn't possible here
30+
31+
.value_rising = 0,
32+
.value_falling = 0,
33+
.period = 0,
34+
35+
.duty_cycle = 0,
36+
.frequency = 0,
3037
};
3138

3239
TimerDomain::InputCaptureInfo* TimerDomain::input_capture_info[max_instances]
33-
[input_capture_channels] = {
34-
{&input_capture_info_dummy}
35-
};
40+
[input_capture_channels];
3641
TimerDomain::InputCaptureInfo TimerDomain::input_capture_info_backing[max_instances]
3742
[input_capture_channels];
3843

3944
static void TIM_IC_CaptureCallback(const uint32_t timer_idx, uint32_t channel) {
4045
TIM_HandleTypeDef* htim = TimerDomain::hal_handles[timer_idx];
4146

4247
TimerDomain::InputCaptureInfo* info = TimerDomain::input_capture_info[timer_idx][channel];
48+
uint32_t current = (*(((volatile uint32_t*)&htim->Instance->CCR1) + channel));
4349
if (info->channel_rising == channel) {
4450
// NOTE: CCR1 - CCR4 are contiguous
4551
// NOTE: CCxIF flag is cleared by software by reading the captured data in CCRx
46-
uint32_t current = (*(((volatile uint32_t*)&htim->Instance->CCR1) + channel));
47-
uint32_t period = current - info->value_rising;
52+
uint32_t period;
53+
if (current >= info->value_rising) {
54+
period = current - info->value_rising;
55+
} else {
56+
// counter wrap around
57+
uint32_t max_count = htim->Instance->ARR - 1;
58+
period = (current + max_count) - info->value_rising;
59+
}
4860

4961
if ((period != 0) && (info->value_falling < period)) {
5062
uint32_t ref_clock =
@@ -55,8 +67,14 @@ static void TIM_IC_CaptureCallback(const uint32_t timer_idx, uint32_t channel) {
5567
}
5668
info->value_rising = current;
5769
} else if (info->channel_falling == channel) {
58-
uint32_t falling_value =
59-
*(((volatile uint32_t*)&htim->Instance->CCR1) + channel) - info->value_rising;
70+
uint32_t falling_value;
71+
if (current >= info->value_rising) {
72+
falling_value = current - info->value_rising;
73+
} else {
74+
uint32_t max_count = htim->Instance->ARR - 1;
75+
falling_value = (current + max_count) - info->value_rising;
76+
}
77+
6078
if (falling_value < info->period)
6179
info->value_falling = falling_value;
6280
} else [[unlikely]] {

0 commit comments

Comments
 (0)