Skip to content

Commit dd65cd0

Browse files
committed
A bit less far from compiling...
1 parent e9e7eb0 commit dd65cd0

File tree

4 files changed

+111
-83
lines changed

4 files changed

+111
-83
lines changed

src/mcpwm/mod.rs

+5-14
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ use core::borrow::Borrow;
5959

6060
use crate::gpio::OutputPin;
6161
use crate::units::{FromValueType, Hertz};
62+
use crate::mcpwm::operator::{HwOperator, OPERATOR0, OPERATOR1, OPERATOR2};
6263
use esp_idf_sys::*;
6364

6465
// MCPWM clock source frequency for ESP32 and ESP32-s3
@@ -116,23 +117,13 @@ impl<U: Unit> MCPWM<U> {
116117
}
117118

118119
pub trait Unit: Default {
119-
fn unit() -> mcpwm_unit_t;
120+
const ID: mcpwm_unit_t;
120121
}
121122

122123
impl Unit for UnitZero {
123-
fn unit() -> mcpwm_unit_t {
124-
mcpwm_unit_t_MCPWM_UNIT_0
125-
}
124+
const ID: mcpwm_unit_t = mcpwm_unit_t_MCPWM_UNIT_0;
126125
}
127126

128127
impl Unit for UnitOne {
129-
fn unit() -> mcpwm_unit_t {
130-
mcpwm_unit_t_MCPWM_UNIT_1
131-
}
132-
}
133-
134-
trait OptionalOperator<U: Unit, O: HwOperator<U>> {}
135-
136-
struct NoOperator;
137-
impl<U: Unit, O: HwOperator> OptionalOperator<U, O> for NoOperator {}
138-
128+
const ID: mcpwm_unit_t = mcpwm_unit_t_MCPWM_UNIT_1;
129+
}

src/mcpwm/operator.rs

+48-46
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
1+
use std::borrow::Borrow;
2+
3+
use esp_idf_sys::{mcpwm_io_signals_t, mcpwm_unit_t, mcpwm_operator_t,
4+
mcpwm_io_signals_t_MCPWM0A, mcpwm_io_signals_t_MCPWM0B,
5+
mcpwm_io_signals_t_MCPWM1A, mcpwm_io_signals_t_MCPWM1B,
6+
mcpwm_io_signals_t_MCPWM2A, mcpwm_io_signals_t_MCPWM2B, EspError
7+
};
8+
9+
use crate::{mcpwm::{Unit, UnitZero, UnitOne}, gpio::OutputPin};
10+
11+
use super::{Duty, timer_connection::OptionalOutputPin};
12+
113
// The hardware for ESP32 and ESP32-S3 can associate any operator(within the mcpwm module) with any
214
// timer(within the mcpwm module) for example allowing using the same timer for all three operators.
3-
// However at least as of IDF v4.4 timer0 is hardcoded to operator0 and timer1 to operator1 and so on...
4-
pub trait HwOperator<U: Unit>: Into<Operator<U, Self>> {
5-
fn signal_a() -> mcpwm_io_signals_t;
6-
fn signal_b() -> mcpwm_io_signals_t;
7-
fn unit() -> mcpwm_unit_t {
8-
U::unit()
9-
}
15+
pub trait HwOperator<U: Unit> {
16+
const SIGNAL_A: mcpwm_io_signals_t;
17+
const SIGNAL_B: mcpwm_io_signals_t;
18+
const UNIT_ID: mcpwm_unit_t = U::ID;
1019
}
1120

1221
macro_rules! impl_operator_helper {
1322
($instance:ident: $timer:expr, $signal_a:expr, $signal_b:expr, $unit:ty) => {
1423
impl HwOperator<$unit> for $instance<$unit> {
15-
fn signal_a() -> mcpwm_io_signals_t {
16-
$signal_a
17-
}
18-
19-
fn signal_b() -> mcpwm_io_signals_t {
20-
$signal_b
21-
}
24+
const SIGNAL_A: mcpwm_io_signals_t = $signal_a;
25+
const SIGNAL_B: mcpwm_io_signals_t = $signal_b;
2226
}
2327
};
2428
}
@@ -40,16 +44,6 @@ macro_rules! impl_operator {
4044
}
4145
}
4246

43-
impl<U: Unit> Into<Operator<U>> for $instance<U> {
44-
fn into(self) -> Operator<U> {
45-
Operator {
46-
_instance: self,
47-
pin_a: NoPin,
48-
pin_b: NoPin,
49-
}
50-
}
51-
}
52-
5347
impl_operator_helper!($instance: $timer, $signal_a, $signal_b, UnitZero);
5448
impl_operator_helper!($instance: $timer, $signal_a, $signal_b, UnitOne);
5549
};
@@ -79,21 +73,20 @@ impl_operator!(
7973
///
8074
/// Every Motor Control module has three operators. Every operator can generate two output signals called A and B.
8175
/// A and B share the same timer and thus frequency and phase but can have induvidual duty set.
82-
pub struct Operator<U: Unit, O: HwOperator<U>, M: Borrow<Mcpwm<U>>, PA: OptionalPin, PB: OptionalPin, D> {
76+
pub struct Operator<U: Unit, O: HwOperator<U>, PA: OptionalOutputPin, PB: OptionalOutputPin> {
8377
handle: mcpwm_operator_t,
8478
_instance: O,
8579

8680
_pin_a: PA,
8781
_pin_b: PB,
8882

89-
deadtime: D
83+
//deadtime: D
9084
}
9185

92-
impl<U, O, M, PA, PB> Operator<U, O, M, PA, PB>
86+
impl<U, O, PA, PB> Operator<U, O, PA, PB>
9387
where
9488
U: Unit,
9589
O: HwOperator<U>,
96-
M: Borrow<Mcpwm<U>>,
9790
PA: OutputPin,
9891
PB: OptionalOutputPin,
9992
{
@@ -108,11 +101,10 @@ where
108101
}
109102
}
110103

111-
impl<U, O, M, PA, PB> Operator<U, O, M, PA, PB>
104+
impl<U, O, PA, PB> Operator<U, O, PA, PB>
112105
where
113106
U: Unit,
114107
O: HwOperator<U>,
115-
M: Borrow<Mcpwm<U>>,
116108
PA: OptionalOutputPin,
117109
PB: OutputPin,
118110
{
@@ -134,7 +126,7 @@ pub struct OperatorConfig {
134126

135127
duty_mode: DutyMode,
136128

137-
deadtime: Option<DeadtimeConfig>,
129+
//deadtime: Option<DeadtimeConfig>,
138130
}
139131

140132
impl OperatorConfig {
@@ -159,26 +151,22 @@ impl OperatorConfig {
159151
self
160152
}
161153

162-
#[must_use]
154+
/*#[must_use]
163155
pub fn deadtime(mut self, deadtime: impl Into<Option<DeadtimeConfig>>) -> Self {
164156
self.deadtime = deadtime.into();
165157
self
166-
}
158+
}*/
167159
}
168160

169161
impl Default for OperatorConfig {
170162
fn default() -> Self {
171163
Self {
172-
frequency: 1000.Hz(),
173-
duty_a: 50.0,
174-
duty_b: 50.0,
175-
176-
#[cfg(not(esp_idf_version = "4.3"))]
177-
lowest_frequency: 16.Hz(),
164+
duty_a: 0.0,
165+
duty_b: 0.0,
178166

179167
duty_mode: DutyMode::ActiveHigh,
180168

181-
deadtime: None,
169+
//deadtime: None,
182170
}
183171
}
184172
}
@@ -199,6 +187,13 @@ pub enum DutyMode {
199187
ActiveLow,
200188
}
201189

190+
pub trait OptionalOperator<U: Unit, O: HwOperator<U>> {}
191+
192+
pub struct NoOperator;
193+
impl<U: Unit, O: HwOperator<U>> OptionalOperator<U, O> for NoOperator {}
194+
195+
/*
196+
202197
#[derive(Default, Clone)]
203198
struct DutyConfig {
204199
on_matches_cmp_a: CountingDirection,
@@ -226,23 +221,30 @@ impl Default for GeneratorAction {
226221
}
227222
}
228223
229-
impl From<DutyMode> for DutyConfig {
230-
fn from(val: DutyMode) -> Self {
224+
impl DutyMode {
225+
fn into_duty_cfg<G: Generator>(self) -> DutyConfig<G> {
231226
match val {
232227
DutyMode::ActiveHigh => {
233228
let mut duty_config: DutyConfig = Default::default();
234229
duty_config.on_is_empty.counting_up = GeneratorAction::SetHigh;
235-
duty_config.on_matches_cmp_a.counting_up = GeneratorAction::SetLow;
236-
230+
if G::IS_A {
231+
duty_config.on_matches_cmp_a.counting_up = GeneratorAction::SetLow;
232+
} else {
233+
duty_config.on_matches_cmp_b.counting_up = GeneratorAction::SetLow;
234+
}
237235
duty_config
238236
},
239237
DutyMode::ActiveLow => {
240238
let mut duty_config: DutyConfig = Default::default();
241239
duty_config.on_is_empty.counting_up = GeneratorAction::SetLow;
242-
duty_config.on_matches_cmp_a.counting_up = GeneratorAction::SetHigh;
240+
if G::IS_A {
241+
duty_config.on_matches_cmp_a.counting_up = GeneratorAction::SetHigh;
242+
} else {
243+
duty_config.on_matches_cmp_b.counting_up = GeneratorAction::SetHigh;
244+
}
243245
244246
duty_config
245247
},
246248
}
247249
}
248-
}
250+
} */

src/mcpwm/timer.rs

+39-12
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1+
use std::ptr;
2+
3+
use esp_idf_sys::{mcpwm_counter_type_t_MCPWM_UP_DOWN_COUNTER, mcpwm_counter_type_t_MCPWM_DOWN_COUNTER, mcpwm_counter_type_t_MCPWM_UP_COUNTER, mcpwm_timer_t, mcpwm_timer_handle_t, mcpwm_timer_enable, mcpwm_timer_t_MCPWM_TIMER_0, mcpwm_timer_t_MCPWM_TIMER_1, mcpwm_timer_t_MCPWM_TIMER_2, mcpwm_counter_type_t};
4+
5+
use crate::units::Hertz;
6+
use crate::mcpwm::Unit;
7+
8+
use super::operator::NoOperator;
9+
use super::timer_connection::TimerConnection;
10+
11+
112
#[derive(Clone, Copy, Debug)]
213
struct TimerConfig {
314
frequency: Hertz,
415
resolution: Hertz,
516
counter_mode: CounterMode,
617

718
// TODO
8-
// on_full,
9-
// on_empty,
10-
// on_stop,
19+
// on_full: FF,
20+
// on_empty: FE,
21+
// on_stop: FS,
1122
}
1223

1324
impl TimerConfig {
@@ -40,12 +51,12 @@ impl TimerConfig {
4051
//}
4152
//}
4253

43-
struct Timer<U: Unit, T: HwTimer<U>> {
54+
pub struct Timer<U: Unit, T: HwTimer<U>> {
4455
handle: mcpwm_timer_handle_t,
4556
_timer: T,
4657
}
4758

48-
impl Timer {
59+
impl<U: Unit, T: HwTimer<U>> Timer {
4960
pub fn new(timer: T, config: TimerConfig) -> Self {
5061
let config = mcpwm_timer_config_t {
5162
resolution
@@ -71,7 +82,7 @@ impl Timer {
7182
}
7283

7384
pub fn timer(&self) -> mcpwm_timer_t {
74-
T::timer()
85+
T::ID
7586
}
7687

7788
pub fn release(self) -> T {
@@ -88,7 +99,7 @@ impl Timer {
8899
}
89100
}
90101

91-
impl Drop for Timer {
102+
impl<U: Unit, T: HwTimer<U>> Drop for Timer<U, T> {
92103
fn drop(self) {
93104
mcpwm_del_timer(self.handle)
94105
}
@@ -99,8 +110,8 @@ impl Drop for Timer {
99110
#[derive(Clone, Copy, Debug)]
100111
pub enum CounterMode {
101112
/// Timer is frozen or paused
102-
#[cfg(not(esp_idf_version = "4.3"))]
103-
Frozen,
113+
//#[cfg(not(esp_idf_version = "4.3"))]
114+
//Frozen,
104115
/// Edge aligned. The counter will start from its lowest value and increment every clock cycle until the period is reached.
105116
///
106117
/// The wave form will end up looking something like the following:
@@ -158,11 +169,27 @@ pub enum CounterMode {
158169
impl From<CounterMode> for mcpwm_counter_type_t {
159170
fn from(val: CounterMode) -> Self {
160171
match val {
161-
#[cfg(not(esp_idf_version = "4.3"))]
162-
CounterMode::Frozen => mcpwm_counter_type_t_MCPWM_FREEZE_COUNTER,
172+
//CounterMode::Frozen => mcpwm_counter_type_t_MCPWM_FREEZE_COUNTER,
163173
CounterMode::Up => mcpwm_counter_type_t_MCPWM_UP_COUNTER,
164174
CounterMode::Down => mcpwm_counter_type_t_MCPWM_DOWN_COUNTER,
165175
CounterMode::UpDown => mcpwm_counter_type_t_MCPWM_UP_DOWN_COUNTER,
166176
}
167177
}
168-
}
178+
}
179+
180+
unsafe trait HwTimer<U: Unit> {
181+
const ID: mcpwm_timer_t;
182+
}
183+
184+
macro_rules! impl_timer {
185+
($t:ident, $id:expr) => {
186+
struct $t;
187+
impl<U: Unit> HwTimer<U> for $t {
188+
const ID: mcpwm_timer_t = $id;
189+
}
190+
};
191+
}
192+
193+
impl_timer!(TIMER0, mcpwm_timer_t_MCPWM_TIMER_0);
194+
impl_timer!(TIMER1, mcpwm_timer_t_MCPWM_TIMER_1);
195+
impl_timer!(TIMER2, mcpwm_timer_t_MCPWM_TIMER_2);

0 commit comments

Comments
 (0)