Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Захватить ШИМ, преобразовать в код
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
ViKo
Допустим, имеем ШИМ с периодом 1 мс. Читаем его 200 раз за период логическим входом микроконтроллера. Как теперь эти нули и единицы превратить в код, соответствующий скважности ШИМ? Например, создать длинный регистр, допустим, из 4096 битов. Задвигаем прочитанный вход в регистр, сдвигаем все биты, последний бит теряется. И вычисляем сумму всех битов. В-общем, скользящее среднее.
Есть ли способ лучше? Можно ли улучшить данный алгоритм?
Попутно вопрос - как на C определить и использовать длинный сдвиговый регистр?
Fat Robot
Считать счетчиком интервал 1 и интервал 0.

Цитата(ViKo @ Oct 23 2015, 10:20) *
Как теперь эти нули и единицы превратить в код, соответствующий скважности ШИМ?


работать с указателями на голову/хвост

Цитата(ViKo @ Oct 23 2015, 10:20) *
Попутно вопрос - как на C определить и использовать длинный сдвиговый регистр?
kovigor
Цитата(ViKo @ Oct 23 2015, 12:20) *
Допустим, имеем ШИМ с периодом 1 мс.

Скважность скачком меняется ? Если да, то сколько уровней скважности ? Два ? И еще, известны ли ожидаемые уровни заранее, или нет ?
ViKo
Цитата(Fat Robot @ Oct 23 2015, 12:28) *
работать с указателями на голову/хвост

Сдвигать-то как? Обычные << потеряют выдвигаемый бит. То есть, надо брать старший бит из предыдущего слова, пихать его в младший бит текущего... и т.д.
Да, еще и подсчитать единицы надо "правильным" алгоритмом, чтобы быстро. rolleyes.gif

Цитата(kovigor @ Oct 23 2015, 12:34) *
Скважность скачком меняется ? Если да, то сколько уровней скважности ? Два ? И еще, известны ли ожидаемые уровни заранее, или нет ?

Скважность меняется плавно. Всего уровней, может, и 1024, но мне хватит и 100. Уровни могут быть от полного 0 до полной 1. Это я сам задаю (и не только сам), хочу проверить реакцию. Нечто, вроде, логгера радиоуправляемой игрушки.

Цитата(Fat Robot @ Oct 23 2015, 12:28) *
Считать счетчиком интервал 1 и интервал 0.

Да, можно и так. Измерять длительности единичных импульсов. Типа, обратный инженеринг ШИМ. biggrin.gif
Александр1
А если использовать для этого таймер?
По фронту/спаду запускается таймер с временем счета больше периода ШИМ. По спаду/фронту считывается значение таймера. При следующем запуске таймера считывается конечное значение периода ШИМ и сбрасывается таймер для следующего периода ШИМ. Два значения таймера используете в расчетах как вам требуется.
ViKo
Цитата(Александр1 @ Oct 23 2015, 12:47) *
А если использовать для этого таймер?
По фронту/спаду запускается таймер с временем счета больше периода ШИМ. По спаду/фронту считывается значение таймера. При следующем запуске таймера считывается конечное значение периода ШИМ и сбрасывается таймер для следующего периода ШИМ. Два значения таймера используете в расчетах как вам требуется.

Да, можно. Уже сказали. Задача становится тривиальной. А хотелось интересности.
Так и надо делать.
Tanya
Цитата(ViKo @ Oct 23 2015, 12:20) *
Допустим, имеем ШИМ с периодом 1 мс. Читаем его 200 раз за период логическим входом микроконтроллера.

Или я не врубаюсь, или одно из двух. С некоторым правильным (Вы его должны знать) периодом смотрим на вход - ждем перехода в 1, инкрементируем счетчик или не инкрементируем, а просто добавляем вход... И так 256 (к примеру) раз.
ViKo
Цитата(Tanya @ Oct 23 2015, 12:51) *
Или я не врубаюсь, или одно из двух. С некоторым правильным (Вы его должны знать) периодом смотрим на вход - ждем перехода в 1, инкрементируем счетчик или не инкрементируем, а просто добавляем вход... И так 256 (к примеру) раз.

Тоже можно. Сбрасывать счетчик нулем на входе (перед сбросом сохранить). Когда на входе единица, инкрементировать. Опрашивать регулярно, по таймеру.
Можно и отдельно считать нули и единицы, так еще надежнее будет. Сумма нулей и единиц даст период, отношение количества единиц к периоду даст скважность.
ViKo
Можно и RC фильтром преобразовать в аналоговый сигнал и подать на АЦП.
EvgenyNik
Цитата(ViKo @ Oct 23 2015, 16:00) *
Можно и RC фильтром преобразовать в аналоговый сигнал и подать на АЦП.
Можно. Но сначала надо решить вопрос с требуемой точностью. Результат на выходе фильтра будет зависеть не только от заполнения ШИМ, но и от амплитуды генератора, а та, в свою очередь, может зависеть не только от стабильности источника питания, но и от напряжения на конденсаторе фильтра (если выход слабый).
Опять же, автор не указал - насколько быстро меняется заполнение во времени. Фильтр даст усреднённое значение, фактически, за несколько периодов. А вдруг, у него ШИМ генерирует сложный процесс и ему нужен каждый период.
ViKo
Быстро не меняется, не должно. Каждый импульс ШИМ мне отслеживать не нужно. Приблизительно, сотня импульсов будет неизменной.
Да, амплитуда будет меняться. Питается от аккумулятора, до его разряда. Но это тоже будет плавное изменение.
Мне же надо увидеть аномальное поведение. Вдруг ни с того, ни с сего изменяется режим работы. Хочу увидеть, это так ШИМ задает, или виновники другие (провод питания надорванный, например, есть и другие подозреваемые).
SSerge
Вы же с STM32 знакомы?
У его таймеров есть режим PWM input mode.
ViKo
Цитата(SSerge @ Oct 28 2015, 17:47) *
Вы же с STM32 знакомы?
У его таймеров есть режим PWM input mode.

Знаком. Хочу применить простейший STM32F030CC. PWM Input - не помню, не было необходимости использовать. Посмотрю. Спасибо!
Посмотрел. Да, годится! Вспомнил. rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.