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

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

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

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

<Изображение удалено>
Старался написать программу , ниже приведена часть(и) исходного кода программы . Проверял при поступающем сигнале частотой 1Гц ( собственно будет использоваться только данная частота ), работает нормально . Имеются небольшие сомнения , на счет того , что программа вряд ли будет работать при небольшом изменении частоты поступающего сигнала (0.8 Гц , 0.9ГЦ , 1.1Гц ) . Хотелось бы "универсальную" программу/алгоритм .
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2014, 17:45
Ответы с готовыми решениями:

Как сделать так чтобы длительность импульса регулировалось кнопками + и -? МК Atmega328P
идёт прерывание по спадающему фронту на INT0, после 3 прерываний должен последовать импульс регулируемой длины. #define F_CPU...

Длительность импульса RESET
Хочу сделать прошивалку по Bluetooth HC-05 для Aduino. Меня интересует можно ли где-то найти требования к длительности импульса RESET...

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

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

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

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

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

Как?

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

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

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

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

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2014, 14:27
Помогаю со студенческими работами здесь

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

Измерить длительность импульса
Помогите написать программу: измерить длительность импульса положительной полярности(лог.1) таймером/счётчиком Т/С0 и, если его...

Длительность импульса с энергетическим критерием
Добрый день, форумчане. Мне нужно с помощью матлаба найти длительность импульса с использованием тау (использовал свои) и...

Значение функции на интервале превышающем длительность импульса
Совершенно не понимаю в чем проблема. Функция должна повторять импульс, но этого не происходит #include &lt;conio.h&gt; #include...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru