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

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

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

Сообщение Geser »

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

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

Изображение

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

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

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

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

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

Сообщение b612 »

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

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

Сообщение ILYAUL »

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

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

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

Сообщение Geser »

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

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

Сообщение Alik221 »

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

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

Сообщение Alexeyslav »

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

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

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

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

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

Сообщение Geser »

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

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

Сообщение Alexeyslav »

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

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