Микроконтроллеры | Частотомер на AVR |
|
---|---|---|
Делаю частотомер измеряющий по принципу, который обсуждался http://electronix.ru/forum/index.php?showtopic=29796&st=0 . Меряет хорошо, но через нескоторое число измерение выдает результат который сильно отличается от входной частоты. Привожу код. Может кто подскажет вчем проблема. Спасибо. |
|
|
Проблема у вас в том, что N, N0, M, M0 у вас беззнаковые переменные, а операции над ними вы проводите знаковые. |
|
|
Если не трудно объяните, пожалуйста, разницу между беззнаковыми и знаковыми операциями. |
|
|
Переопределил переменные N, N0, M, M0 в знаковые signed long int, но результато это не дало. |
|
|
Ну, не надо суетиться под клиентом . Прежде всего, у вас должно быть понимание проблемы, тогда появятся методы для её решения. Разница между знаковыми переменными и беззнаковыми на примере байтовых переменных: По поводу вашей задачи. Представьте себе, у вас есть 8-битный счётчик. Считает он так: 0, 1, 2,...,254, 255, 0, 1, 2, ... и так далее по кругу. Пусть вы хотите измерить длительность некого события. Отмечаете начало (попросту считываете значение со счётчика и записываете в ячейку time1, пусть для нашего примера time1=100), затем отмечаете конец события в time2=186. Естественно, длительность события определяется разностью time2-time1=86. Всё нормально, все довольны. Теперь представьте себе, что time1=200, а time2=30. Такое может быть, поскольку счётчик считает по кругу. Недолго думая, вы вычисляете разность time2-time1=30-200=-170. О ужас, длительность события не изменилась, однако вы получили неверный результат. Дополнение до 2-х легко решает проблему: 256-170=86. |
|
|
Я проверял в VMlab, кагда показания отличны от частоты входного сигнала, то N>N0 и M>M0 т.е все должно быть нормально, по идеи. |
|
|
Покажите пример со всеми числами и значениями входной и опорной частот. |
|
|
Опорная 8МГц, на вход подан сигнал с частотой 1МГц. N=810552, M=101575, N0=55529, M0=29, Fx=1002526Гц. Причем M и N после выполнения: |
|
|
Вообще-то надо было бы показать N, M, N0, M0 до выполнения и после выполнения, ну да ладно, и так ясно. У вас число M должно быть не 101575, а 101575-256=101319. Тогда частота Fx будет точно равна 1000000 Гц. Вы умудрились потерять 256 импульсов входной частоты, скорее всего вы потеряли их на обработке переполнения, может ещё где, надо анализировать код. Кроме того, у вас есть логическая ошибка в программе. Вы должны разрешить захват, дождаться его и запретить захват. И только после этого формировать пары чисел N, M или N0, M0, чтобы эти пары чисел соответствовали одному фронту входного сигнала. Ну и как я говорил на электрониксе, можно обойтись одной формулой для N, M, а не двумя, как у вас. |
|
|
GM: Кроме того, у вас есть логическая ошибка в программе. Вы должны разрешить захват, дождаться его и запретить захват. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |