|
Увеличение Длины Поступающих Импульсов, поступил импульс длительностью L, а выдать нужно L+L/K |
|
|
|
Jul 1 2009, 02:09
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-06-09
Из: Хабаровск
Пользователь №: 49 895

|
голову сломал но сделать не могу никак маленький опыт программирования очевидно.
есть задача:
поступают прямоугольные испульсы с частотой от 0 до 150 Гц и скважностью 1. необходимо выдать подобные импульсы но с "плавной" регулировкой частоты (длительности) импульса/паузы и такой же скважностью в сторону увеличения длительности (уменьшения частоты).
т.е. допустим поступил импульс/пауза длительностью L, а выдать нужно L+L/K, где K - коэф-т удлиннения импульса/паузы.
пробовал таймером вызывать цикл счетчика и одновременно выдачи импульса в разных вариациях, но чтото никак
может есть какая идея простая?
буду благодарен за помощь!
|
|
|
|
|
 |
Ответов
|
Jul 1 2009, 11:54
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(IC7K @ Jul 1 2009, 01:09)  есть задача: поступают прямоугольные испульсы с частотой от 0 до 150 Гц и скважностью 2. необходимо выдать подобные импульсы но с "плавной" регулировкой частоты (длительности) импульса/паузы и такой же скважностью в сторону увеличения длительности (уменьшения частоты) Ваша задача распадается на две простые подзадачи: 1) измерение периода входного сигнала и 2) формирование меандра заданной частоты. Вариантов решения подзадач - море...Лаптевых, ниже приведен самый простой. Формируете меандр с помощью прерывания таймера по переполнению, в нём вы должны инвертировать выходной пин и загрузить новое значение полупериода. В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера. При определенной сноровке можно даже на си залудить.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 2 2009, 00:05
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-06-09
Из: Хабаровск
Пользователь №: 49 895

|
Цитата(=GM= @ Jul 1 2009, 15:54)  Ваша задача распадается на две простые подзадачи: 1) измерение периода входного сигнала и 2) формирование меандра заданной частоты.
Вариантов решения подзадач - море...Лаптевых, ниже приведен самый простой.
Формируете меандр с помощью прерывания таймера по переполнению, в нём вы должны инвертировать выходной пин и загрузить новое значение полупериода. В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера.
При определенной сноровке можно даже на си залудить. В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера а как его измерить? частота 16МГц, а таймер занят. а ведь считать то его нужно в единицах таймера получаетсяя по таймеру 16МГц/256=62500 считал длину импулься и тут же параллельно выдавал, и как бы получается так что все сдвигается и накладывается на входной, вобщем запутало меня все это. вопрос о фазе не стоит. вот мой код - скажите где трабл CODE //==========START TIMER PROCESS===================== Timer: CLI
//заносим и выделяем бит скорости из порта С IN PortCVal, PINC ; ANDI PortCVal, 1<<InPortSyg
//выделяем предыдущее состояние бита из порта С MOV temp1, Flags ; ANDI temp1, 1<<InSygFlag
//копируем бит из порта С для проверки изменился ли он MOV temp3, PortCVal EOR temp3, temp1 ; проверяем изменился ли бит //если изменился то пытаемся его продлить BRNE DecDelay ;1x1=0(Z) 0x0=0(Z) 1x0=1 0x1=1 //после задержки инвертируем флаг сигнала LDI temp3,1<<InSygFlag ; EOR Flags, temp3
//вычисляем длительность нового импульса DelL_Next DelH_Next
CalNewDel:
MOV dd16uL, CtrL MOV dd16uH, CtrH //для упрощения задаем фиксированную задержку LDI DelL_Next, $10 LDI DelH_Next, $00 //прибавляем к длительности импульса ADD DelL_Next, CtrL ADC DelH_Next, CtrH //начнем подсчет заново CLR CtrL CLR CtrH
//ПРОДОЛЖИМ ВЫДАЧУ ИМПУЛЬСА DecDelay: DEC DelL_Cur BRNE FollowCount TST DelH_Cur BRNE DecDelayH //Задержка ЗАКОНЧИЛАСЬ, загружаем НОВУЮ MOV DelL_Cur, DelL_Next MOV DelH_Cur, DelH_Next RJMP ActuateSyg DecDelayH: DEC DelH_Cur RJMP FollowCount //АКТУАЛИЗАЦИЯ ТОЛЬКО ПОСЛЕ ЗАДЕРЖКИ!!!!! ActuateSyg: //выделяем предыдущее состояние OutSyg из флага
MOV PortCVal, Flags LDI temp3,1<<OutSygFlag ; AND PortCVal, temp3 EOR PortCVal, temp3 ; EOR Flags, temp3
//актуализация сигнала (изменение на обратный) OUT PORTC, PortCVal //выдача импульса FollowCount: INC CtrL ; и увеличиваем общий счетчик импульсов BRNE SetTimer INC CtrH BRNE SetTimer //ограничиваем длину входного импульса SER CtrL SER CtrH ;Counter=$FFFF SetTimer:
//предустановка периода таймера на 1 тик LDI temp1, $FF ;загружаем старший байт OUT TCNT1H, temp1 ; Старший байт пошел! LDI temp1, $FE ;загружаем младший байт OUT TCNT1L, temp1 ; Младший байт пошел!
RETI
Сообщение отредактировал IC7K - Jul 2 2009, 00:23
|
|
|
|
|
Jul 2 2009, 12:33
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(IC7K @ Jul 1 2009, 23:05)  В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера а как его измерить? частота 16МГц, а таймер занят. а ведь считать то его нужно в единицах таймера получается вопрос о фазе не стоит. вот мой код - скажите где трабл Задвинем на время ваш код на дальнюю полку, он не для среднего ума (:-). Измерить период входного сигнала можно так. 1) Ждёте начало входного импульса, т.е. перепада 0-1. 2) Читаете текущее значение таймера currtime. 3) Вычисляете pulselength=currtime-prevtime. 4) Сохраняете текущее время prevtime=currtime. 5) Переходите к пункту 1.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 2 2009, 23:19
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-06-09
Из: Хабаровск
Пользователь №: 49 895

|
блин я уже пожалел что применил умное слово скважность Вы напрасно пытаетесь объяснить автору топика принцип измерения. Я не поленился, в гугле посмотрел его вопрос на других форумах. Там на аналогичное моему замечание про 0 частоту, он подтверждает: "да, частота может быть нулевой - когда вал остановлен". Автор явно абсолютно не понимает о чем говорит, и ведь будет пытаться измерять такую частоту.пятерка гуглу за оперативность любой частотомер же показывает 0, значит есть такая частота! будем спорить? Цитата(=GM= @ Jul 2 2009, 16:33)  Задвинем на время ваш код на дальнюю полку, он не для среднего ума (:-). спасибо  он явно не для начинающих у меня алгоритм такой: прыгаем по таймеру, в обработчике инкрементируем счетчик сработок таймера, тем самым меряем длину импульса при перепаде с 0-1 или 1-0 включаем задержку, одновременно вычисляем задержку следующего импульса одновременно считаем новый импульс и все это не работает почемуто...
|
|
|
|
|
Jul 3 2009, 04:10
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(IC7K @ Jul 3 2009, 08:49)  у меня алгоритм такой:
прыгаем по таймеру, в обработчике инкрементируем счетчик сработок таймера, тем самым меряем длину импульса при перепаде с 0-1 или 1-0 включаем задержку, одновременно вычисляем задержку следующего импульса одновременно считаем новый импульс
и все это не работает почемуто... Нельзя совмещать измерение входных импульсов и выдачу выходных. "Нельзя" не потому что это совсем невозможно, а потому, что это настолько сложно сделать правильно, что совершенно не имеет смысла париться. У вас должно быть 2 раздельных куска кода, один меряет период входной частоты, другой синтезирует выходныe частоты по заданию, полученному в результате измерения. 1. Измерение.Казалось бы, проще всего по перепаду входного импульса (из 0 в 1, или из 1 в 0, как больше нравится) запоминать значение свободно бегущего аппаратного счетчика. Период равен (текущее значение) - (предыдущее значение). Однако при больших периодах входного сигнала счетчик начнет переполняться. Чтобы не потерять правильное значение счетчика, необходимо в момент переполнения аппаратного счетчика (по прерыванию) инкрементировать программный счетчик, который станeт расширением аппаратного. Суммарная разрядность этого (аппаратного+программного) счетчика должна быть такой, чтобы переполнения не было хотя бы лет 100. Навскидку, 48 разрядов для частоты 16МГц/256 хватит за глаза. Конечно, при этом придется вычитание (текущее значение) - (предыдущее значение) делать 48-разрядным, зато голова не будет болеть. Вторая проблема - что делать, если входная частота равна 0? Ведь при этом на вход перестанут поступать импульсы, и измеритель так никогда и не закончит измерение очередного периода. А в это время выходной блок (синтезатор частоты) будет продолжать выдавать какие-то выходные импульсы, поскольку нового задания так никогда и не получит. Вот эта проблема посерьезней, чем разрядность счетчика. Ее можно попробовать решить так. Когда процедура прерывания, вызываемая в момент переполнения аппаратного счетчика, инкрементирует программную "надбавку", обсуждавшуюся ранее, она должна одновременно проверять накопленное к этому моменту значение разности (текущее значение) - (предыдущее значение). И если новая разность превысила то значение, которое было получено в предыдущем цикле измерения интервала, то дополнять (увеличивать) задание для выходного синтезатора частоты. 2. Синтез частоты по заданию.Это сделать легко, но надо учитывать, что синтезатор обязан регулярно проверять свое задание, поскольку оно может меняться "на лету", пока вых. импульс находится в стадии формирования. При нулевой вх. частоте, когда измеритель все время "подновляет" задание синтезатору, выход должен замереть навечно.
|
|
|
|
Сообщений в этой теме
IC7K Увеличение Длины Поступающих Импульсов Jul 1 2009, 02:09 AnV22 Цитата(IC7K @ Jul 1 2009, 08:09) поступаю... Jul 1 2009, 02:42 domowoj Как соотносятся входная и выходная частоты? Jul 1 2009, 02:49 dimka76 Цитата(IC7K @ Jul 1 2009, 06:09) необходи... Jul 1 2009, 04:49 domowoj IC7K
А чем "К" будете задавать? Jul 1 2009, 04:54 Dog Pawlowa Цитата(IC7K @ Jul 1 2009, 05:09) голову с... Jul 1 2009, 06:32 IC7K Скважность 1 это пауза равна импульсу по длительно... Jul 1 2009, 06:38 dimka76 Цитата(IC7K @ Jul 1 2009, 10:38) Скважнос... Jul 1 2009, 06:49  ATLab ЦитатаСкважность 1 это пауза равна импульсу по дли... Jul 2 2009, 04:48   IC7K можно вынести в отдельную ветку и там выяснить что... Jul 2 2009, 05:33    ATLab Цитата(IC7K @ Jul 2 2009, 15:33) а что мо... Jul 2 2009, 05:44     IC7K что еще непонятного? если кому то мой вопрос неясе... Jul 2 2009, 05:53      Dog Pawlowa Цитата(IC7K @ Jul 2 2009, 08:53) что еще ... Jul 2 2009, 06:38   dimka76 Цитата(ATLab @ Jul 2 2009, 08:48) другой ... Jul 2 2009, 06:49    Палыч To IC7K
Если у Вас всё ещё остались вопросы, то р... Jul 2 2009, 07:11   Tanya Цитата(ATLab @ Jul 2 2009, 08:48) Куда ка... Jul 2 2009, 13:04    ATLab Цитата(Tanya @ Jul 2 2009, 23:04) А сами-... Jul 2 2009, 13:52     Tanya Цитата(ATLab @ Jul 2 2009, 17:52) Понятие... Jul 2 2009, 14:26      Dog Pawlowa Цитата(Tanya @ Jul 2 2009, 17:26) Однако,... Jul 2 2009, 17:58 Dog Pawlowa Цитата(IC7K @ Jul 1 2009, 09:38) может эт... Jul 1 2009, 07:39 Alex11 Поскольку входная и выходная частоты разные, то во... Jul 1 2009, 07:07 domowoj Цитата(Alex11 @ Jul 1 2009, 14:07) Поскол... Jul 1 2009, 10:41 Dog Pawlowa Цитата(=GM= @ Jul 1 2009, 14:54) При опре... Jul 1 2009, 16:32  Палыч Цитата(IC7K @ Jul 2 2009, 03:05) вопрос о... Jul 2 2009, 06:08   ATLab Цитата(Палыч @ Jul 2 2009, 16:08) ... Нев... Jul 2 2009, 07:24    ATLab Цитата(IC7K @ Jul 3 2009, 09:19) любой ча... Jul 3 2009, 00:56    domowoj Цитата(IC7K @ Jul 3 2009, 06:19) блин я у... Jul 3 2009, 01:54 sigmaN Да.
А что мешает это сделать без _особой_ сноровки... Jul 1 2009, 21:53 akl Здравствуйте.
Можно сделать так
-"навечно... Jul 2 2009, 03:27 domowoj Цитата(akl @ Jul 2 2009, 10:27) Здравству... Jul 2 2009, 14:01 ATLab RE: Увеличение Длины Поступающих Импульсов Jul 2 2009, 06:07 domowoj Ребята, не спорьте!
http://ru.wikipedia.org/wi... Jul 2 2009, 17:52 Tanya Цитата(domowoj @ Jul 2 2009, 21:52) Ребят... Jul 2 2009, 18:24  ATLab Цитата(Tanya @ Jul 3 2009, 04:24) Так там... Jul 2 2009, 22:17   Tanya Цитата(ATLab @ Jul 3 2009, 02:17) P.S. Ст... Jul 3 2009, 03:22    domowoj Цитата(Tanya @ Jul 3 2009, 10:18) Зря Вы ... Jul 3 2009, 03:25     Tanya Цитата(domowoj @ Jul 3 2009, 07:25) В люб... Jul 3 2009, 05:43      ATLab ЦитатаИХМО, для того что бы начать составлять рабо... Jul 3 2009, 07:23       dimka76 Цитата(ATLab @ Jul 3 2009, 11:23) у Вас к... Jul 3 2009, 08:46        =AK= Цитата(dimka76 @ Jul 3 2009, 18:16) Как р... Jul 3 2009, 09:58        rezident Цитата(dimka76 @ Jul 3 2009, 14:46) Как р... Jul 3 2009, 10:51 tyro ИХМО, для того что бы начать составлять работающий... Jul 3 2009, 04:32 GDI Если скважность всегда постоянная, то зачем мерять... Jul 3 2009, 07:31 ATLab Ох не зря я сетовал на образование: почитайте опре... Jul 3 2009, 11:12 dimka76 Цитата(ATLab @ Jul 3 2009, 15:12) физики,... Jul 3 2009, 11:25  rezident Цитата(dimka76 @ Jul 3 2009, 17:25) вот и... Jul 3 2009, 12:53   singlskv Цитата(rezident @ Jul 3 2009, 16:53) А ес... Jul 3 2009, 20:58 =AK= Цитата(ATLab @ Jul 3 2009, 20:42) объясни... Jul 4 2009, 00:21  ATLab Цитата(=AK= @ Jul 4 2009, 10:21) .. на дв... Jul 4 2009, 03:11 mdmitry Уважаемые участники дискуссии! НЕ ПОРА ЛИ ОСТА... Jul 3 2009, 13:57 IC7K большое спасибо всем за ответы, буду пытаться иска... Jul 7 2009, 22:26 Herz Цитата(ATLab @ Jul 3 2009, 09:23) Tanya, ... Jul 8 2009, 08:24 IC7K помогла программа VLAB
код заработал Jul 12 2009, 05:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|