Skip to content

Commit eb08474

Browse files
committed
Compiling!!! However far from working or even testable...
1 parent cc0e98e commit eb08474

File tree

5 files changed

+482
-150
lines changed

5 files changed

+482
-150
lines changed

src/mcpwm/deadtime.rs

Lines changed: 362 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
// TODO: This is stolen from the MCPWM 4.4 PR, check if/how this should be changed for 5.0
2+
3+
4+
/// Dead time config for MCPWM operator
5+
///
6+
/// `rising_edge_delay` and `falling_edge_delay` is time as in number of clock cycles after the MCPWM modules group prescaler.
7+
///
8+
/// Note that the dead times are calculated from MCPWMXA's flanks unless explicitly stated otherwise
9+
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
10+
pub enum DeadtimeConfig {
11+
// TODO: Figure out what all of those options do and give them nice descriptions
12+
/// MCPWM_BYPASS_RED
13+
///
14+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
15+
/// have no effect with this dead time mode
16+
///
17+
/// ```
18+
/// . . .
19+
/// . . .
20+
/// .--------------------. .
21+
/// | | .
22+
/// MCPWMXA in | | .
23+
/// | | .
24+
/// --------------- ---------------------
25+
/// . . .
26+
/// . . .
27+
/// .--------------------. .
28+
/// | | .
29+
/// MCPWMXA out | | .
30+
/// | | .
31+
/// --------------- ---------------------
32+
/// . . .
33+
/// . . .
34+
/// .------------------------.
35+
/// | >. |< fed
36+
/// MCPWMXB out | . |
37+
/// | . |
38+
/// --------------. . -----------------
39+
/// . . .
40+
/// . . .
41+
/// ```
42+
BypassRisingEdge { falling_edge_delay: u16 },
43+
44+
/// MCPWM_BYPASS_FED
45+
///
46+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
47+
/// have no effect with this dead time mode
48+
///
49+
/// ```
50+
/// . . .
51+
/// . . .
52+
/// .--------------------.
53+
/// | . |
54+
/// MCPWMXA in | . |
55+
/// | . |
56+
/// --------------- . ---------------------
57+
/// . . .
58+
/// . . .
59+
/// . .----------------.
60+
/// red >. |< |
61+
/// MCPWMXA out . | |
62+
/// . | |
63+
/// ------------------- ---------------------
64+
/// . . .
65+
/// . . .
66+
/// .--------------------.
67+
/// | . |
68+
/// MCPWMXB out | . |
69+
/// | . |
70+
/// --------------- . ---------------------
71+
/// . . .
72+
/// . . .
73+
/// ```
74+
BypassFallingEdge { rising_edge_delay: u16 },
75+
76+
/// MCPWM_ACTIVE_HIGH_MODE
77+
///
78+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
79+
/// have no effect with this dead time mode
80+
///
81+
/// ```
82+
/// . . . .
83+
/// . . . .
84+
/// .--------------------. .
85+
/// | . | .
86+
/// MCPWMXA in | . | .
87+
/// | . | .
88+
/// --------------- . ---------------------
89+
/// . . . .
90+
/// . . . .
91+
/// . .----------------. .
92+
/// red >. |< | .
93+
/// MCPWMXA out . | | .
94+
/// . | | .
95+
/// ------------------- ---------------------
96+
/// . . . .
97+
/// . . . .
98+
/// .------------------------.
99+
/// | . >. |< fed
100+
/// MCPWMXB out | . . |
101+
/// | . . |
102+
/// --------------. . . -----------------
103+
/// . . . .
104+
/// . . . .
105+
/// ```
106+
ActiveHigh {
107+
rising_edge_delay: u16,
108+
falling_edge_delay: u16,
109+
},
110+
111+
/// MCPWM_ACTIVE_LOW_MODE
112+
///
113+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
114+
/// have no effect with this dead time mode
115+
///
116+
/// ```
117+
/// . . . .
118+
/// . . . .
119+
/// .--------------------. .
120+
/// | . | .
121+
/// MCPWMXA in | . | .
122+
/// | . | .
123+
/// --------------- . ---------------------
124+
/// . . . .
125+
/// . . . .
126+
/// ------------------. .--------------------
127+
/// red >. |< | .
128+
/// MCPWMXA out . | | .
129+
/// . | | .
130+
/// . ------------------
131+
/// . . . .
132+
/// . . . .
133+
/// --------------. . . .----------------
134+
/// | . >. |< fed
135+
/// MCPWMXB out | . . |
136+
/// | . . |
137+
/// --------------------------
138+
/// . . . .
139+
/// . . . .
140+
/// ```
141+
ActiveLow {
142+
rising_edge_delay: u16,
143+
falling_edge_delay: u16,
144+
},
145+
146+
/// MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE
147+
///
148+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
149+
/// have no effect with this dead time mode
150+
///
151+
/// ```
152+
/// . . . .
153+
/// . . . .
154+
/// .--------------------. .
155+
/// | . | .
156+
/// MCPWMXA in | . | .
157+
/// | . | .
158+
/// --------------- . ---------------------
159+
/// . . . .
160+
/// . . . .
161+
/// . .----------------. .
162+
/// red >. |< | .
163+
/// MCPWMXA out . | | .
164+
/// . | | .
165+
/// ------------------- ---------------------
166+
/// . . . .
167+
/// . . . .
168+
/// --------------. . . .----------------
169+
/// | . >. |< fed
170+
/// MCPWMXB out | . . |
171+
/// | . . |
172+
/// --------------------------
173+
/// . . . .
174+
/// . . . .
175+
/// ```
176+
ActiveHighComplement {
177+
rising_edge_delay: u16,
178+
falling_edge_delay: u16,
179+
},
180+
181+
/// MCPWM_ACTIVE_LOW_COMPLIMENT_MODE
182+
///
183+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
184+
/// have no effect with this dead time mode
185+
///
186+
/// ```
187+
/// . . . .
188+
/// . . . .
189+
/// .--------------------. .
190+
/// | . | .
191+
/// MCPWMXA in | . | .
192+
/// | . | .
193+
/// --------------- . ---------------------
194+
/// . . . .
195+
/// . . . .
196+
/// ------------------. .--------------------
197+
/// red >. |< | .
198+
/// MCPWMXA out . | | .
199+
/// . | | .
200+
/// . ------------------ .
201+
/// . . . .
202+
/// . . . .
203+
/// .------------------------.
204+
/// | . >. |< fed
205+
/// MCPWMXB out | . . |
206+
/// | . . |
207+
/// --------------- . . -----------------
208+
/// . . . .
209+
/// . . . .
210+
/// ```
211+
ActiveLowComplement {
212+
rising_edge_delay: u16,
213+
falling_edge_delay: u16,
214+
},
215+
216+
/// MCPWM_ACTIVE_RED_FED_FROM_PWMXA
217+
///
218+
/// Note that `MCPWMXB in` will be completely ignored. This means `Operator::set_duty_b` will
219+
/// have no effect with this dead time mode
220+
///
221+
/// ```
222+
/// . . . .
223+
/// . . . .
224+
/// .--------------------. .
225+
/// | . | .
226+
/// MCPWMXA in | . | .
227+
/// | . | .
228+
/// --------------- . ---------------------
229+
/// . . . .
230+
/// . . . .
231+
/// . .--------------------.
232+
/// red >. |< . |
233+
/// MCPWMXA out . | . |
234+
/// . | . |
235+
/// ------------------- . ---------------------
236+
/// . . . .
237+
/// . . . .
238+
/// . .--------------------.
239+
/// red >. |< . |
240+
/// MCPWMXB out . | . |
241+
/// . | . |
242+
/// ------------------- . ---------------------
243+
/// . . . .
244+
/// . . . .
245+
/// ```
246+
ActiveRedFedFromPwmxa {
247+
rising_edge_delay: u16,
248+
falling_edge_delay: u16,
249+
},
250+
251+
/// MCPWM_ACTIVE_RED_FED_FROM_PWMXB
252+
///
253+
/// Note that `MCPWMXA in` will be completely ignored. This means `Operator::set_duty_a` will
254+
/// have no effect with this dead time mode
255+
/// ```
256+
/// . . . .
257+
/// . . . .
258+
/// .--------------------. .
259+
/// | . | .
260+
/// MCPWMXB in | . | .
261+
/// | . | .
262+
/// --------------- . ---------------------
263+
/// . . . .
264+
/// . . . .
265+
/// . .--------------------.
266+
/// red >. |< . |
267+
/// MCPWMXA out . | . |
268+
/// . | . |
269+
/// ------------------- . ---------------------
270+
/// . . . .
271+
/// . . . .
272+
/// . .--------------------.
273+
/// red >. |< . |
274+
/// MCPWMXB out . | . |
275+
/// . | . |
276+
/// ------------------- . ---------------------
277+
/// . . . .
278+
/// . . . .
279+
/// ```
280+
ActiveRedFedFromPwmxb {
281+
rising_edge_delay: u16,
282+
falling_edge_delay: u16,
283+
},
284+
}
285+
286+
impl DeadtimeConfig {
287+
fn as_args(&self) -> DeadtimeArgs {
288+
match *self {
289+
DeadtimeConfig::BypassRisingEdge { falling_edge_delay } => DeadtimeArgs {
290+
rising_edge_delay: 0,
291+
falling_edge_delay,
292+
mode: mcpwm_deadtime_type_t_MCPWM_BYPASS_RED,
293+
},
294+
295+
DeadtimeConfig::BypassFallingEdge { rising_edge_delay } => DeadtimeArgs {
296+
rising_edge_delay,
297+
falling_edge_delay: 0,
298+
mode: mcpwm_deadtime_type_t_MCPWM_BYPASS_FED,
299+
},
300+
301+
DeadtimeConfig::ActiveHigh {
302+
rising_edge_delay,
303+
falling_edge_delay,
304+
} => DeadtimeArgs {
305+
rising_edge_delay,
306+
falling_edge_delay,
307+
mode: mcpwm_deadtime_type_t_MCPWM_ACTIVE_HIGH_MODE,
308+
},
309+
310+
DeadtimeConfig::ActiveLow {
311+
rising_edge_delay,
312+
falling_edge_delay,
313+
} => DeadtimeArgs {
314+
rising_edge_delay,
315+
falling_edge_delay,
316+
mode: mcpwm_deadtime_type_t_MCPWM_ACTIVE_LOW_MODE,
317+
},
318+
319+
DeadtimeConfig::ActiveHighComplement {
320+
rising_edge_delay,
321+
falling_edge_delay,
322+
} => DeadtimeArgs {
323+
rising_edge_delay,
324+
falling_edge_delay,
325+
mode: mcpwm_deadtime_type_t_MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE,
326+
},
327+
328+
DeadtimeConfig::ActiveLowComplement {
329+
rising_edge_delay,
330+
falling_edge_delay,
331+
} => DeadtimeArgs {
332+
rising_edge_delay,
333+
falling_edge_delay,
334+
mode: mcpwm_deadtime_type_t_MCPWM_ACTIVE_LOW_COMPLIMENT_MODE,
335+
},
336+
337+
DeadtimeConfig::ActiveRedFedFromPwmxa {
338+
rising_edge_delay,
339+
falling_edge_delay,
340+
} => DeadtimeArgs {
341+
rising_edge_delay,
342+
falling_edge_delay,
343+
mode: mcpwm_deadtime_type_t_MCPWM_ACTIVE_RED_FED_FROM_PWMXA,
344+
},
345+
346+
DeadtimeConfig::ActiveRedFedFromPwmxb {
347+
rising_edge_delay,
348+
falling_edge_delay,
349+
} => DeadtimeArgs {
350+
rising_edge_delay,
351+
falling_edge_delay,
352+
mode: mcpwm_deadtime_type_t_MCPWM_ACTIVE_RED_FED_FROM_PWMXB,
353+
},
354+
}
355+
}
356+
}
357+
358+
struct DeadtimeArgs {
359+
rising_edge_delay: u16,
360+
falling_edge_delay: u16,
361+
mode: mcpwm_deadtime_type_t,
362+
}

0 commit comments

Comments
 (0)