|
|
  |
Увеличение Длины Поступающих Импульсов, поступил импульс длительностью 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, 02:42
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 18-06-07
Из: Челябинск
Пользователь №: 28 529

|
Цитата(IC7K @ Jul 1 2009, 08:09)  поступают прямоугольные испульсы с частотой от 0 до 150 Гц и скважностью 1. Вы не ошиблись со значением скважности? Может быть со скважностью 2?
--------------------
- Своя программа жизни -
|
|
|
|
|
Jul 1 2009, 04:49
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(IC7K @ Jul 1 2009, 06:09)  необходимо выдать подобные импульсы но с "плавной" регулировкой частоты (длительности) импульса/паузы и такой же скважностью в сторону увеличения длительности (уменьшения частоты).
т.е. допустим поступил импульс/пауза длительностью L, а выдать нужно L+L/K, где K - коэф-т удлиннения импульса/паузы. Т.е. удлинять надо и импульс и паузу одновременно. Пока вы удлиняете импульс, вы пропустите спадающий фронт и как же тогда вы удлините паузу ?
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jul 1 2009, 06:32
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(IC7K @ Jul 1 2009, 05:09)  голову сломал но сделать не могу никак маленький опыт программирования очевидно.
может есть какая идея простая? Есть идея простая. Прежде чем кидаться программировать таймеры, стоит нарисовать на бумажке несколько импульсов на входе и на выходе и представить правила, как из одного сигнала получить другой. Многое и прояснится. А запрограммировать - поможем.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jul 1 2009, 06:38
|
Группа: Новичок
Сообщений: 9
Регистрация: 3-06-09
Из: Хабаровск
Пользователь №: 49 895

|
Скважность 1 это пауза равна импульсу по длительности (сорри если ошибся K задается вручную путем подбора и всегда постоянно, т.е. это % от длины импулься получается Т.е. удлинять надо и импульс и паузу одновременно. Пока вы удлиняете импульс, вы пропустите спадающий фронт и как же тогда вы удлините паузу ?верно, но в том то все и дело  как то надо обойти эту проблему стоит нарисовать на бумажкемалоли какие есть механизмы у контроллера, я же не спец. может этот вопрос давно решен другим макаром.
|
|
|
|
|
Jul 1 2009, 06:49
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(IC7K @ Jul 1 2009, 10:38)  Скважность 1 это пауза равна импульсу по длительности (сорри если ошибся  Скважность это отношение длины импульса к периоду. Т.е. когда длительность импульса и паузы равны, то скважность равна двум. Цитата может этот вопрос давно решен другим макаром. Посмотрите микросхему К155ИЕ8
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|