79 if(checkMode(channel) ==
false)
return;
83 float dutyCycle = ((MidPosition + ((Servo::s_delta[
enumValue(channel)] / 100.0F) * percent)) / TPWM) * 100.0F;
87 bsp::SinkDriverTimerCHA.setDutyCycle(dutyCycle);
90 bsp::SinkDriverTimerCHB.setDutyCycle(dutyCycle);
93 bsp::SinkDriverTimerCHC.setDutyCycle(dutyCycle);
96 bsp::SinkDriverTimerCHD.setDutyCycle(dutyCycle);
110 Servo::s_delta[
enumValue(channel)] = delta;
115 static inline std::array s_delta = { 600, 600, 600, 600 };
116 constexpr
static inline u16 MidPosition = 1500;
117 constexpr
static inline u16 TPWM = 20000;
126 static bool checkMode(
Channel channel) {
127 if (SinkDriver::s_mode[
static_cast<u8>(channel)] != Mode::Servo) {
131 if (bsp::SinkDriverTimerA::getPwmFrequency() != 50) {
132 if(!bsp::SinkDriverTimerA::setPwmFrequency(50,40000))
return false;
134 bsp::SinkDriverTimerCHA.startPwm();
137 if (bsp::SinkDriverTimerB::getPwmFrequency() != 50) {
138 if(!bsp::SinkDriverTimerB::setPwmFrequency(50,40000))
return false;
140 bsp::SinkDriverTimerCHB.startPwm();
143 if (bsp::SinkDriverTimerC::getPwmFrequency() != 50) {
144 if(!bsp::SinkDriverTimerC::setPwmFrequency(50,40000))
return false;
146 bsp::SinkDriverTimerCHC.startPwm();
149 if (bsp::SinkDriverTimerD::getPwmFrequency() != 50) {
150 if(!bsp::SinkDriverTimerD::setPwmFrequency(50,40000))
return false;
152 bsp::SinkDriverTimerCHD.startPwm();
156 SinkDriver::s_mode[
enumValue(channel)] = Mode::Servo;
178 if(SinkDriver::s_mode[
enumValue(channel)] != Mode::PWM){
182 bsp::SinkDriverTimerCHA.startPwm();
183 bsp::SinkDriverTimerCHA.setPolarityHigh();
186 bsp::SinkDriverTimerCHB.startPwm();
187 bsp::SinkDriverTimerCHB.setPolarityHigh();
190 bsp::SinkDriverTimerCHC.startPwm();
191 bsp::SinkDriverTimerCHC.setPolarityHigh();
194 bsp::SinkDriverTimerCHD.startPwm();
195 bsp::SinkDriverTimerCHD.setPolarityHigh();
198 SinkDriver::s_mode[
enumValue(channel)] = Mode::PWM;
204 bsp::SinkDriverTimerCHA.setDutyCycle(dutyCycle);
207 bsp::SinkDriverTimerCHB.setDutyCycle(dutyCycle);
210 bsp::SinkDriverTimerCHC.setDutyCycle(dutyCycle);
213 bsp::SinkDriverTimerCHD.setDutyCycle(dutyCycle);
231 for(
auto mode : s_mode){
232 if(mode == Mode::Servo)
return false;
234 bsp::SinkDriverTimerA::setPwmFrequency(frequency, resolution);
235 bsp::SinkDriverTimerB::setPwmFrequency(frequency, resolution);
236 bsp::SinkDriverTimerC::setPwmFrequency(frequency, resolution);
237 bsp::SinkDriverTimerD::setPwmFrequency(frequency, resolution);
252 return bsp::SinkDriverTimerA::getPwmFrequency();
255 return bsp::SinkDriverTimerB::getPwmFrequency();
258 return bsp::SinkDriverTimerC::getPwmFrequency();
261 return bsp::SinkDriverTimerD::getPwmFrequency();
286 if(SinkDriver::s_mode[
enumValue(channel)] != Mode::GPIO) {
291 bsp::SinkDriverTimerCHA.startPwm();
292 bsp::SinkDriverTimerCHA.setDutyCycle(0.0F);
295 bsp::SinkDriverTimerCHB.startPwm();
296 bsp::SinkDriverTimerCHB.setDutyCycle(0.0F);
299 bsp::SinkDriverTimerCHC.startPwm();
300 bsp::SinkDriverTimerCHC.setDutyCycle(0.0F);
303 bsp::SinkDriverTimerCHD.startPwm();
304 bsp::SinkDriverTimerCHD.setDutyCycle(0.0F);
308 SinkDriver::s_mode[
enumValue(channel)] = Mode::GPIO;
315 bsp::SinkDriverTimerCHA.setPolarityHigh(!state);
318 bsp::SinkDriverTimerCHB.setPolarityHigh(!state);
321 bsp::SinkDriverTimerCHC.setPolarityHigh(!state);
324 bsp::SinkDriverTimerCHD.setPolarityHigh(!state);
344 static inline std::array s_mode = { Mode::Uninitialised,Mode::Uninitialised,Mode::Uninitialised,Mode::Uninitialised };