Как лучше написать программу?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 189
Зарегистрирован: Чт ноя 12, 2009 21:50:58
Откуда: Москва

Сообщение Geser »

Вопрос к гуру кодинга для пиков :))

Задача - Измерять параметр входного сигнала. При 0 значении параметра имеем просто "1" на входе. При увеличении вхдного параметра появляются импульсы. См. картинку. Это не шим, длинна "0" импульса всегда постоянная. Длинна "1" характеризует величену параметра. Чем больше - тем короче.

Изображение

Я не волшебник, я только учусь! (с) :))

Как лучше реализовать алгоритм, чтоб он влез в маленький пик?

Мои мысли :
В прерывании считываем состояние входа, пытаемся счетчиком измерить длинну "1" в количестве прерываний. Но тут есть проблемма с отслеживанием начала "1", которое мы можем определить только по переходу из "0" в "1" и из "1" в "0".

Вообщем у меня это получается очень громозко и алгоритм мне не нравится. Может кто чего еще посоветует?
Реклама
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Чт янв 07, 2010 16:58:11

Сообщение b612 »

у пиков есть входы, вызывающие прерывания как при изменении с 0 на 1 так и обратно
а уж в этом прерывании считывай и сбрасывай таймер
и есть ещё сравнивающий ШИМ и компараторы с источником опорного напряжения
Последний раз редактировалось b612 Вт апр 24, 2012 20:42:58, всего редактировалось 1 раз.
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Geser писал(а):Вопрос к гуру кодинга для пиков :))

Задача - Измерять параметр входного сигнала. При 0 значении параметра имеем просто "1" на входе.
Может всё таки выходе?
Geser писал(а):При увеличении вхдного параметра появляются импульсы.
Какой хоть входной сигнал И какой параметр Вы мерить будете?
Geser писал(а): Мои мысли :
В прерывании считываем состояние входа, пытаемся счетчиком измерить длинну "1" в количестве прерываний. Но тут есть проблемма с отслеживанием начала "1", которое мы можем определить только по переходу из "0" в "1" и из "1" в "0".
А окуда им взятся , если 0 на входе - просто "1" на входе
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 189
Зарегистрирован: Чт ноя 12, 2009 21:50:58
Откуда: Москва

Сообщение Geser »

ILYAUL писал(а):Может всё таки выходе?
Нед. Входить в пик будет то, что на фотке. Измерять надо длительность "еденичной" полки.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 103
Зарегистрирован: Пн сен 13, 2010 14:37:38

Сообщение Alik221 »

Я и сам не особо в этом смыслю, но нельзя ли так?
длинна "0" импульса всегда постоянная
Значит длину 0 импульса мы знаем. Тогда -
1--настроим INT прерывание на фронт 1->0,
2--при переходе из 1 в 0 включаем счетчик от внутренних импульсов,
3--далее при повторном вызове прерывания внутри прерывания:
3.1--сохраним значение счетчика
3.2--вычтем из значения счетчика значение, которое было в состоянии "0" (оно то нам известно).
3.2.1----так как
длинна "0" импульса всегда постоянная
3.4--имеем длительность "1". Опять перезапустим счетчик. Идем на состояние 3.
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Задача сводится к измерению периода сигнала.
С какой точностью его надо измерять?
Надо ли измерять(и обрабатывать) каждый импульс?

Если нужна небольшая точность то можно в прерывании по изменению состояния порта когда изменение происходит с 0 на 1 стартовать таймер который будет считать с опорной частотой, а при переходе с 1 на 0 фиксировать значение накопленное в таймере, оно будет пропорционально длительности "1". При переполнении таймера(или многоступенчатого счетчика на основе таймера) остановить процесс измерения и установить признак недостоверности результата.

Тут есть пара скользких моментов, которые могут происходить редко но они повлияют на результат измерения, поэтому говорить об абсолютной точности измерения периода не приходится.

чтобы измерять достаточно точно насколько это вообще возможно, нужно применять аппаратные решения на основе ПЛИС. В частности, считать время не одного периода, а сотни - точность измерения увеличится на два порядка, но так же увеличится и время измерения. Так же, можно использовать расширители импульсов, которые работают по такому принципу: на вход подается лог.1 измеряемой длительности а на выходе имеем импульс длительностью кратной входному - например больше входного в 10 раз. Такой подход применен в частотомерах при измерении очень коротких импульсов длительностью в 1..10нс иначе пришлось бы применять счетчики в десятки гигагерц быстродействия. Но этот метод имеет естественные недостатки и ограничения.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 189
Зарегистрирован: Чт ноя 12, 2009 21:50:58
Откуда: Москва

Сообщение Geser »

Да, по сути нужно измерять каждый импульс. Они все одинаковые, но длинна полки постоянно меняется вместе с параметром. Особя точносто не нужна. Вся суть будет сводиться к вырабатыванию выходного сигнала при привышении определенной длинны импульса.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Тогда становится немного проще: по прерыванию изменения уровня(входной сигнал) обнуляем таймер и обнуляем выходной сигнал. При достижении таймером регистра сравнения, возникает прерывание в котором выставляешь "1" на выход - это будет сигналом превышения. Дальнейшая судьба таймера нас не интересует, он сбросится в начале очередного импульса. и если с начала запуска не последует ни одного нулевого импульса, то через время "срабатывания" будет выставлен сигнал превышения и висеть он там будет до тех пор пока не появится переход "0->1" на входе.
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»