Поднял частоту ШИМ до 24 кГц и решил, что теперь всё будет тихо. Но при длинном кабеле слышался слабый звук, а на фронте был звон.

Щуп подключал к стоку, землю брал рядом с истоком. С 10 Ом в затворе выброс выглядел неприятно; с 47 Ом фронт стал спокойнее. Увеличивать номинал дальше без проверки нагрева не стал.
Что изменил
На малой яркости проверил ещё и минимальную длительность импульса. Слишком короткие импульсы почти не зажигают ленту, поэтому первые шаги яркости перестроил таблицей. Для глаза начало шкалы стало ровнее.
// TIM3 уже настроен: частота счётчика 24 МГц, ARR = 999.
constexpr uint16_t pwm_top = 999;
uint16_t target = gamma_table[brightness];
target = (target > pwm_top) ? pwm_top : target;
if (duty < target) ++duty;
else if (duty > target) --duty;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty);
// Один шаг каждые 2 мс. Начальное значение CCR — ноль.
Продолжение и история ревизий: Тихий драйвер LED-ленты.
Ещё из журнала
SHT40 должен измерять воздух, а не корпус
SHT40 поставил рядом с отверстиями корпуса. Если спрятать датчик глубоко внутри, аккуратная коробочка начинает мешать самой задаче: температура и влажность снаружи меняются, а внутри воздух обновляется медленнее.