алгоритм
|
|
доцент2 |
Дата: Пт, 20.07.2012, 13:28 | Сообщение # 61 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Результат на уровне десятков и единиц колеблется (значительные скачки пропали с вводом выборки по входящим импульсам). Результат в железе одинаковый при частотах 4, 8 и 20МГц. Выкинул из программы стробоскоп для простоты. Прикрепленный проект с кварцем на 8МГц, видео файл - результат с кварцем 20МГц.
Сообщение отредактировал
доцент2 - Пт, 20.07.2012, 13:32
|
|
|
|
доцент2 |
Дата: Вт, 04.07.2017, 14:36 | Сообщение # 62 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
срочно нужна помощь! С 2012 года, когда обсуждалась эта тема из памяти вылетело многое. Сейчас хотел накидать програмку, по представленным здесь примерам, для измерения частоты. На частотах свыше 1МГц работало нормально. Но вот беда пробежал кот по клавиатуре и что-то в тексте программы стерлось. И теперь ни каких измерений не происходит. Всю голову сломал, ни как понять не могу, что произошло. Помогите!
|
|
|
|
ivan_fd |
Дата: Вт, 04.07.2017, 17:00 | Сообщение # 63 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Измерения происходят. Зачем Вы написали DEC1???
|
|
|
|
доцент2 |
Дата: Вт, 04.07.2017, 17:36 | Сообщение # 64 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Пока текст восстанавливал погорячился немного с Dec1. Спасибо. ivan_fd, Вы мне уже подсказывали по поводу данного метода измерения, это было в 2012 году, Сделал стробоскоп для машины и забыл все нафиг, к сожалению. Если не сложно можете объяснить как происходит измерение. Пока подобрал длительность задержки в железе измеряет примерно от 4МГц до 53МГц (есть несколько кварцевых генераторов на 25,175; 28,322; 32,514; 44,000 и 53,2034МГц). Смотрел старые посты, но понять не могу как делать расчет. Не могу померить, например 32кГц - выводит нули. Хотелось бы захватить диапазон 0....60МГц, +SAB6456. И выводить все это на дисплей nokia-1616.
|
|
|
|
ivan_fd |
Дата: Ср, 05.07.2017, 13:20 | Сообщение # 65 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Честно говоря я и сам не помню уже. Но если подумать. Мы меряем таймером 1. Который у нас имеет 2 байта. То есть от 0 до 65535. В ваше программе при измерении Вы ставите задержку 4 мс. Хотя,что то ее там нету. Не разбирался почему. Из этого у нас получается, что, при данных настройках, мы можем измерить минимум - 1/4мс*4*2 - и то с большой неточностью. Чтобы увеличить точность нужно измерять не 4мс, а больше. И чем точнее будет задержка, тем точнее будут показания. В общем алгоритм приблизительно такой может быть. Ставим паузу, например 1с, меряем, смотрим флаг прерывания, если установлен, то ставим паузу 100мс, меряем и если флага прерывания нету, то относительно этой паузы расчитываем частоту. И так далее.
|
|
|
|
доцент2 |
Дата: Ср, 05.07.2017, 15:35 | Сообщение # 66 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Цитата ivan_fd ( ) В ваше программе при измерении Вы ставите задержку 4 мс. Хотя,что то ее там нету. Как бы вот она: '; Задержка 20 000 машинных циклов '; Длительность задержки 4 миллисекунд '; Частота задающего генератора 20 МГц ' Movlw .239 ' Movwf Reg_1 ' Movlw .26 ' Movwf Reg_2 'delay Decfsz Reg_1,F ' GoTo delay ' Decfsz Reg_2,F ' GoTo delay ' Nop
Цитата ivan_fd ( ) Из этого у нас получается, что, при данных настройках, мы можем измерить минимум -1/4мс*4*2 - и то с большой неточностью. Опять эти расчеты я понять не могу: 1/0,004сек * 4*2=2000 - это Гц? Что здесь 4*2? При задержке 4мс у меня меряет МГц с точностью до тысячной (до кГц) 25,175; 28,322; 32,514; 44,000 и 53,2034МГц. Если я правильно понимаю, что в случае увеличения задержки до 100мс надо вводить обработку прерывания по переполнению таймера: Int_Label: Context Save If TMR1IF=1 Then ' если произошло прерывание по переполнению таймера TMR1, то TMR1IF=0 ' сброс Флага прерывания по переполнению таймера TMR1 Inc TMR1perep ' приращение количества переполнений TMR1 EndIf Context Restore ' Возврат из обработчика прерывания Естественно на этом теряется время и надо корректировать задержку, у меня получилось 99,850мс ориентировался по генератору на 28,322МГц. ; Задержка 499 250 машинных циклов ; Длительность задержки 99850 микросекунд ; Частота задающего генератора 20 МГц
movlw .92 movwf Reg_1 movlw .137 movwf Reg_2 movlw .3 movwf Reg_3 delay decfsz Reg_1,F goto delay decfsz Reg_2,F goto delay decfsz Reg_3,F goto delay nop При этом точность тоже падает: при 20МГц показывает 19,999МГц; при 25,175МГц показывает 25,174МГЦ; при 28,322МГц - 28,322МГц; при 32,514 - 32,516МГц; при 53,2034 - 53,2172МГц. Может без прерывания по переполнению можно обойтись? К сожалению нет под рукой генератора с низкими частотами.
Сообщение отредактировал
доцент2 - Ср, 05.07.2017, 15:36
|
|
|
|
ivan_fd |
Дата: Чт, 06.07.2017, 10:44 | Сообщение # 67 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата доцент2 ( ) Как бы вот она: Я вижу где она. В протеусе там задержка не 4мс, а больше 5-ти. Хотя должно бить точно 4.
Цитата доцент2 ( ) Опять эти расчеты я понять не могу:1/0,004сек * 4*2=2000 - это Гц? Что здесь 4*2? 1/4мс = 250 Гц, но у нас есть делитель на 4 поэтому умножаем на 4, а на два, потому, что 1000Гц это в таймере будет 1, или 0. Короче будет не точность. Ну это я написал о минимальной частоте при времени измерения 4мс.Цитата доцент2 ( ) Если я правильно понимаю, что в случае увеличения задержки до 100мс надо вводить обработку прерывания по переполнению таймера: Я Вам выше написал приблизительный алгоритм. Обработчика прерывания нам не нужно. Пишу по шагам. Или лучше нарисую алгоритм.
|
|
|
|
доцент2 |
Дата: Чт, 06.07.2017, 20:29 | Сообщение # 68 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Цитата ivan_fd ( ) В протеусе там задержка не 4мс, а больше 5-ти. Хотя должно бить точно 4. Я сначала сделал 4мс, но при измерении где-то набегает "лишнее". Для сравнения частоту снимаю с кварцевых генераторов. Сейчас сделал задержку 100мс. И опять в железе пришлось корректировать, иначе отклонения получаются в несколько килогерц. При 100мс расчет делаю так: j = ((TIMER1 + 65535 * TMR1perep) * 1000)/25 Расчет взял с потолка. При кварце на МК 20МГц. На фото Верхняя строка при паузе 100мс, нижняя при 1с. По поводу расчета: допустим кварц МК 20МГц, пред делитель таймера 1:4, задержка 100мс. В процессе измерения таймер насчитал 30000 тиков, как должен выглядеть расчет? (1/0,1сек *4*2=80???) Спасибо за алгоритм. Переварю - отпишусь.
Сообщение отредактировал
доцент2 - Чт, 06.07.2017, 20:46
|
|
|
|
ivan_fd |
Дата: Чт, 06.07.2017, 21:05 | Сообщение # 69 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата доцент2 ( ) По поводу расчета: допустим кварц МК 20МГц, пред делитель таймера 1:4, задержка 100мс. В процессе измерения таймер насчитал 30000 тиков, как должен выглядеть расчет? (1/0,1сек *4*2=80???) Кварц при данном методе измерения в расчетах не участвует. Он влияет только на точность задержки = 100мс. Расчет такой: 30000(то что натикало) * 4(предделитель таймера) / 0.1(время задержки в секундах) = 1200000 Гц
|
|
|
|
доцент2 |
Дата: Чт, 06.07.2017, 21:29 | Сообщение # 70 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
Спасибо за формулу, завтра попробую. А как посмотреть в протеусе время задержки?
|
|
|
|
ivan_fd |
Дата: Чт, 06.07.2017, 23:15 | Сообщение # 71 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ассемблерные вставки к сожалению не симулируются пошагово. Но посмотреть можно. Ставим точку останова перед входом в задержку и сразу после нее. И видим длительность паузы.
Сообщение отредактировал
ivan_fd - Чт, 06.07.2017, 23:16
|
|
|
|
ivan_fd |
Дата: Пт, 07.07.2017, 11:05 | Сообщение # 72 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Видеоинструкция -
|
|
|
|
доцент2 |
Дата: Сб, 08.07.2017, 21:55 | Сообщение # 73 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
293
Замечания:
±
На сайте с 13.09.2011
Статус:
Offline
|
ivan_fd, Спасибо за алгоритм. Заработало. Только при задержке в 1мсек немного врет. При 28МГц - 32МГц завышает примерно на 2кГц, на частоте 53МГц на 4кГц. Это около 0.08%. Думаю это нормально. Сейчас пытаюсь погасить не значащие нули и точки.Пока получилось слишком громоздко. If j>=10000000 Then Print At 1, 1, " ",Dec j7,Dec j6,".",Dec j5,Dec j4,Dec j3,".",Dec j2,Dec j1,Dec j0," Hz" If j<10000000 Then Print At 1, 1, " ", " ", Dec j6,".", Dec j5, Dec j4, Dec j3,".", Dec j2, Dec j1, Dec j0," Hz" If j<1000000 Then Print At 1, 1, " ", " ", " ", " ", Dec j5, Dec j4, Dec j3,".", Dec j2, Dec j1, Dec j0," Hz" If j<100000 Then Print At 1, 1, " ", " ", " ", " ", " ", Dec j4, Dec j3,".", Dec j2, Dec j1, Dec j0," Hz" If j<10000 Then Print At 1, 1, " ", " ", " ", " ", " ", " ",Dec j3,".", Dec j2, Dec j1, Dec j0," Hz" If j<1000 Then Print At 1, 1, " ", " ", " ", " ", " ", " ", " ", " ", Dec j2, Dec j1, Dec j0," Hz" If j<100 Then Print At 1, 1, " ", " ", " ", " ", " ", " ", " ", " ", " ", Dec j1, Dec j0," Hz" If j<10 Then Print At 1, 1, " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", Dec j0," Hz" Можно это уменьшить по объему? Подскажите, а как измерить длительность импульса и паузы, что бы посчитать скважность? Наверное тут потребуются прерывания? T = t + tau (t - длительн. импульса tau - длит. "паузы") S = T / t (S - скважность)
Сообщение отредактировал
доцент2 - Вс, 09.07.2017, 18:26
|
|
|
|
Boroda |
Дата: Сб, 09.09.2017, 18:01 | Сообщение # 74 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
7
Замечания:
±
На сайте с 29.01.2009
Статус:
Offline
|
доцент2,
Код IF j_old <> j THEN ' если значение поменялось PRINT AT 1,1, REP " "\15 PRINT AT 1, 11, DEC j0," Hz" IF j>=10 THEN PRINT AT 1, 10, DEC j1 IF j>=100 THEN PRINT AT 1, 9, DEC j2 IF j>=1000 THEN PRINT AT 1, 7, DEC j3,"." IF j>=10000 THEN PRINT AT 1, 6, DEC j4 IF j>=100000 THEN PRINT AT 1, 5, DEC j5 IF j>=1000000 THEN PRINT AT 1, 3, DEC j6,"." IF j>=10000000 THEN PRINT AT 1, 2, DEC j7 END_IF j_old = j ; запоминаем старое значение
Сообщение отредактировал
Boroda - Сб, 09.09.2017, 18:06
|
|
|
|