Перейти к содержанию
    

Захватить ШИМ, преобразовать в код

Допустим, имеем ШИМ с периодом 1 мс. Читаем его 200 раз за период логическим входом микроконтроллера. Как теперь эти нули и единицы превратить в код, соответствующий скважности ШИМ? Например, создать длинный регистр, допустим, из 4096 битов. Задвигаем прочитанный вход в регистр, сдвигаем все биты, последний бит теряется. И вычисляем сумму всех битов. В-общем, скользящее среднее.

Есть ли способ лучше? Можно ли улучшить данный алгоритм?

Попутно вопрос - как на C определить и использовать длинный сдвиговый регистр?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Считать счетчиком интервал 1 и интервал 0. (T_{0} + T_{1})

 

Как теперь эти нули и единицы превратить в код, соответствующий скважности ШИМ?

 

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

 

Попутно вопрос - как на C определить и использовать длинный сдвиговый регистр?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим, имеем ШИМ с периодом 1 мс.

Скважность скачком меняется ? Если да, то сколько уровней скважности ? Два ? И еще, известны ли ожидаемые уровни заранее, или нет ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Да, еще и подсчитать единицы надо "правильным" алгоритмом, чтобы быстро. :rolleyes:

 

Скважность скачком меняется ? Если да, то сколько уровней скважности ? Два ? И еще, известны ли ожидаемые уровни заранее, или нет ?

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

 

Считать счетчиком интервал 1 и интервал 0.

Да, можно и так. Измерять длительности единичных импульсов. Типа, обратный инженеринг ШИМ. :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если использовать для этого таймер?

По фронту/спаду запускается таймер с временем счета больше периода ШИМ. По спаду/фронту считывается значение таймера. При следующем запуске таймера считывается конечное значение периода ШИМ и сбрасывается таймер для следующего периода ШИМ. Два значения таймера используете в расчетах как вам требуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если использовать для этого таймер?

По фронту/спаду запускается таймер с временем счета больше периода ШИМ. По спаду/фронту считывается значение таймера. При следующем запуске таймера считывается конечное значение периода ШИМ и сбрасывается таймер для следующего периода ШИМ. Два значения таймера используете в расчетах как вам требуется.

Да, можно. Уже сказали. Задача становится тривиальной. А хотелось интересности.

Так и надо делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим, имеем ШИМ с периодом 1 мс. Читаем его 200 раз за период логическим входом микроконтроллера.

Или я не врубаюсь, или одно из двух. С некоторым правильным (Вы его должны знать) периодом смотрим на вход - ждем перехода в 1, инкрементируем счетчик или не инкрементируем, а просто добавляем вход... И так 256 (к примеру) раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или я не врубаюсь, или одно из двух. С некоторым правильным (Вы его должны знать) периодом смотрим на вход - ждем перехода в 1, инкрементируем счетчик или не инкрементируем, а просто добавляем вход... И так 256 (к примеру) раз.

Тоже можно. Сбрасывать счетчик нулем на входе (перед сбросом сохранить). Когда на входе единица, инкрементировать. Опрашивать регулярно, по таймеру.

Можно и отдельно считать нули и единицы, так еще надежнее будет. Сумма нулей и единиц даст период, отношение количества единиц к периоду даст скважность.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно и RC фильтром преобразовать в аналоговый сигнал и подать на АЦП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно и RC фильтром преобразовать в аналоговый сигнал и подать на АЦП.
Можно. Но сначала надо решить вопрос с требуемой точностью. Результат на выходе фильтра будет зависеть не только от заполнения ШИМ, но и от амплитуды генератора, а та, в свою очередь, может зависеть не только от стабильности источника питания, но и от напряжения на конденсаторе фильтра (если выход слабый).

Опять же, автор не указал - насколько быстро меняется заполнение во времени. Фильтр даст усреднённое значение, фактически, за несколько периодов. А вдруг, у него ШИМ генерирует сложный процесс и ему нужен каждый период.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Быстро не меняется, не должно. Каждый импульс ШИМ мне отслеживать не нужно. Приблизительно, сотня импульсов будет неизменной.

Да, амплитуда будет меняться. Питается от аккумулятора, до его разряда. Но это тоже будет плавное изменение.

Мне же надо увидеть аномальное поведение. Вдруг ни с того, ни с сего изменяется режим работы. Хочу увидеть, это так ШИМ задает, или виновники другие (провод питания надорванный, например, есть и другие подозреваемые).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы же с STM32 знакомы?

У его таймеров есть режим PWM input mode.

Знаком. Хочу применить простейший STM32F030CC. PWM Input - не помню, не было необходимости использовать. Посмотрю. Спасибо!

Посмотрел. Да, годится! Вспомнил. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...