Skip to content

Commit 0e7a574

Browse files
Avoid glitches on repeated analogWrite() PWM
1 parent bacc184 commit 0e7a574

File tree

1 file changed

+39
-28
lines changed

1 file changed

+39
-28
lines changed

cores/stm32l4/stm32l4_wiring_analog.c

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static stm32l4_dac_t stm32l4_dac;
3838
#endif /* defined(PIN_DAC0) || defined(PIN_DAC1) */
3939
static stm32l4_timer_t stm32l4_pwm[PWM_INSTANCE_COUNT];
4040

41+
static uint8_t _channels[PWM_INSTANCE_COUNT];
4142
static int _readResolution = 10;
4243
static int _writeResolution = 8;
4344

@@ -48,6 +49,7 @@ static uint8_t _writeCalibrate = 3;
4849

4950
void analogReference(eAnalogReference reference)
5051
{
52+
(void)reference;
5153
}
5254

5355
void analogReadResolution(int resolution)
@@ -264,32 +266,6 @@ void analogWrite(uint32_t pin, uint32_t value)
264266
{
265267
instance = g_APinDescription[pin].pwm_instance;
266268

267-
if (stm32l4_pwm[instance].state == TIMER_STATE_NONE)
268-
{
269-
stm32l4_timer_create(&stm32l4_pwm[instance], g_PWMInstances[instance], STM32L4_PWM_IRQ_PRIORITY, 0);
270-
271-
if (_writeFrequency[instance] && _writeRange[instance])
272-
{
273-
carrier = _writeFrequency[instance] * _writeRange[instance];
274-
modulus = _writeRange[instance];
275-
}
276-
else
277-
{
278-
carrier = 2000000;
279-
modulus = 4095;
280-
}
281-
282-
divider = stm32l4_timer_clock(&stm32l4_pwm[instance]) / carrier;
283-
284-
if (divider == 0)
285-
{
286-
divider = 1;
287-
}
288-
289-
stm32l4_timer_enable(&stm32l4_pwm[instance], divider -1, modulus -1, 0, NULL, NULL, 0);
290-
stm32l4_timer_start(&stm32l4_pwm[instance], false);
291-
}
292-
293269
if (_writeFrequency[instance] && _writeRange[instance])
294270
{
295271
if (value > _writeRange[instance])
@@ -302,9 +278,44 @@ void analogWrite(uint32_t pin, uint32_t value)
302278
value = mapResolution(value, _writeResolution, 12);
303279
}
304280

305-
stm32l4_gpio_pin_configure(g_APinDescription[pin].pin, (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_ALTERNATE));
281+
if (_channels[instance] & (1u << g_APinDescription[pin].pwm_channel))
282+
{
283+
stm32l4_timer_compare(&stm32l4_pwm[instance], g_APinDescription[pin].pwm_channel, value);
284+
}
285+
else
286+
{
287+
_channels[instance] |= (1u << g_APinDescription[pin].pwm_channel);
306288

307-
stm32l4_timer_channel(&stm32l4_pwm[instance], g_APinDescription[pin].pwm_channel, value, TIMER_CONTROL_PWM);
289+
if (stm32l4_pwm[instance].state == TIMER_STATE_NONE)
290+
{
291+
stm32l4_timer_create(&stm32l4_pwm[instance], g_PWMInstances[instance], STM32L4_PWM_IRQ_PRIORITY, 0);
292+
293+
if (_writeFrequency[instance] && _writeRange[instance])
294+
{
295+
carrier = _writeFrequency[instance] * _writeRange[instance];
296+
modulus = _writeRange[instance];
297+
}
298+
else
299+
{
300+
carrier = 2000000;
301+
modulus = 4095;
302+
}
303+
304+
divider = stm32l4_timer_clock(&stm32l4_pwm[instance]) / carrier;
305+
306+
if (divider == 0)
307+
{
308+
divider = 1;
309+
}
310+
311+
stm32l4_timer_enable(&stm32l4_pwm[instance], divider -1, modulus -1, 0, NULL, NULL, 0);
312+
stm32l4_timer_start(&stm32l4_pwm[instance], false);
313+
}
314+
315+
stm32l4_gpio_pin_configure(g_APinDescription[pin].pin, (GPIO_PUPD_NONE | GPIO_OSPEED_HIGH | GPIO_OTYPE_PUSHPULL | GPIO_MODE_ALTERNATE));
316+
317+
stm32l4_timer_channel(&stm32l4_pwm[instance], g_APinDescription[pin].pwm_channel, value, TIMER_CONTROL_PWM);
318+
}
308319

309320
return;
310321
}

0 commit comments

Comments
 (0)