Skip to content

Commit c557277

Browse files
committed
dead_time
1 parent e4ff964 commit c557277

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/timer.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,8 @@ mod sealed {
275275

276276
pub trait Advanced: WithPwmCommon {
277277
fn enable_nchannel(channel: u8, b: bool);
278+
fn set_dtg_value(value: u8);
279+
fn read_dtg_value() -> u8;
278280
}
279281

280282
pub trait WithPwm: WithPwmCommon {
@@ -463,6 +465,14 @@ macro_rules! hal {
463465
unsafe { bb::write(&tim.ccer, c*4 + 2, b); }
464466
}
465467
}
468+
fn set_dtg_value(value: u8) {
469+
let tim = unsafe { &*<$TIM>::ptr() };
470+
tim.bdtr.modify(|_,w| unsafe { w.dtg().bits(value) });
471+
}
472+
fn read_dtg_value() -> u8 {
473+
let tim = unsafe { &*<$TIM>::ptr() };
474+
tim.bdtr.read().dtg().bits()
475+
}
466476
}
467477
)?
468478

src/timer/pwm.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,15 @@ where
419419
pub fn disable_complementary(&mut self, channel: Channel) {
420420
TIM::enable_nchannel(PINS::check_complementary_used(channel) as u8, false)
421421
}
422+
423+
pub fn set_dead_time(&mut self, dts_ticks: u16) {
424+
let bits = pack_ceil_dead_time(dts_ticks);
425+
TIM::set_dtg_value(bits);
426+
}
427+
428+
pub fn get_dead_time(&self) -> u16 {
429+
unpack_dead_time(TIM::read_dtg_value())
430+
}
422431
}
423432

424433
pub struct Pwm<TIM, P, PINS, const FREQ: u32>
@@ -576,4 +585,35 @@ where
576585
pub fn disable_complementary(&mut self, channel: Channel) {
577586
TIM::enable_nchannel(PINS::check_complementary_used(channel) as u8, false)
578587
}
588+
589+
pub fn set_dead_time(&mut self, dts_ticks: u16) {
590+
let bits = pack_ceil_dead_time(dts_ticks);
591+
TIM::set_dtg_value(bits);
592+
}
593+
594+
pub fn get_dead_time(&self) -> u16 {
595+
unpack_dead_time(TIM::read_dtg_value())
596+
}
597+
}
598+
599+
const fn pack_ceil_dead_time(dts_ticks: u16) -> u8 {
600+
match dts_ticks {
601+
0..=127 => dts_ticks as u8,
602+
128..=254 => ((((dts_ticks + 1) >> 1) - 64) as u8) | 0b_1000_0000,
603+
255..=504 => ((((dts_ticks + 7) >> 3) - 32) as u8) | 0b_1100_0000,
604+
505..=1008 => ((((dts_ticks + 15) >> 4) - 32) as u8) | 0b_1110_0000,
605+
1009.. => 0xff,
606+
}
607+
}
608+
609+
const fn unpack_dead_time(bits: u8) -> u16 {
610+
if bits & 0b_1000_0000 == 0 {
611+
bits as u16
612+
} else if bits & 0b_0100_0000 == 0 {
613+
(((bits & !0b_1000_0000) as u16) + 64) * 2
614+
} else if bits & 0b_0010_0000 == 0 {
615+
(((bits & !0b_1100_0000) as u16) + 32) * 8
616+
} else {
617+
(((bits & !0b_1110_0000) as u16) + 32) * 16
618+
}
579619
}

0 commit comments

Comments
 (0)