Регулировка частоты.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Регулировка частоты.
Привет всем! Помогите кто может... Разрабатываю алгоритм управления тремя светодиодами(в дальнейшем это будут оптопары). График сигналов приложу. Все три сигналы между собою свызаны небольшой задержкой на включение/выключение. Величина задержки пока роли не играет. Нужно регулировать частоту от 50 Гц до 1 кГц с точностью в 1Гц, так чтоб связь между сигналами не терялась. Как добиться зависимости между сигналами я разобрался, а как регулировать частоту не могу разобраться. Пишу на асме для пиков. В дальнейшем собираюсь добавить еще и регулировку скважности.
1. шим сразу отпал, так как не представляю как синхронизировать между собою эти три сигнала.
2. табличное чтение - высокое быстродействие, но очень большие затраты на память ROM. Если прописывать на каждый герц. Да и еще одного байта мало на константу, нужно минимум два. К примеру 1/50Гц = 0.02 сек. При кварце в 4 МГц нужно два байта для записи паузы в 0,02с. в один запишем 79, в другой 253. Вот и выходит не одна таблица, а две.
3. пытался разобраться с инструкцией AN575 IEEE 754 Compliant Floating Point Routines в ней описаны процедуры с плавающей запятой, но ничего не вышло... хотел с их помощью в рабочей программе вычислять период по формуле = 1/f.
http://www.microchip.com/stellent/idcpl ... e=en010961 - ссылка на инструкцию AN575
Может кто сталкивался с такой задачей?Или просто есть опыт по регулировке частоты?Подскажите... Поделитесь опытом... Заранее огромное спасибо!
1. шим сразу отпал, так как не представляю как синхронизировать между собою эти три сигнала.
2. табличное чтение - высокое быстродействие, но очень большие затраты на память ROM. Если прописывать на каждый герц. Да и еще одного байта мало на константу, нужно минимум два. К примеру 1/50Гц = 0.02 сек. При кварце в 4 МГц нужно два байта для записи паузы в 0,02с. в один запишем 79, в другой 253. Вот и выходит не одна таблица, а две.
3. пытался разобраться с инструкцией AN575 IEEE 754 Compliant Floating Point Routines в ней описаны процедуры с плавающей запятой, но ничего не вышло... хотел с их помощью в рабочей программе вычислять период по формуле = 1/f.
http://www.microchip.com/stellent/idcpl ... e=en010961 - ссылка на инструкцию AN575
Может кто сталкивался с такой задачей?Или просто есть опыт по регулировке частоты?Подскажите... Поделитесь опытом... Заранее огромное спасибо!
- Вложения
-
- График.JPG
- График сигналов
- (30.57 КБ) 599 скачиваний
- Реклама
-
goldenfrog
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Вт янв 17, 2012 17:32:10
- Откуда: СССР, левый берег Днепра
Re: Регулировка частоты.
Если есть три канала ШИМ, то синхронизировать их вполне можно, быстро вполне, можно почтроить дело на переменных векторах. Сразу оговорюсь, что в PIC машинах я не очень образорван до уровня минимальной профессии, на авр это реализовать не сложно.
Если хотите подробностей - прошу в личные сообщения, если тему решить нужно и она действиетльно важна для Вас а не просто поспрашивать.
Если хотите подробностей - прошу в личные сообщения, если тему решить нужно и она действиетльно важна для Вас а не просто поспрашивать.
- Shapa
- Встал на лапы
- Сообщения: 127
- Зарегистрирован: Пт июн 20, 2008 09:38:05
- Откуда: Харьков
- Контактная информация:
Re: Регулировка частоты.
Если я вас правильно понял. И если рассматривать работу без регулировки скважности, то:
- описываем алгоритм для частоты в 1Кгц
- добавляем туда перменную задержку, значение которой будет определять частоту
Ваш алгоритм примерно будет выглядеть так:
1) везде выдаём 0, спим до момента когда надо поднять красный. поднимем красный
2) ждём пока надо поднять зелёный. поднимаем зелный.
3) ждём до момента пока надо опустить красный
и т.д.
остаётся только высчитать перменную составляющую задержки. Не заморачивайтесь с дробными часлами, для 8битников это смерти подобно. Представтье себе что вы свой флоат умножили на 1000 и привели к инту. Вот с этим интом и работайте
- описываем алгоритм для частоты в 1Кгц
- добавляем туда перменную задержку, значение которой будет определять частоту
Ваш алгоритм примерно будет выглядеть так:
1) везде выдаём 0, спим до момента когда надо поднять красный. поднимем красный
2) ждём пока надо поднять зелёный. поднимаем зелный.
3) ждём до момента пока надо опустить красный
и т.д.
остаётся только высчитать перменную составляющую задержки. Не заморачивайтесь с дробными часлами, для 8битников это смерти подобно. Представтье себе что вы свой флоат умножили на 1000 и привели к инту. Вот с этим интом и работайте
-
goldenfrog
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Вт янв 17, 2012 17:32:10
- Откуда: СССР, левый берег Днепра
Re: Регулировка частоты.
Совершенно верно, дроби не нужны и близко для этой реализации. Всё делается на целочисленной арифметике разрядностью 16 бит, секрет в коэффициенте при времени задержки.
-
Андрей.
- Открыл глаза
- Сообщения: 61
- Зарегистрирован: Ср мар 28, 2012 14:40:15
- Откуда: "Млечный путь" дальше не помню
Re: Регулировка частоты.
Здравствыйте, уважаемые коты. Как-то набрел на сайт
http://www.gaw.ru/html.cgi/txt/app/micr ... AVR495.htm
Там рассказывается о векторном ШИМ (для любимого АД). В конце приводится какая-то программа.
Но вот беда: только неделю назад начал курить книжечку А.В. Фрунзе "Микроконтроллеры?...". Ну вы понимаете. Мож кто разберётся что там в програмке написано, можно с нее чего-нибуди почерпнуть? Что она отслеживает и что куда выдает?
Может и автору темы пригодится.
Пардонте, что слегка не в ту степь. Просто есть 3ф АД с кз ротором на 3кВт, а лимит сети 1ф и 4кВА
http://www.gaw.ru/html.cgi/txt/app/micr ... AVR495.htm
Там рассказывается о векторном ШИМ (для любимого АД). В конце приводится какая-то программа.
Но вот беда: только неделю назад начал курить книжечку А.В. Фрунзе "Микроконтроллеры?...". Ну вы понимаете. Мож кто разберётся что там в програмке написано, можно с нее чего-нибуди почерпнуть? Что она отслеживает и что куда выдает?
Может и автору темы пригодится.
Пардонте, что слегка не в ту степь. Просто есть 3ф АД с кз ротором на 3кВт, а лимит сети 1ф и 4кВА
- Реклама
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Регулировка частоты.
А программный ШИМ не рассматривали? Такты задавать при помощи прерывания от таймера, меняя величину сравнения при которой возникает прерывание от таймера и его обнуление можно регулировать скорость выполнения алгоритма, и следовательно его частоту.
-
Андрей.
- Открыл глаза
- Сообщения: 61
- Зарегистрирован: Ср мар 28, 2012 14:40:15
- Откуда: "Млечный путь" дальше не помню
Re: Регулировка частоты.
Так, с частотой чуть прояснилось, а как быть с напряжением? Требуется для начала U/f = const. Как мне кажется вариант один: создаём штук 65 таблиц sin(t) для каждай f с учетом соотношения U/f = const, и выбирая ту/иную таблицу соответствующе уменьшаем/увеличиваем скорость выполнения алгоритма. Может я ошибаюсь. Сколько искал не смог найти действующего образца частотного преобразователя. Взглянуть бы на схемку и програмку, да хоть понюхать бы.
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Регулировка частоты.
Эм... не знаю как насчет контроллеров, но посмотри пример прямого цифрового синтеза. Таблица синуса там используется одна, а частота задается числом подаваемым на сумматор, по сигналу с опорного генератора происходит суммирование. Чем чаще суммируем и чем больше число - тем быстрее перебирается вся таблица.
http://rf.atnn.ru/s6/DDS_1.htm - посмотри по ссылке "Рис. 4. Прямой цифровой синтезатор на основе накапливающего сумматора". Примерно такой алгоритм реализовать программно, а выход для каждой фазы брать из таблицы синуса со смещением.
И делов-то.
А дальше, подавать вычисленные значения на 3 канала ШИМ и радоваться жизни.
http://rf.atnn.ru/s6/DDS_1.htm - посмотри по ссылке "Рис. 4. Прямой цифровой синтезатор на основе накапливающего сумматора". Примерно такой алгоритм реализовать программно, а выход для каждой фазы брать из таблицы синуса со смещением.
И делов-то.
А дальше, подавать вычисленные значения на 3 канала ШИМ и радоваться жизни.
-
Андрей.
- Открыл глаза
- Сообщения: 61
- Зарегистрирован: Ср мар 28, 2012 14:40:15
- Откуда: "Млечный путь" дальше не помню
Re: Регулировка частоты.
Благодарю за ссылочку. Завтра попытаюсь обмозговать.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Регулировка частоты.
Спасибо всем кто откликнулся.
Может я неправ?Поправьте...
Я сразу расчитывал на 16-битные числа. Пробовал и такой алгоритм построить: делить не 1/f, а 1000/f, а после полученное число умножить на необходимый коэффициент. Как я понимаю, инт - это округление до целого числа? Так вот. Взял калькулятор в руки 1000/1000=1 вроде все ок! Бери теперь это число и умножай его на нужный коэффициент. Далее попробовал 1000/800=1,25 округлил до 1 и выходит, что задержка будет одинаковая, как для частоты в 1кГц, так и для частоты в 800Гц. А это не очень хорошо.остаётся только высчитать перменную составляющую задержки. Не заморачивайтесь с дробными часлами, для 8битников это смерти подобно. Представтье себе что вы свой флоат умножили на 1000 и привели к инту. Вот с этим интом и работайте
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Регулировка частоты.
А программный ШИМ не рассматривали? Такты задавать при помощи прерывания от таймера, меняя величину сравнения при которой возникает прерывание от таймера и его обнуление можно регулировать скорость выполнения алгоритма, и следовательно его частоту.
Насколько понимаю вы предлагаете сделать что-то похожее на это:основной сигнал пусть будет красный первый импульс пропустим, начнем со второго.
1. Запускаем один таймер и ждем когда он сработает;
2. В обработчике прерываний запускаем второй таймер, который при срабатывании установит лог 0 на зеленом
сигнале;
3.После срабатывания второго таймера, записываем в него новое значение и ждем совпадения с синим сигналом. после всего ждем срабатывание первого таймера и записываем лог0 на красный сигнал, запускаем снова первый таймер, но второй таймер не трогаем, ждем когда первый таймер снова сработает и т.д.
Я правильно понял?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Регулировка частоты.
Нет. Просто по прерыванию таймера меняем фазу сигнала на выходе.
Чаще идут прерывания - чаще меняется фаза и больше частота сигнала на выходе.
Чаще идут прерывания - чаще меняется фаза и больше частота сигнала на выходе.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Регулировка частоты.
Нет. Просто по прерыванию таймера меняем фазу сигнала на выходе.
Чаще идут прерывания - чаще меняется фаза и больше частота сигнала на выходе.
Это относиться к DDS генератору? То есть мне нужно еще составить таблицу выходного сигнала. В моем случае это меандр. И в зависимости от фазы считывать определенные значения таблицы. Не могу только понять, как расчитывается коэффициент накопления фазы. Может подскажите?
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Регулировка частоты.
А там в статье нет формулы? Ну вот смотри, если ты ставишь коэфициент равный единице, то сумматор фактически превращается в счетчик, период будет равен опорной частоте деленной на количество импульсов до переполнения. Если сумматор 16-битный, то переполнение произойдет через 65536 тактов. если выставить 2, очевидно сумматор будет считать ровно в 2 раза быстрее ... и т.д.
Коэфициент по сути является дополнительным кодом до величины периода.
а период равен 1/частота...
Для меандра никакой таблицы не нужно, достаточно взять последний разряд сумматора... или подсчитывать переполнения и делить их счетным триггером - на выходе получишь чистый меандр с частотой в 2 раза меньше частоты переполнения сумматора.
Коэфициент по сути является дополнительным кодом до величины периода.
а период равен 1/частота...
Для меандра никакой таблицы не нужно, достаточно взять последний разряд сумматора... или подсчитывать переполнения и делить их счетным триггером - на выходе получишь чистый меандр с частотой в 2 раза меньше частоты переполнения сумматора.
-
goldenfrog
- Встал на лапы
- Сообщения: 113
- Зарегистрирован: Вт янв 17, 2012 17:32:10
- Откуда: СССР, левый берег Днепра
Re: Регулировка частоты.
Вроде бы удалось человеку разъяснить, а как у него всё получится - может расскажет как надо на самом деле. Успеха начинающему разработчику.
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Регулировка частоты.
Коэфициент по сути является дополнительным кодом до величины периода.
а период равен 1/частота...
Спасибо за разъяснение. Формулу нашел. Как я понял код частоты - это и есть коэффициент. При оперативном изменении частоты, этот код частоты и надо менять. Так? Формула для расчета выходной частоты: Fout=M*Fclk/2n. Пробовал расчитывать для выходной частоты 50 Гц. при опорной частоте в 100кГц. Получается 32,768, сумматор 16-битный. Вылезают все теже числа с плавающей запятой. Может я не прав...
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Регулировка частоты.
Числа там только целые. ровное значение частоты не всегда возможно установить, поэтому выбирается ближайшая. Если ошибка оказывается недопустимо большой - нужно выбирать опорную частоту больше.
При ваших параметрах М = 65 на выходе получается частота равная 49.85 Гц.
при М = 66 частота равна 50.35Гц
Чтобы увеличить точность установки частоты необходимо увеличить разрядность сумматора.
У вас получается шаг установки частоты примерно 5 порядков на весь диапазон, или примерно 0.76Гц - его легко посчитать при М = 1.
Увеличив разрядность сумматора хотябы на 4 бита, уменьшаем шаг в 16 раз и т.д.
Уменьшив тактовую частоту до 10кГц, имеем шаг по частоте 0.076Гц и т.д. Но при этом уменьшается максимальная частота.
При ваших параметрах М = 65 на выходе получается частота равная 49.85 Гц.
при М = 66 частота равна 50.35Гц
Чтобы увеличить точность установки частоты необходимо увеличить разрядность сумматора.
У вас получается шаг установки частоты примерно 5 порядков на весь диапазон, или примерно 0.76Гц - его легко посчитать при М = 1.
Увеличив разрядность сумматора хотябы на 4 бита, уменьшаем шаг в 16 раз и т.д.
Уменьшив тактовую частоту до 10кГц, имеем шаг по частоте 0.076Гц и т.д. Но при этом уменьшается максимальная частота.


