IC7K 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба голову сломал но сделать не могу никак маленький опыт программирования очевидно. есть задача: поступают прямоугольные испульсы с частотой от 0 до 150 Гц и скважностью 1. необходимо выдать подобные импульсы но с "плавной" регулировкой частоты (длительности) импульса/паузы и такой же скважностью в сторону увеличения длительности (уменьшения частоты). т.е. допустим поступил импульс/пауза длительностью L, а выдать нужно L+L/K, где K - коэф-т удлиннения импульса/паузы. пробовал таймером вызывать цикл счетчика и одновременно выдачи импульса в разных вариациях, но чтото никак может есть какая идея простая? буду благодарен за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AnV22 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба поступают прямоугольные испульсы с частотой от 0 до 150 Гц и скважностью 1. Вы не ошиблись со значением скважности? Может быть со скважностью 2? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Как соотносятся входная и выходная частоты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба необходимо выдать подобные импульсы но с "плавной" регулировкой частоты (длительности) импульса/паузы и такой же скважностью в сторону увеличения длительности (уменьшения частоты). т.е. допустим поступил импульс/пауза длительностью L, а выдать нужно L+L/K, где K - коэф-т удлиннения импульса/паузы. Т.е. удлинять надо и импульс и паузу одновременно. Пока вы удлиняете импульс, вы пропустите спадающий фронт и как же тогда вы удлините паузу ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба IC7K А чем "К" будете задавать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба голову сломал но сделать не могу никак маленький опыт программирования очевидно. может есть какая идея простая? Есть идея простая. Прежде чем кидаться программировать таймеры, стоит нарисовать на бумажке несколько импульсов на входе и на выходе и представить правила, как из одного сигнала получить другой. Многое и прояснится. А запрограммировать - поможем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IC7K 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Скважность 1 это пауза равна импульсу по длительности (сорри если ошибся :) K задается вручную путем подбора и всегда постоянно, т.е. это % от длины импулься получается Т.е. удлинять надо и импульс и паузу одновременно. Пока вы удлиняете импульс, вы пропустите спадающий фронт и как же тогда вы удлините паузу ? верно, но в том то все и дело :smile3046: как то надо обойти эту проблему стоит нарисовать на бумажке малоли какие есть механизмы у контроллера, я же не спец. может этот вопрос давно решен другим макаром. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Скважность 1 это пауза равна импульсу по длительности (сорри если ошибся :) Скважность это отношение длины импульса к периоду. Т.е. когда длительность импульса и паузы равны, то скважность равна двум. может этот вопрос давно решен другим макаром. Посмотрите микросхему К155ИЕ8 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Поскольку входная и выходная частоты разные, то вопрос о фазе не стоит, поэтому делайте два независимых процесса - измерение длительности импульса или периода, что Вам важнее, и генерацию меандра с заданной частотой. Период меандра изменяйте хоть после каждого измерения, хоть усредняйте - в зависимости от задачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба может этот вопрос давно решен другим макаром.Вам достаточно ясно дают понять, что вопрос некорректно поставлен, а Вы опять про механизмы в контроллере. Фазу соблюсти невозможно, т.е. речь может идти не об "удлинении импульса", а генерации другого сигнала, как выше пишут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
domowoj 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Поскольку входная и выходная частоты разные, то вопрос о фазе не стоит, поэтому делайте два независимых процесса - измерение длительности импульса или периода, что Вам важнее, и генерацию меандра с заданной частотой. Период меандра изменяйте хоть после каждого измерения, хоть усредняйте - в зависимости от задачи. абсолютно согласен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба есть задача: поступают прямоугольные испульсы с частотой от 0 до 150 Гц и скважностью 2. необходимо выдать подобные импульсы но с "плавной" регулировкой частоты (длительности) импульса/паузы и такой же скважностью в сторону увеличения длительности (уменьшения частоты) Ваша задача распадается на две простые подзадачи: 1) измерение периода входного сигнала и 2) формирование меандра заданной частоты. Вариантов решения подзадач - море...Лаптевых, ниже приведен самый простой. Формируете меандр с помощью прерывания таймера по переполнению, в нём вы должны инвертировать выходной пин и загрузить новое значение полупериода. В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера. При определенной сноровке можно даже на си залудить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба При определенной сноровке можно даже на си залудить. Насмешил. А без сноровки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 1 июля, 2009 Опубликовано 1 июля, 2009 · Жалоба Да. А что мешает это сделать без _особой_ сноровки, просто на Си? Или тут имелось ввиду знание Си в принципе? Ну тогда без вопросов )))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IC7K 0 2 июля, 2009 Опубликовано 2 июля, 2009 (изменено) · Жалоба Ваша задача распадается на две простые подзадачи: 1) измерение периода входного сигнала и 2) формирование меандра заданной частоты. Вариантов решения подзадач - море...Лаптевых, ниже приведен самый простой. Формируете меандр с помощью прерывания таймера по переполнению, в нём вы должны инвертировать выходной пин и загрузить новое значение полупериода. В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера. При определенной сноровке можно даже на си залудить. В основной программе непрерывно измеряете период входного сигнала и соответствующим образом корректируете период таймера а как его измерить? частота 16МГц, а таймер занят. а ведь считать то его нужно в единицах таймера получается я по таймеру 16МГц/256=62500 считал длину импулься и тут же параллельно выдавал, и как бы получается так что все сдвигается и накладывается на входной, вобщем запутало меня все это. вопрос о фазе не стоит. вот мой код - скажите где трабл :wassat: //==========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 Изменено 2 июля, 2009 пользователем IC7K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться