Задача - Измерять параметр входного сигнала. При 0 значении параметра имеем просто "1" на входе. При увеличении вхдного параметра появляются импульсы. См. картинку. Это не шим, длинна "0" импульса всегда постоянная. Длинна "1" характеризует величену параметра. Чем больше - тем короче.
Я не волшебник, я только учусь! (с)
Как лучше реализовать алгоритм, чтоб он влез в маленький пик?
Мои мысли :
В прерывании считываем состояние входа, пытаемся счетчиком измерить длинну "1" в количестве прерываний. Но тут есть проблемма с отслеживанием начала "1", которое мы можем определить только по переходу из "0" в "1" и из "1" в "0".
Вообщем у меня это получается очень громозко и алгоритм мне не нравится. Может кто чего еще посоветует?
у пиков есть входы, вызывающие прерывания как при изменении с 0 на 1 так и обратно
а уж в этом прерывании считывай и сбрасывай таймер
и есть ещё сравнивающий ШИМ и компараторы с источником опорного напряжения
Последний раз редактировалось b612 Вт апр 24, 2012 20:42:58, всего редактировалось 1 раз.
Задача - Измерять параметр входного сигнала. При 0 значении параметра имеем просто "1" на входе.
Может всё таки выходе?
Geser писал(а):При увеличении вхдного параметра появляются импульсы.
Какой хоть входной сигнал И какой параметр Вы мерить будете?
Geser писал(а):
Мои мысли :
В прерывании считываем состояние входа, пытаемся счетчиком измерить длинну "1" в количестве прерываний. Но тут есть проблемма с отслеживанием начала "1", которое мы можем определить только по переходу из "0" в "1" и из "1" в "0".
А окуда им взятся , если 0 на входе - просто "1" на входе
Значит длину 0 импульса мы знаем. Тогда -
1--настроим INT прерывание на фронт 1->0,
2--при переходе из 1 в 0 включаем счетчик от внутренних импульсов,
3--далее при повторном вызове прерывания внутри прерывания:
3.1--сохраним значение счетчика
3.2--вычтем из значения счетчика значение, которое было в состоянии "0" (оно то нам известно).
3.2.1----так как
длинна "0" импульса всегда постоянная
3.4--имеем длительность "1". Опять перезапустим счетчик. Идем на состояние 3.
Задача сводится к измерению периода сигнала.
С какой точностью его надо измерять?
Надо ли измерять(и обрабатывать) каждый импульс?
Если нужна небольшая точность то можно в прерывании по изменению состояния порта когда изменение происходит с 0 на 1 стартовать таймер который будет считать с опорной частотой, а при переходе с 1 на 0 фиксировать значение накопленное в таймере, оно будет пропорционально длительности "1". При переполнении таймера(или многоступенчатого счетчика на основе таймера) остановить процесс измерения и установить признак недостоверности результата.
Тут есть пара скользких моментов, которые могут происходить редко но они повлияют на результат измерения, поэтому говорить об абсолютной точности измерения периода не приходится.
чтобы измерять достаточно точно насколько это вообще возможно, нужно применять аппаратные решения на основе ПЛИС. В частности, считать время не одного периода, а сотни - точность измерения увеличится на два порядка, но так же увеличится и время измерения. Так же, можно использовать расширители импульсов, которые работают по такому принципу: на вход подается лог.1 измеряемой длительности а на выходе имеем импульс длительностью кратной входному - например больше входного в 10 раз. Такой подход применен в частотомерах при измерении очень коротких импульсов длительностью в 1..10нс иначе пришлось бы применять счетчики в десятки гигагерц быстродействия. Но этот метод имеет естественные недостатки и ограничения.
Да, по сути нужно измерять каждый импульс. Они все одинаковые, но длинна полки постоянно меняется вместе с параметром. Особя точносто не нужна. Вся суть будет сводиться к вырабатыванию выходного сигнала при привышении определенной длинны импульса.
Тогда становится немного проще: по прерыванию изменения уровня(входной сигнал) обнуляем таймер и обнуляем выходной сигнал. При достижении таймером регистра сравнения, возникает прерывание в котором выставляешь "1" на выход - это будет сигналом превышения. Дальнейшая судьба таймера нас не интересует, он сбросится в начале очередного импульса. и если с начала запуска не последует ни одного нулевого импульса, то через время "срабатывания" будет выставлен сигнал превышения и висеть он там будет до тех пор пока не появится переход "0->1" на входе.