Jump to content

    
Sign in to follow this  
ViKo

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

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
Допустим, имеем ШИМ с периодом 1 мс.

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

 

Share this post


Link to post
Share on other sites
работать с указателями на голову/хвост

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

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

 

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
А если использовать для этого таймер?

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

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

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

Share this post


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

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

Share this post


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

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

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
Вы же с STM32 знакомы?

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this