3#if defined(ARDUINO_ARCH_SILABS)
10void _getPrsSourceAndUnderflowSignal(
15 if (!timer || !source || !signal)
return;
17 switch ((uint32_t) timer) {
19 *source = PRS_ASYNC_CH_CTRL_SOURCESEL_TIMER0;
20 *signal = PRS_ASYNC_CH_CTRL_SIGSEL_TIMER0UF;
24 *source = PRS_ASYNC_CH_CTRL_SOURCESEL_TIMER1;
25 *signal = PRS_ASYNC_CH_CTRL_SIGSEL_TIMER1UF;
29 *source = PRS_ASYNC_CH_CTRL_SOURCESEL_TIMER2;
30 *signal = PRS_ASYNC_CH_CTRL_SIGSEL_TIMER2UF;
39static void _alignPWMTimers(
40 TIMER_InitCC_TypeDef *initCC,
43 EFR32PwmInstance *p = (EFR32PwmInstance*)
params;
44 if (!p || !initCC)
return;
46 CMU_ClockEnable(cmuClock_PRS,
true);
48 uint32_t prsSource, prsSignal;
50 initCC->prsInputType = timerPrsInputAsyncPulse;
51 initCC->prsInput =
true;
52 initCC->prsSel = SILABS_PWM_PRS_CHANNEL;
54 _getPrsSourceAndUnderflowSignal(p->h.timer, &prsSource, &prsSignal);
55 PRS_SourceAsyncSignalSet(SILABS_PWM_PRS_CHANNEL, prsSource, prsSignal);
58static void _configPWMMode(
59 TIMER_Init_TypeDef *init,
64 init->mode = timerModeUpDown;
67static void _alignPWMStart(
68 TIMER_Init_TypeDef *init,
73 init->mode = timerModeUpDown;
74 init->riseAction = timerInputActionReloadStart;
77static void _setSinglePhaseState(EFR32PwmInstance *inst,
PhaseState state) {
92 EFR32DriverParams*
params =
new EFR32DriverParams;
95 if (!pwm_frequency || !
_isset(pwm_frequency)) pwm_frequency = SILABS_DEFAULT_PWM_FREQUENCY;
96 else pwm_frequency =
_constrain(pwm_frequency, 0, SILABS_DEFAULT_PWM_FREQUENCY);
98 params->pwm_frequency = pwm_frequency;
102 pwmHiConfig(&
params->inst[0], SILABS_DEFAULT_PWM_PERPHERAL,
pinA, 0);
105 EFR32PwmConfig pwmConfig;
106 pwmConfig.frequency = pwm_frequency;
107 pwmConfig.polarity = PWM_P_ACTIVE_LOW;
108 pwmConfig.outInvert =
true;
110 pwmHiInit(&
params->inst[0], &pwmConfig, NULL, NULL);
113 pwmHiOn(&
params->inst[0]);
116 pwmStart(&
params->inst[0], _configPWMMode, NULL);
122 EFR32DriverParams *
params =
new EFR32DriverParams;
125 if (!pwm_frequency || !
_isset(pwm_frequency)) pwm_frequency = SILABS_DEFAULT_PWM_FREQUENCY;
126 else pwm_frequency =
_constrain(pwm_frequency, 0, SILABS_DEFAULT_PWM_FREQUENCY);
128 params->pwm_frequency = pwm_frequency;
132 pwmHiConfig(&
params->inst[0], SILABS_DEFAULT_PWM_PERPHERAL,
pinA, 0);
133 pwmHiConfig(&
params->inst[1], SILABS_DEFAULT_PWM_PERPHERAL,
pinB, 1);
136 EFR32PwmConfig pwmConfig;
137 pwmConfig.frequency = pwm_frequency << 1;
138 pwmConfig.polarity = PWM_P_ACTIVE_LOW;
139 pwmConfig.outInvert =
true;
141 pwmHiInit(&
params->inst[0], &pwmConfig, NULL, NULL);
142 pwmHiInit(&
params->inst[1], &pwmConfig, NULL, NULL);
145 pwmHiOn(&
params->inst[0]);
146 pwmHiOn(&
params->inst[1]);
149 pwmStart(&
params->inst[0], _configPWMMode, NULL);
160 EFR32DriverParams *
params =
new EFR32DriverParams;
163 if (!pwm_frequency || !
_isset(pwm_frequency)) pwm_frequency = SILABS_DEFAULT_PWM_FREQUENCY;
164 else pwm_frequency =
_constrain(pwm_frequency, 0, SILABS_DEFAULT_PWM_FREQUENCY);
166 params->pwm_frequency = pwm_frequency;
170 pwmHiConfig(&
params->inst[0], SILABS_DEFAULT_PWM_PERPHERAL,
pinA, 0);
171 pwmHiConfig(&
params->inst[1], SILABS_DEFAULT_PWM_PERPHERAL,
pinB, 1);
172 pwmHiConfig(&
params->inst[2], SILABS_DEFAULT_PWM_PERPHERAL,
pinC, 2);
175 EFR32PwmConfig pwmConfig;
176 pwmConfig.frequency = pwm_frequency << 1;
177 pwmConfig.polarity = PWM_P_ACTIVE_LOW;
178 pwmConfig.outInvert =
true;
180 pwmHiInit(&
params->inst[0], &pwmConfig, NULL, NULL);
181 pwmHiInit(&
params->inst[1], &pwmConfig, NULL, NULL);
182 pwmHiInit(&
params->inst[2], &pwmConfig, NULL, NULL);
185 pwmHiOn(&
params->inst[0]);
186 pwmHiOn(&
params->inst[1]);
187 pwmHiOn(&
params->inst[2]);
190 pwmStart(&
params->inst[0], _configPWMMode, NULL);
202 EFR32DriverParams *
params =
new EFR32DriverParams;
205 if (!pwm_frequency || !
_isset(pwm_frequency)) pwm_frequency = SILABS_DEFAULT_PWM_FREQUENCY;
206 else pwm_frequency =
_constrain(pwm_frequency, 0, SILABS_DEFAULT_PWM_FREQUENCY);
208 params->pwm_frequency = pwm_frequency;
212 pwmHiConfig(&
params->inst[0], SILABS_DEFAULT_PWM_PERPHERAL,
pin1A, 0);
213 pwmHiConfig(&
params->inst[1], SILABS_DEFAULT_PWM_PERPHERAL,
pin1B, 1);
214 pwmHiConfig(&
params->inst[2], SILABS_DEFAULT_PWM_PERPHERAL,
pin2A, 2);
215 pwmHiConfig(&
params->inst[3], SILABS_SECOND_PWM_PERPHERAL ,
pin2B, 0);
218 EFR32PwmConfig pwmConfig;
219 pwmConfig.frequency = pwm_frequency << 1;
220 pwmConfig.polarity = PWM_P_ACTIVE_LOW;
221 pwmConfig.outInvert =
true;
223 pwmHiInit(&
params->inst[0], &pwmConfig, NULL, NULL);
224 pwmHiInit(&
params->inst[1], &pwmConfig, NULL, NULL);
225 pwmHiInit(&
params->inst[2], &pwmConfig, NULL, NULL);
226 pwmHiInit(&
params->inst[3], &pwmConfig, _alignPWMTimers, &
params->inst[0]);
229 pwmHiOn(&
params->inst[0]);
230 pwmHiOn(&
params->inst[1]);
231 pwmHiOn(&
params->inst[2]);
232 pwmHiOn(&
params->inst[3]);
235 pwmStart(&
params->inst[0], _configPWMMode, NULL);
236 pwmStart(&
params->inst[3], _alignPWMStart, NULL);
251 EFR32DriverParams *
params =
new EFR32DriverParams;
254 if (!pwm_frequency || !
_isset(pwm_frequency)) pwm_frequency = SILABS_DEFAULT_PWM_FREQUENCY;
255 else pwm_frequency =
_constrain(pwm_frequency, 0, SILABS_DEFAULT_PWM_FREQUENCY);
257 params->pwm_frequency = pwm_frequency;
263 pwmHiConfig(&
params->inst[0], SILABS_DEFAULT_PWM_PERPHERAL,
pinA_h, 0);
266 pwmHiConfig(&
params->inst[1], SILABS_DEFAULT_PWM_PERPHERAL,
pinB_h, 1);
269 pwmHiConfig(&
params->inst[2], SILABS_DEFAULT_PWM_PERPHERAL,
pinC_h, 2);
273 EFR32PwmConfig pwmConfig;
274 pwmConfig.frequency = pwm_frequency << 1;
275 pwmConfig.polarity = PWM_P_ACTIVE_LOW;
276 pwmConfig.outInvert =
true;
278 pwmInit(&
params->inst[0], &pwmConfig, NULL, NULL);
279 pwmInit(&
params->inst[1], &pwmConfig, NULL, NULL);
280 pwmInit(&
params->inst[2], &pwmConfig, NULL, NULL);
283 uint32_t deadTimeNs = (float) (1e9f / pwm_frequency) *
dead_zone;
284 EFR32PwmDeadTimeConfig deadTimeConfig;
285 deadTimeConfig.deadTimeNs = deadTimeNs >> 1;
286 deadTimeConfig.outputMask = TIMER_DTOGEN_DTOGCC0EN
287 | TIMER_DTOGEN_DTOGCC1EN
288 | TIMER_DTOGEN_DTOGCC2EN
289 | TIMER_DTOGEN_DTOGCDTI0EN
290 | TIMER_DTOGEN_DTOGCDTI1EN
291 | TIMER_DTOGEN_DTOGCDTI2EN;
292 pwmDeadTimeInit(&
params->inst[0], &deadTimeConfig);
300 pwmStart(&
params->inst[0], _configPWMMode, NULL);
306 EFR32DriverParams *p = (EFR32DriverParams*)
params;
309 pwmHiSetDutyCycle(&p->inst[0], dc_a * 100.0f);
313 EFR32DriverParams *p = (EFR32DriverParams*)
params;
316 pwmHiSetDutyCycle(&p->inst[0], dc_a * 100.0f);
317 pwmHiSetDutyCycle(&p->inst[1],
dc_b * 100.0f);
321 EFR32DriverParams *p = (EFR32DriverParams*)
params;
324 pwmHiSetDutyCycle(&p->inst[0], dc_a * 100.0f);
325 pwmHiSetDutyCycle(&p->inst[1],
dc_b * 100.0f);
326 pwmHiSetDutyCycle(&p->inst[2],
dc_c * 100.0f);
336 EFR32DriverParams *p = (EFR32DriverParams*)
params;
339 pwmHiSetDutyCycle(&p->inst[0], dc_1a * 100.0f);
340 pwmHiSetDutyCycle(&p->inst[1],
dc_1b * 100.0f);
341 pwmHiSetDutyCycle(&p->inst[2],
dc_2a * 100.0f);
342 pwmHiSetDutyCycle(&p->inst[3],
dc_2b * 100.0f);
352 EFR32DriverParams *p = (EFR32DriverParams*)
params;
357 pwmHiSetDutyCycle(&p->inst[0], dc_a * 100);
361 pwmHiSetDutyCycle(&p->inst[1],
dc_b * 100.0f);
365 pwmHiSetDutyCycle(&p->inst[2],
dc_c * 100.0f);
const int const int const int pinC
GenericCurrentSenseParams * params
void * _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const int pin2A, const int pin2B)
void * _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, const int pinA_l, const int pinB_h, const int pinB_l, const int pinC_h, const int pinC_l)
void * _configure2PWM(long pwm_frequency, const int pinA, const int pinB)
void _writeDutyCycle2PWM(float dc_a, float dc_b, void *params)
void _writeDutyCycle1PWM(float dc_a, void *params)
#define SIMPLEFOC_DRIVER_INIT_FAILED
void _writeDutyCycle4PWM(float dc_1a, float dc_1b, float dc_2a, float dc_2b, void *params)
void * _configure3PWM(long pwm_frequency, const int pinA, const int pinB, const int pinC)
void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, PhaseState *phase_state, void *params)
void * _configure1PWM(long pwm_frequency, const int pinA)
void _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, void *params)
float const int const int const int pinB_h
float const int const int const int const int pinB_l
const int const int pin1B
const int const int const int pin2A
float const int const int const int const int const int pinC_h
float float PhaseState * phase_state
float const int const int const int const int const int const int pinC_l
float const int const int pinA_l
const int const int const int const int pin2B
#define _constrain(amt, low, high)