|
16 | 16 | #pragma message("")
|
17 | 17 |
|
18 | 18 | void setupPWM(int pin_nr, long pwm_frequency, bool active_high, SilabsDriverParams* params, uint8_t index) {
|
| 19 | + GPIO_Port_TypeDef port = getSilabsPortFromArduinoPin(pin_nr); |
| 20 | + uint32_t pin = getSilabsPinFromArduinoPin(pin_nr); |
| 21 | + TIMER_TypeDef* timer = TIMER0; // TODO determine correct timer |
19 | 22 | uint32_t timerFreq = 0;
|
20 | 23 | uint32_t topValue = 0;
|
21 | 24 | //CMU_ClockEnable(cmuClock_GPIO, true); assume this is done by Arduino core
|
22 | 25 | CMU_ClockEnable(cmuClock_TIMER0, true); // enable timer clock
|
23 | 26 |
|
24 | 27 | TIMER_Init_TypeDef timerInit = TIMER_INIT_DEFAULT;
|
25 | 28 | timerInit.enable = false;
|
| 29 | + timerInit.mode = timerModeUpDown; |
26 | 30 | // TODO adjust pre-scaler as needed to get the desired frequency
|
| 31 | + uint32_t max = TIMER_MaxCount(timer); |
27 | 32 | timerFreq = CMU_ClockFreqGet(cmuClock_TIMER0) / (timerInit.prescale + 1);
|
28 | 33 | topValue = (timerFreq / pwm_frequency);
|
29 |
| - TIMER_TopSet(TIMER0, topValue); |
| 34 | + TIMER_TopSet(timer, topValue); |
30 | 35 |
|
31 | 36 | TIMER_InitCC_TypeDef timerCCInit = TIMER_INITCC_DEFAULT;
|
32 | 37 | timerCCInit.mode = timerCCModePWM;
|
| 38 | + timerCCInit.outInvert = !active_high; |
33 | 39 | GPIO->TIMERROUTE[0].ROUTEEN = GPIO_TIMER_ROUTEEN_CC0PEN;
|
34 |
| - GPIO->TIMERROUTE[0].CC0ROUTE = (gpioPortA << _GPIO_TIMER_CC0ROUTE_PORT_SHIFT) |
35 |
| - | (6 << _GPIO_TIMER_CC0ROUTE_PIN_SHIFT); |
36 |
| - TIMER_InitCC(TIMER0, 0, &timerCCInit); |
| 40 | + GPIO->TIMERROUTE[0].CC0ROUTE = (port << _GPIO_TIMER_CC0ROUTE_PORT_SHIFT) |
| 41 | + | (pin << _GPIO_TIMER_CC0ROUTE_PIN_SHIFT); |
| 42 | + TIMER_InitCC(timer, 0, &timerCCInit); |
37 | 43 |
|
38 | 44 | // TODO enable all the timers at the same time?
|
39 |
| - TIMER_Enable(TIMER0, true); |
| 45 | + TIMER_Enable(timer, true); |
40 | 46 | }
|
41 | 47 |
|
42 | 48 |
|
@@ -83,23 +89,23 @@ void* _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const
|
83 | 89 |
|
84 | 90 |
|
85 | 91 | 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) {
|
86 |
| - // non-PIO solution... |
87 | 92 | SilabsDriverParams* params = new SilabsDriverParams();
|
88 | 93 | params->dead_zone = dead_zone;
|
89 |
| - setupPWM(pinA_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 0); |
90 |
| - setupPWM(pinB_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 2); |
91 |
| - setupPWM(pinC_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 4); |
92 |
| - setupPWM(pinA_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 1); |
93 |
| - setupPWM(pinB_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 3); |
94 |
| - setupPWM(pinC_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 5); |
| 94 | + // TODO init using DTI if posssible |
| 95 | + // setupPWM(pinA_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 0); |
| 96 | + // setupPWM(pinB_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 2); |
| 97 | + // setupPWM(pinC_h, pwm_frequency, SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 4); |
| 98 | + // setupPWM(pinA_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 1); |
| 99 | + // setupPWM(pinB_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 3); |
| 100 | + // setupPWM(pinC_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 5); |
95 | 101 | return params;
|
96 | 102 | }
|
97 | 103 |
|
98 | 104 |
|
99 | 105 |
|
100 | 106 |
|
101 | 107 |
|
102 |
| -void writeDutyCycle(float val, uint8_t slice, uint8_t chan) { |
| 108 | +void writeDutyCycle(float val, TIMER_TypeDef* timer, uint8_t chan) { |
103 | 109 | //pwm_set_chan_level(slice, chan, (wrapvalues[slice]+1) * val);
|
104 | 110 | }
|
105 | 111 |
|
|
0 commit comments