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