toyfoc/
pwms.rs

1use embedded_hal::{digital::v2::OutputPin, PwmPin};
2
3use crate::ToyError;
4
5pub struct PWMs<CHU, CHV, CHW, P> {
6    pub duty_max: u16,
7    pub u: CHU,
8    pub v: CHV,
9    pub w: CHW,
10    pub en_pin: Option<P>,
11}
12
13pub trait PWMsTrait {
14    fn set_duty(&mut self, duty_u: f32, duty_v: f32, duty_w: f32);
15    fn enable(&mut self) -> nb::Result<(), ToyError>;
16    fn disable(&mut self) -> nb::Result<(), ToyError>;
17}
18
19impl<CHU, CHV, CHW, P, E> PWMsTrait for PWMs<CHU, CHV, CHW, P>
20where
21    CHU: PwmPin<Duty = u16>,
22    CHV: PwmPin<Duty = u16>,
23    CHW: PwmPin<Duty = u16>,
24    P: OutputPin<Error = E>,
25{
26    fn set_duty(&mut self, duty_u: f32, duty_v: f32, duty_w: f32) {
27        self.u.set_duty((duty_u * self.duty_max as f32) as u16);
28        self.v.set_duty((duty_v * self.duty_max as f32) as u16);
29        self.w.set_duty((duty_w * self.duty_max as f32) as u16);
30    }
31
32    fn enable(&mut self) -> nb::Result<(), ToyError> {
33        if let Some(ref mut en_pin) = self.en_pin {
34            en_pin.set_high().map_err(|_| ToyError::PWMEnErr)?;
35        }
36
37        Ok(())
38    }
39
40    fn disable(&mut self) -> nb::Result<(), ToyError> {
41        if let Some(ref mut en_pin) = self.en_pin {
42            en_pin.set_low().map_err(|_| ToyError::PWMDisErr)?;
43        } else {
44            self.u.set_duty(0);
45            self.v.set_duty(0);
46            self.w.set_duty(0);
47        }
48
49        Ok(())
50    }
51}