Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/56: Рейтинг темы: голосов - 56, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
1

Как посчитать длительность Прямоугольного импульса (Меандр)

30.01.2014, 17:45. Просмотров 10136. Ответов 22
Метки нет (Все метки)

Доброго времени суток .
Поставленная задача : при поступлении сигнала МК должен отсчитывать время действия данного сигнала , т.е. его продолжительность ( от 0 до t1 на нижеприведенном рисунке ). Затруднения вызваны тем , что сигнал представляет собой Прямоугольные импульсы , Меиндр .

<Изображение удалено>
Старался написать программу , ниже приведена часть(и) исходного кода программы . Проверял при поступающем сигнале частотой 1Гц ( собственно будет использоваться только данная частота ), работает нормально . Имеются небольшие сомнения , на счет того , что программа вряд ли будет работать при небольшом изменении частоты поступающего сигнала (0.8 Гц , 0.9ГЦ , 1.1Гц ) . Хотелось бы "универсальную" программу/алгоритм .
Код
Ldi Temp1 , 0
Ldi Temp2 , 0
Ldi Temp4 , 0
Ldi Count_Time , 0
Ldi Temp3 , 2

...

Sig:                         ; проверка поступления сигнала
In Temp ,PinB
cpi Temp,0b00000000
brne Sig
breq Sig1            ; перейти если есть сигнал на Sig1

Sig1:

Ldi Temp,0b00000100          ; прерывания по переполнению Timer1
out TIMSK,Temp
Ldi Temp,0b00000011          ; предделитель таймера CK/64
out TCCR1B,Temp
sei                          ; разрешаем прерываня

Inf:rjmp Inf                 ; бесконечный цикл

Timer1_Int:                  ; обработчик прерывания Timer1

clr Temp                     ; Обнуляем Timer1
Out TCNT1H , Temp            ; Обнуляем Timer1
Out TCNT1L , Temp            ; Обнуляем Timer1

cpi Temp1 ,0
breq Pr_Schet             ; переход если равно
cpi Temp1 ,1
breq Obr_Schet

; ********************************

Pr_Schet:

In Temp ,PinB
cpi Temp,0b00000000
breq m1
brne m2
m1: cpi Temp4 , 0
breq m11
brne m12
m11:Inc Count_Time
Inc Temp2 ;
Out PortD , Temp2
reti
m12:Inc Count_Time
Inc Temp2 ;
Out PortD , Temp2
Inc Temp3
reti
m2: Ldi Temp4 , 1
Dec Temp3
cpi Temp3 , 0
breq m5
Inc Count_Time
Inc Temp2 ;
Out PortD , Temp2
reti
m5: Ldi Temp1 , 1
Dec Count_Time
Ldi Temp,0b00000000
out TCCR1B,Temp
rjmp Sig

; ********************************

; ********************************

Obr_Schet:

...

; ********************************
Дорогие посетители форума ! Помогите составить алгоритм подсчета длительности сигнала , время сигнала .


<Изображение удалено>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2014, 17:45
Ответы с готовыми решениями:

Как влияет длительность импульса на спектр фаз или амплитуд периодического сигнала?
Вообще может посоветуете, где об этом написано. Уменьшили мы длительность импульса, а фазы начали...

Длительность импульса
Всем привет, как посчитать длительность импульса ? Задача состоит в определении интеграла вообще,...

Спектр прямоугольного импульса
Подскажите, пожалуйста, как получить спектральные линии, а не огибающую. Там как-то время дискретно...

Спектр прямоугольного импульса
Привет всем! У меня есть задачка, первая часть которой кажется тривиальной. Нужно написать прогу...

22
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
30.01.2014, 18:00 2
Цитата Сообщение от shirysom
Поставленная задача ...
Добавьте в описание задачи: как определяется момент t1?

Например: это спадающий фронт ровно третьего импулься.
Или так: это момент, после которого в течение такого-то времени сигнал остаётся нулём.

Как?
0
0 / 0 / 0
Регистрация: 30.06.2012
Сообщений: 177
30.01.2014, 18:02 3
Найдите книгу Ревича Ю.В. - "Практическое программирование Микроконтроллеров Atmel AVR на языке ассемблера 2-е издание 2011г". Начиная со страницы 164 почитайте... Мне помогло
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 18:10 4
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
Поставленная задача ...
Добавьте в описание задачи: как определяется момент t1?

Например: это спадающий фронт ровно третьего импулься.
Или так: это момент, после которого в течение такого-то времени сигнал остаётся нулём.

Как?

Время сигнала задается в другом контроллере ( может быть любое ) , соответственно сказать какому импульсу момент t1 принадлежит невозможно . Это собственно и усложняет задачу .
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 18:12 5
Цитата Сообщение от SirkVOK
Найдите книгу Ревича Ю.В. - "Практическое программирование Микроконтроллеров Atmel AVR на языке ассемблера 2-е издание 2011г". Начиная со страницы 164 почитайте... Мне помогло
Очень хорошая литература , всегда ее пользуюсь ! Сейчас открою .
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
30.01.2014, 18:17 6
Цитата Сообщение от shirysom
Время сигнала задается в другом контроллере ( может быть любое ) , соответственно сказать какому импульсу момент t1 принадлежит невозможно . Это собственно и усложняет задачу .
Да пусть хоть на заседании Генштаба принимается решение о моменте t1. Всё равно целевой МК должен знать (мой вопрос: как?), когдА наступает этот момент. Иначе задача даже более неопределённая, чем известное "копать от забора и до обеда".
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 18:23 7
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
Время сигнала задается в другом контроллере ( может быть любое ) , соответственно сказать какому импульсу момент t1 принадлежит невозможно . Это собственно и усложняет задачу .
Да пусть хоть на заседании Генштаба принимается решение о моменте t1. Всё равно целевой МК должен знать (мой вопрос: как?), когдА наступает этот момент. Иначе задача даже более неопределённая, чем известное "копать от забора и до обеда".

При спадающем фронте , после которого сигнал остаётся нулевым .
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
30.01.2014, 18:35 8
Попробую объяснить за shirysom, раз он не в состоянии. если я правильно понял, надо просто определить длительность пачки импульсов.

тогда нужно:
ждать, когда вход перейдёт в 1, начать отсчитывание времени
как только вход перейдёт в 0, записать время, но не прекращать счёт
если вход будет в 0 больше, чем максимальное время паузы (зависит от частоты и скважности), то значит импульсы закончились и временем пачки нужно считать записанное время, если импульс опять появился - продолжаем дальше. и так пока не наступит большая пауза.
для определения длительности паузы тоже нужно завести счётчик (его нужно обнулять при каждом переходе с 1 в 0)
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 18:45 9
Цитата Сообщение от Johmmy0007
надо просто определить длительность пачки импульсов.
Сказал как отрезал !
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 18:54 10
Цитата Сообщение от Johmmy0007
тогда нужно:
ждать, когда вход перейдёт в 1, начать отсчитывание времени
как только вход перейдёт в 0, записать время, но не прекращать счёт
при поступлении первого импульса "пачки" нужно запустить таймер , при спадающем фронте импульса записать время не выключая таймер .
А дальше можно поподробней .
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
30.01.2014, 19:00 11
Цитата Сообщение от shirysom
Цитата Сообщение от Johmmy0007
надо просто определить длительность пачки импульсов.
Сказал как отрезал !То есть Вы не видите разницы в том, что Вы сказали и в том, что Johmmy0007 долго и подробно объяснял? Ооо!
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
30.01.2014, 19:04 12
Цитата Сообщение от Johmmy0007
Попробую объяснить за shirysom
... ...
если вход будет в 0 больше, чем максимальное время паузы
То есть всё-таки второе:
Цитата Сообщение от OtyxPM
Или так: это момент, после которого в течение такого-то времени сигнал остаётся нулём.
Тогда, ТС, с Вас дополнение к условию задачи. Должен быть известен интервал таймаута: когда тишина на сигнальной линии длится дольше таймаута, моментом t1 считатется последний спадающий фронт (который к этому времени уже в прошлом).
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 19:08 13
Цитата Сообщение от OtyxPM
Цитата Сообщение от shirysom
Цитата Сообщение от Johmmy0007
надо просто определить длительность пачки импульсов.
Сказал как отрезал !
То есть Вы не видите разницы в том, что Вы сказали и в том, что Johmmy0007 долго и подробно объяснял? Ооо!

Дорости еще надо
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 19:15 14
Интервал времени между импульсами 1 секунда ( может чуть отличаться , примерно в общем 1сек ) , сколько импульсов в пачке не известно ( их количество нам скорей всего и не пригодится ) .
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
30.01.2014, 19:24 15
Цитата Сообщение от shirysom
Цитата Сообщение от Johmmy0007
тогда нужно:
ждать, когда вход перейдёт в 1, начать отсчитывание времени
как только вход перейдёт в 0, записать время, но не прекращать счёт
при поступлении первого импульса "пачки" нужно запустить таймер , при спадающем фронте импульса записать время не выключая таймер .
А дальше можно поподробней .
ну я вроде и так подробно описал.
для подсчёта паузы либо просто в цикле увеличиваете счётчик (при таких интервалах ошибки не скажутся), либо другой таймер используете, если он есть, но не забывайте обнулять., и как только пауза будет больше скажем 1,1 сек - считываем записанное время - это и есть длительность пачки. если же опять импульс пришёл за паузу - просто продолжим
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
30.01.2014, 19:38 16
кстати а можно один таймер использовать для всего, просто обнуляем его и при переходе с 0 в 1 и с 1 в 0. только при переходе с 1 в 0 прибавляем к счётчику длительности пачки, а в паузе - к счётчику пачки и к счётчику паузы (это если разрядности таймера не хватит и счётчик придётся заводить, а может и не надо - достаточно в цикле считывать показания таймера и сравнивать с критическим временем паузы). так и красивее и проще, вроде
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 19:40 17
Цитата Сообщение от Johmmy0007
Цитата Сообщение от shirysom
Цитата Сообщение от Johmmy0007
тогда нужно:
ждать, когда вход перейдёт в 1, начать отсчитывание времени
как только вход перейдёт в 0, записать время, но не прекращать счёт
при поступлении первого импульса "пачки" нужно запустить таймер , при спадающем фронте импульса записать время не выключая таймер .
А дальше можно поподробней .
ну я вроде и так подробно описал.
для подсчёта паузы либо просто в цикле увеличиваете счётчик (при таких интервалах ошибки не скажутся), либо другой таймер используете, если он есть, но не забывайте обнулять., и как только пауза будет больше скажем 1,1 сек - считываем записанное время - это и есть длительность пачки. если же опять импульс пришёл за паузу - просто продолжим

Тогда получается записанную паузу с реальной паузой сравнивать после спадающего фронта ?
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
30.01.2014, 19:44 18
конечно: фронт упал и после этого мы непрерывно считываем длительность паузы и постоянно сравниваем её с критическим значением, если критическое значение превышено - всё - используем записанное ранее время, если опять импульс пришёл - прибавляем время паузы к счётчику пачки и продолжаем
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
30.01.2014, 20:48 19
О результатах отпишусь позже . На счет завтра , в субботу отписаться не смогу , только в воскресенье .
0
0 / 0 / 0
Регистрация: 09.01.2014
Сообщений: 69
01.02.2014, 14:27 20
Цитата Сообщение от Johmmy0007
конечно: фронт упал и после этого мы непрерывно считываем длительность паузы и постоянно сравниваем её с критическим значением, если критическое значение превышено - всё - используем записанное ранее время, если опять импульс пришёл - прибавляем время паузы к счётчику пачки и продолжаем
Старался написать программу , ниже привел написанный обработчик прерывания таймера :

Код
Timer1_Int:             ; обработчик прерывания таймера

clr Temp                ; обнуляем таймер
Out TCNT1H , Temp
Out TCNT1L , Temp

cpi Temp1 ,0         ; проверяем какую подпрограмму выполнять
breq Pr_Schet        ; считаем время сигнала
cpi Temp1 ,1         ; проверяем какую подпрограмму выполнять
breq Obr_Schet       ; выводим посчитанное время

; *****************************************************************

Pr_Schet:               ; считаем время сигнала

In Temp ,PinB       ; проверяем есть ли сигнал
cpi Temp,0b00000000 ; проверяем есть ли сигнал
breq m1             ; если да , то идем на метку m1
brne m2             ; если нет , то идем на m2

m1: cpi Temp4 , 0
breq m12
brne m13
m12:Inc Signal_Time     ; считаем время сигнала"1"( +5 Вольт )
Ldi Temp4 , 1
Add R31 , R19       ; "Add"  Count_Time , Pouse_Time
clr Pouse_Time      ;
reti
m13:Inc Signal_Time     ; считаем время сигнала"1"( +5 Вольт )
reti

m2: Inc Pouse_Time      ; считаем время пузы
cpi Pouse_Time , 3  ; сравниваем паузу с "критической" паузой
BRSH end            ; если >= переход на end
Ldi Temp4 , 0
reti

end:Add R18 , R31       ; "Add" Signal_Time , Count_Time
Ldi Temp1 , 1       ; для вывода подсчитанного времени Obr_Schet
reti

;clr Temp
;Out TCCR1B , Temp
;rjmp Sig
;reti

; *****************************************************************

; *****************************************************************

Obr_Schet:

...

reti

; *****************************************************************
Дополнение : МК должен считать время сигнала ( пачки импульсов ) , а потом выводить его ( на счет этого позже ) . Для этого я использовал соответственно две "подпрограммы" Pr_Schet и Obr_Schet , а регистр Temp1 служит для их переключения .
Все регистры Temp , Temp1 , Temp4 , Count_Time , Signal_Time и Pouse_Time до прерывания равны 0 .
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2014, 14:27

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

Моделирование прямоугольного импульса
Здравствуйте, есть следующий код для создания и построения прямоугольного импульса в Matlab: T =...

СПМ прямоугольного импульса
Подскажите пожалуйста, как построить аналитическую спектральную плотность мощности прямоугольного...

Поиск спектра прямоугольного импульса
Всем привет, помогите разобраться с проблемой. Задача проста, имеется сигнал- прямоугольный...

Вывод графика прямоугольного импульса
Нужна помощь с программой. Нужно написать программу для вывода графика прямоугольного импульса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.