Чтение PWM

Что-то меня переклинило совсем… Нужен толчок.

С обычным PWM всё вроде как ясно - известен период, а следовательно ALL-time и HIGH-time. Дальше всё просто: HIGH / (ALL / 100) = % заполнения.

Но если PWM-сигнал вот такой (вначале 128 клоков HIGH, потом данные в HIGH , в конце 128 клоков LOW):

image

То как отсечь эти 128 клоков в начале и конце?

Частота может быть разной, от даташита слегонца отличается, т.е. потенциально может от экземпляра к экземпляру изменяться. Плюс ещё немного плавает на осциллографе.

Авто-калибровка… но для этого нужно получить данные от 0 до 4095, что затрудительно.

Не понял в чем трудность. Период (частота) легко измеряется по переднему фронту значит и длительность clock известна (T/(4095+256)) .
Если поле data имеет переменную длительность, то конечные LOW = 128 есть всегда, и по ним вычисляется clock

не понял вопроса, max_PWM/128 не подходит?

Да, затупил, поскакал не в ту степь :frowning:
Потом пообедал, обдумал, учел ваши мысли.

Вышло так примерно:

pwmDurationAll = pwmTimeStop - pwmTimeStartHigh;

pwmDuration128Clock = pwmDurationAll * 128 / 4351;

pwmDurationAll -= pwmDuration128Clock * 2;
pwmDurationData = pwmTimeStartLow - pwmTimeStartHigh - pwmDuration128Clock;

result = map(pwmDurationData, 0x00, pwmDurationAll, 0x00, 0x0FFF);

Что значит “отсечь”?
И что мы хотим получить?
Если это именно PWM, то %заполнения = 100*(128 + data)/4352.

“Отсечь” - отделить от данных.
Получить нужно было число от 0 до 4095, передаваемое в виде PWM-посылки.

Как обычно. Хорошая мысля приходит опосля.)
На самом деле. Зачастую, отключение от работы помогает.
То есть, переключился на что то другое, но идея из головы не выходит.)

1 лайк

Измерить длину импульса и вычесть 128.