Как очень просто удвоить частоту импульсов
Перейти к содержимому

Как очень просто удвоить частоту импульсов

  • автор:

Arduino.ru

Очень быстрый умножитель импульсов (умножитель частоты)

  • Войдите на сайт для отправки комментариев

15 ответов [Последнее сообщение]
Чт, 05/06/2014 — 21:32
Зарегистрирован: 19.05.2014

Коллеги — требуется очень быстро (вход макс частота ~10кГц, ширина имульса ~5мкс) увеличить частоту импульсов на выходе, и посколько это импульсы шагов для ШД, то требуется произвести умножение очень пропорционально, при этом частота входящих импульсов категорически нелинейна.

Получившийся у меня код выполняется не очень быстро и может пропустить импульс, кроме того на длинных разгонах склонен к переполнению.

Прошу помощи зала в ускорении кода и поиске ошибок, я как мог подробно прокомментировал код, но если что непонятно — постараюсь объяснить в комментариях.

#define LED 17 #define DIV 4 // Кол-во микроимпульсов #define INP PINC // Порт входящих импульсов #define OUT PORTF // Порт исходящих импульсов #define MAX 12000 // Максимальное время ожидания импульса void setup() < /* Инициализация портов */ DDRF = B11111111; PORTF = B11111111; DDRC = B10111111; /* Таймер1 для подсчета временных интервалов между входящими импульсами */ TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; TCCR1B |= (1 void loop()< uint8_t inpValPre = 0b11111111; // Для хранения текущего состояние порта uint8_t inpValCur = 0b11111111; // Для хранения предыдущего состояние порта uint8_t inpRun = false; // Индикатор состояния серии импульсов uint8_t inpBufCnt = 0; // Входящий индекс буфера uint16_t inpBuf[256] = ; // Буфер для хранения временни импульсов uint8_t outRun = 0; // Индикатор состояния выхода uint8_t outDiv = 0; // Счетчик выполненных дроблений uint8_t outCnt = 0; // Исходящий индекс буфера uint8_t ovrCnt = 0; // Счетчик переполнения буфера /* Для ровного хода импульсов прерывания лучше выключить, однако теперь плата будет доступна только в момент загрузчика, сразу после загрузчика контроллер уйдетт в автономку и в этом состояниии его по юсб не прошить, т.е. придется ловить загрузчик */ //noInterrupts(); /* Лучше из loop не выходить, большие накладные расходы */ run: //PORTD = 0b00000000; // Для оценки времени исполнения по осцилу /* Считываем состояние входа, если пришел первый импульс - обнуляем таймер1 и продолжаем, если пришел следующий импульс - делим полученное время таймера1 и сохраняем значение в буфер Я пробовал реализовать этот кусок на прерываниях но это ничего по времени не дает */ inpValCur = INP; if(inpValCur == 0b00000000 && inpValPre == 0b01000000)< if(inpRun)< inpBuf[inpBufCnt++] = TCNT1 / DIV; // Используем переполнения для организации циклического буфера TCNT1 = 0; if(ovrCnt++ == 255) goto dbg; // Увеличим счетчик переполнения и если перепонение достигнуто - выпадем в дебаг // if(ovrCnt++ == 255) goto rst; // или сбросим счетчики и продолжим >else < TCNT1 = 0; inpRun = true; >> inpValPre = inpValCur; /* Проверяем закончилась ли серия импульсов, если время импульса превышено - записываем значение в буфер, если нет - продолжаем */ if(inpRun)< if(TCNT1 >= MAX) < inpBuf[inpBufCnt++] = MAX / DIV; if(ovrCnt++ == 255) goto dbg; // goto rst; inpBuf[inpBufCnt] = 0; // Обнуляем значение следующего элемента inpRun = false; >> /* Формируем начало импульса, если в буфере не нулевое значение - устанаваливаем уровень на выходе, обнуляем таймер и устанаваливаем признак импульса */ if(inpBuf[outCnt])< /* Если имеется признак импульса - устанавливаем уровень на выходе, и если время импульса истекло - формируем окончание импульса */ if(outRun)< //if(TCNT3 >= 2) OUT = 0b11111111; // Pulse width ~10us OUT = 0b11111111; if(TCNT3 >= inpBuf[outCnt])< if(outDiv == DIV)< outDiv = 0; outCnt++; ovrCnt--; // Уменьшаем счетчик переполнения >else < outDiv++; >outRun = false; > >else < OUT = 0b00000000; TCNT3 = 0; outRun = true; >> //PORTD = 0b11111111; goto run; rst: outCnt = inpBufCnt; outDiv = 0; goto run; dbg: Serial.println("DBG"); Serial.print("Inp count: "); Serial.println(inpBufCnt, DEC); Serial.print("Out count: "); Serial.println(outCnt, DEC); Serial.print("Ovr count: "); Serial.println(ovrCnt, DEC); for(byte b = 0; b < 255; b++)< Serial.print(b, DEC); Serial.print("\t"); Serial.println(inpBuf[b], DEC); >while(1)< digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); delay(250); >; >
  • Войдите на сайт для отправки комментариев

Как очень просто удвоить частоту импульсов

Текущее время: Сб мар 16, 2024 01:27:21

Часовой пояс: UTC + 3 часа

Запрошенной темы не существует.

Часовой пояс: UTC + 3 часа

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y

Работоспособность сайта проверена в браузерах:
IE8.0, Opera 9.0, Netscape Navigator 7.0, Mozilla Firefox 5.0
Адаптирован для работы при разрешениях экрана от 1280х1024 и выше.
При меньших разрешениях возможно появление горизонтальной прокрутки.
По всем вопросам обращайтесь к Коту: kot@radiokot.ru
©2005-2024

Помогите со схемой удвоителя частоты импульсов

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Поделиться

Последние посетители 0 пользователей онлайн

  • Ни одного зарегистрированного пользователя не просматривает данную страницу

Объявления

Сообщения

Dr. West

Ничего, зато кисть будет сильная. А чем не устроили готовые китайские драйверы? Платка размером с ноготь, по цене пачки сигарет, ничего не греется и бесполезных потерь энергии минимум.

Включил я аппарат в сеть через 2 лампочки по 30 ватт. Ничего не бахнуло и мультиметр говорит что на выходе 50вольт но он по моему не ТРУ РМС. Вот осцилка по выходу И вот К-Э нижнего: не знаю как проверить настоящее напряжение на выходе потому что ослик тоже врёт. Так же когда аппарат выключается из сети то при снижении напряжения на входных конденсаторах tny264 начинает цикличесски перезапускаться и щелкать реле. Что раздражает но думаю резистор паралельно конденсаторов сможет помочь Вообще ослик говорит что 83 вольта. Надеюсь не врёт

Все очень просто — разный тех процесс изготовления. Будете удивлены — сопротивления даже у партий отличаются. ЗЫ. Не надо цитировать то что не надо цитировать. Открываете даташит на изделие и находите разброс параметров: Не говоря уже о том что один у вас подделка.

Простой умножитель частоты на ICS601-01

Идея создания простого, качественного и компактного умножителя частоты родилась, когда мне потребовалось поднять опорную частоты тактового генератора для DDS генератора AD9956 с 10 МГц до 100 МГц. Я стал рассматривать различные варианты, и тут под руку попалась микросхема ICS601-01 (стоимость на Ali ~5-6$). Это микросхема поверхностного монтажа работает с входной частотой от 10 МГц до 27 МГц и умножает ее максимум до 157 МГц. Причем коэффициент умножения задается внешними 4-мя ножками, путем формирования цифрового кода коэффициента усиления, что очень удобно, если надо быстро менять выходную частоту. Выходным сигналом является меандр, что является плюсом для тактирования цифровых схем. Однако, открыв datasheet я не увидел привычной схемы типового проекта. Именно в этот момент родилась идея написать эту статью. Итак цоколевка микросхемы представлена на рисунке ниже. Распиновка ICS601-01Перерыв весь интернет, и покопавшись на форумах было решено собрать умножитель по следующей схеме ниже. Мне было необходимо предусмотреть два выхода, но вы вполне можете не использовать второй выход. Резисторы R2, R3 по 33 Ома это значение рекомендует изготовитель. Значение резистора R1 не критично, он замыкает на землю ножку REFEN тем самым отключая выход REFOUT с буферной частотой (лично я поставил 1 кОм). Все конденсаторы в схеме типовые, C1, C2 и C3 производитель рекомендует значения 10, 0.1, 0.01 мкФ, а конденсаторы С4 и С5 это типовые конденсаторы стабилизатора 7805. Сам стабилизатор ставить необязательно, вполне можно питать схему 5 В из вне, но я решил так. Питание микросхемы тоже не критично, от 3 до 5 вольт. Схема простого умножителя частоты на ICS601-01В целом ничего сложного, цифровой код коэффициента задается dip переключателями, однако ничего не мешает сделать жесткие перемычки. Плата легко была разведена на одном слое, второй был залит полигоном земли. Получившуюся схему отправил в Китай. Gerber проект прикрепляю к статье. В итоге через пару недель мне пришел мой заказ и начал сборку и испытания. На фото ниже собранный умножитель. После монтажа я приступил к тестам работы умножителя. Для наглядности я прикрепляю фотографии осциллограмм. Результат работы умножителя очень порадовал. Кто заинтересовался этой микросхемой рекомендую посмотреть всю линейку микросхем ICS601. Различные микросхемы умножителей, с различными дополнительными функциями. Надеюсь статья кому нибудь поможет. Всем стабильной частоты!

Список радиоэлементов
Прикрепленные файлы:
  • ic601-01maket.rar (71 Кб)
Теги:

Kamikadza Опубликована: 16.09.2015 0 0

Вознаградить Я собрал 0 1

Оценить статью

  • Техническая грамотность

Оценить Сбросить

Средний балл статьи: 4.8 Проголосовало: 1 чел.

Комментарии (8) | Я собрал ( 0 ) | Подписаться

Для добавления Вашей сборки необходима регистрация

0

darkly 13.10.2015 22:15 #
Где в Китае заказывал и сколько стоила печатная плата?

0

[Автор]

Kamikadza 03.03.2016 08:25 #
Заказывалось все партией 10 штук в магазине Seed Studio. Вышло около 1000 р.

0

Александр 09.12.2020 09:39 #

Здравствуйте! Сгодится ли эта схема для увеличения частоты синхроимпульсов горизонтальной развертки? Паяю кабель-переходник со SKART на VGA.

0

[Автор]

Kamikadza 09.12.2020 21:13 #
Думаю нет, там же импульсы, а тут именно для повышения частоты тактовых сигналов (заполнение 50%)

0

Александр 10.12.2020 13:18 #

Понял, спасибо.
Задача довольно сложная. Можете чем-то помочь в вопросе относительно переходника со SKART на VGA? Есть рабочая схема на LM1881N, но частота синхроимпульсов на выходе 15 кГц. С такой чвстотой могут работать только очень древние VGA мониторы. Нужно чтобы частота синхроимпульсов на выходе была хотя бы Поддерживаемая частота же более-менее современных VGA мониторов — от 31.5 кГц (при разрешении 640х480).
Кроме того, я не уверен что все корректно заработает после простого увеличения частоты синхроимпульсов на выходе.

0

Павел 29.04.2021 03:54 #

Получится на этой микросхеме сделать умножитель для тахометра? Надо частоту сигналов с датчика умножить на 2.

0

zenov 29.04.2021 12:58 #

Вы это серьезно?
Для вашей задачи нужна одна м\сх 555ЛП5 и запрос в Гугле — «Формирование импульсов по фронту и спаду».

0

74LS00 22.05.2021 11:43 #

Хорошо бы, но удвоители по фронту и спаду работают только с частотомерами считающими импульсы. Так что вопрос про минимальную частоту на эту микру остаётся. А купить их сейчас можно только за 1700р десяток, так что не интересно

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *