@@ -419,6 +419,15 @@ where
419
419
pub fn disable_complementary ( & mut self , channel : Channel ) {
420
420
TIM :: enable_nchannel ( PINS :: check_complementary_used ( channel) as u8 , false )
421
421
}
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
+ }
422
431
}
423
432
424
433
pub struct Pwm < TIM , P , PINS , const FREQ : u32 >
@@ -576,4 +585,35 @@ where
576
585
pub fn disable_complementary ( & mut self , channel : Channel ) {
577
586
TIM :: enable_nchannel ( PINS :: check_complementary_used ( channel) as u8 , false )
578
587
}
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
+ }
579
619
}
0 commit comments