Свежие обсуждения
Микроконтроллеры

Частотомер на AVR

1 4 7

GM: ну какое прерывание успеет обработаться, тем более на си?
Т.е. ну его этот Си - учи лучше асаммблер?
Сам уже подумывал. С какой литературы посоветуете начать изучение(на английском не катин)?

 

Пяток лет назад так бы и сказал. Сейчас скажу, что нужно знать оба языка, а чему отдать предпочтение должно зависеть от задачи. В моих проектах порядка 70 программных файлов, примерно половина на си. Вообще, каждая задача требует понимания физики происходящих процессов, если вы меня понимаете.

Литература, хм-м, я как-то больше по дейташитам сейчас изучаю и устройство и систему команд, всегда есть примеры, тоже полезно посмотреть, ну и форумы разные развивают, как ни странно. Одну книжку помню, Соучек Б. Микроконтроллеры и микроэвм, произвела неизгладимое впечатление. Трудно найти, можно попробовать у букинистов поискать или в библиотеке.

А что вы так заскучали с вашим частотомером с программой на си? Ещё ничего не потеряно, всё впереди! Просто вам надо силой воли отказаться от прерываний. Что можно сделать. Пусть пока прерывания захвата приходят с частотой 1 МГц, т.е. каждые 8 МЦ. В си-программе открываете ваш ключ разрешения захвата, скажем, на 1 мс. Что произойдёт? Прилетит порядка 1000 фронтов, последний останется в ICR1 и его можно использовать для вычисления N. Далее, надо определить содержимое счётчика0, соответствующее последнему фронту. Навскидку так например, читаете 4 раза содержимое счётчика0, закрываете ключ, ещё 4 раза читаете и смотрите, где произошли изменения, простая логика и М у вас в кармане. Будет работать и на 4 МГц, и даже на си. Ну и всё, остальную часть вы знаете.

 

Вобщем предыдущий вариант заработал, тот что с проверкой переполнения счетчика0 в прерывании захвата. В симуляторе пробывал до 2-х МГц работоло без пропусков входной частоты. Но как ни странно большой вклад в это произвело измение срабатывания счетчика0, со спада на фронт (по Вашему совету). Из 15-ти измерений для частоты 1МГц - все показания совпадали, причем только в одном случае произвелась кариктировка показания счетчика0 в прерыванни захвата.

 

GM: Навскидку так например, читаете 4 раза содержимое счётчика0, закрываете ключ, ещё 4 раза читаете и смотрите, где произошли изменения,
О каких изменениях идет речь? Счетчик считать та не перестает после запрещения ключем захвата.
И еще а задержка между определением N и M ни как не повлияет?

 

Y@rik: О каких изменениях идет речь? Счетчик считать-тo не перестает после запрещения ключем захвата
Правильно, не перестаёт, отсюда изменение содержимого счётчика, об этом и спич.

Y@rik: И еще, а задержка между определением N и M никак не повлияет?
Не повлияет. Метод инвариантен к задержке, в разумных пределах.

Y@rik: Из 15-ти измерений для частоты 1МГц - все показания совпадали, причем только в одном случае произвелась корректировка показания счетчика0 в прерывании захвата
И пресловутые 2 герца не появлялись?

 

GM: И пресловутые 2 герца не появлялись?
При симуляции в VMlab непоявились, в железе бывает, но не 2Гц, а +/-1Гц. Хотя сдесь не известно, может частота сигнала миняется. Гинерировал импульсы
вторым таймером в режиме сравнения - при совпаденние изменение состояия вывода.

Есть вопрос по поводу вычислений. Тип float насколько точен, вычисляя частоту на калькуяторе по числам N и M - получаю 1000000.0Гц, контроллер же мне на дисплей выводит (в симуляторе также) 999999,8Гц. Использую комплятор CodeVision.

 

GM: Пусть пока прерывания захвата приходят с частотой 1 МГц, т.е. каждые 8 МЦ. В си-программе открываете ваш ключ разрешения захвата, скажем, на 1 мс. Что произойдёт? Прилетит порядка 1000 фронтов, последний останется в ICR1 и его можно использовать для вычисления N.
А с низкими частотами что делать, ниже 1кГц не чего не померяеш.

GM: Навскидку так например, читаете 4 раза содержимое счётчика0, закрываете ключ, ещё 4 раза читаете и смотрите, где произошли изменения, простая логика и М у вас в кармане.
Какое же тогда значение из восьми выбрать, по какому признаку?

 

Y@rik: Тип float насколько точен, вычисляя частоту на калькуяторе по числам N и M - получаю 1000000.0Гц, контроллер же мне на дисплей выводит (в симуляторе также) 999999,8Гц
Надо исходить из того, что плавающая точка одинарной точности содержит 24 бита мантиссы (или 23, зависит от реализации), это соответствует 6-7 десятичным знакам после запятой. Так оно у вас и выходит, неточный 7-й знак. Можно использовать плавающую точку с двойной точностью, там мантисса 56 бит, должно хватить. Опять же, выбор разрядности это компромисс и сильно зависит от поставленной задачи. Лично я использовал и 32-битную арифметику с фиксированной точкой и 24-битную, в общем, обходился без плавающей точки.

Y@rik: А с низкими частотами что делать, ниже 1кГц ничего не померяешь?
Ну, дорогой товарищ, в этом и состоит искусство программирования и профессионализм конкретного программиста. Измерение частоты - дело тонкое, никто не кидается измерять какую-нибудь частоту как ни попадя. Сначала производится оценка частоты, с окном 0,1с, затем уже измеряется частота наиболее оптимальным способом. Для частот ниже 1 кГц (или какую границу раздела вы выберете) вполне подходит ваш метод с прерываниями. Кстати, для классического метода ворот, частоту 1 кГц можно померить с точностью всего три значащие цифры, а моим методом будут те же самые 6 цифр, скажем в пределах 999.9999875Гц - 1000.000125Гц.

Y@rik: Какое же тогда значение из восьми выбрать, по какому признаку?
Ну, тут надо мозги напрягать, сколько раз считывать, я вам просто идею дал, как сделать. Согласитесь, что на 9МЦ должно произойти хотя бы одно изменение счётчика0 (если мы говорим об 1 МГц), и по считанным значениям вы можете определить, на каком конкретно цикле это произошло. Единственное, что имеет значение в моём методе, это чтобы M и N всегда соответствовали одному и тому же перепаду входной частоты, всё остальное просто и тривиально.

 

Со стабильностью измерений кажется разобраля, но вот точностьи не получается добится. Показания такие, как будто я меряю не методом захвата, а методом ворот: на секундном интервале получаю постоянно +/-1Гц. Как мне кажется, это из-за того, что число импульсов входной частоты тоже гуляет от -1 до +1 такта, хотя должно быть числом точным.
---------------------------------------------------------
Хочу спросить еще, вход в прерывание строго выполняется за определнное количство машинных циклов или тоже гуляет +/-1такт .

 

Здравствуйте.
Скажите в каком компиляторе создан проект и если можно поделитесь библиотекой ЛСД которую применяете.