Skip to content

Commit 70f1191

Browse files
gbr1soburi
authored andcommitted
zephyrCommon: fixs analogWrite overflow
Co-Authored-by: Giovanni Bruno <g.bruno@arduino.cc> Signed-off-by: TOKITA Hiroshi <tokita.hiroshi@gmail.com>
1 parent b267cb5 commit 70f1191

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

cores/arduino/zephyrCommon.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,11 @@ int analogWriteResolution() {
426426

427427
#ifdef CONFIG_PWM
428428

429+
static uint32_t map64(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min,
430+
uint32_t out_max) {
431+
return ((uint64_t)(x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min);
432+
}
433+
429434
void analogWrite(pin_size_t pinNumber, int value) {
430435
const int maxInput = BIT(_analog_write_resolution) - 1U;
431436
size_t idx = pwm_pin_index(pinNumber);
@@ -440,7 +445,7 @@ void analogWrite(pin_size_t pinNumber, int value) {
440445

441446
value = CLAMP(value, 0, maxInput);
442447

443-
const uint32_t pulse = map(value, 0, maxInput, 0, arduino_pwm[idx].period);
448+
const uint32_t pulse = map64(value, 0, maxInput, 0, arduino_pwm[idx].period);
444449

445450
/*
446451
* A duty ratio determines by the period value defined in dts

0 commit comments

Comments
 (0)