Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.02.2010, 01:33
|
|
Вид на жительство
Регистрация: 13.02.2010
Сообщений: 372
Сказал спасибо: 12
Сказали Спасибо 15 раз(а) в 12 сообщении(ях)
|
Регулировка частоты на контроллере. Спектрометр
Задача: формировать на любом порту контроллера сигнал определенной частоты с точностью 0,01Гц и с шагом 1Гц от 1Гц до 50КГц
Пусть будет мега16/16Mhz
как оптимально обеспечить такие условия?
Последний раз редактировалось spballiance; 20.02.2010 в 17:15.
|
|
|
|
20.02.2010, 01:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Регулировка частоты на контроллере
|
|
|
|
20.02.2010, 02:01
|
|
Вид на жительство
Регистрация: 13.02.2010
Сообщений: 372
Сказал спасибо: 12
Сказали Спасибо 15 раз(а) в 12 сообщении(ях)
|
Re: Регулировка частоты на контроллере
это я уже читал...
автор обошел вопрос генерации частоты, уделив время формированию синуса на ЦАП.
Я пробовал прикинуть через инициализацию Т0 и установку начального значения таймера - мне не очень нравится точность
|
|
|
|
20.02.2010, 02:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Регулировка частоты на контроллере
Сообщение от spballiance
|
автор обошел вопрос генерации частоты, уделив время формированию синуса на ЦАП.
|
Вообще то метод DDS там расписан полностью.
Но если хотите берите другой проект за основу - http://www.myplace.nu/avr/minidds/index.htm
Здесь частота выше и ниже точность, но все это зависит от параметров алгоритма.
А у Ридико точность частоты в 0,01Гц обеспечивается. Несмотря на то, что Вам там что то не нравится ![Улыбка](images/smilies/icon_smile.gif) Особенно если учесть что:
Сообщение от spballiance
|
Я пробовал прикинуть через инициализацию Т0 и установку начального значения таймера
|
Там таймер Т0 вообще не задействован.
|
|
|
|
20.02.2010, 12:54
|
|
Вид на жительство
Регистрация: 13.02.2010
Сообщений: 372
Сказал спасибо: 12
Сказали Спасибо 15 раз(а) в 12 сообщении(ях)
|
Re: Регулировка частоты на контроллере
ну принцип у них похожий ![Улыбка](images/smilies/icon_smile.gif) но синус мне не нужен, и таблицу прямоугольников не хочу забивать в eeprom (ЦАП мне не нужен), мне нужно просто через правильные интервалы времени инвертировать пин какого-нибудь свободного порта. дальше я этим сигналом буду тактировать внешние вещи.
иными словами: можно воспользоваться конечно библиотекой на Си delay_us и формировать интервалы с точностью до 1 мкс, но хотелось найти более изящный способ.
собираю спектрометр U,I(f), 2 каналами ацп снимаю характеристики, затем через фурье делаю нужные мне преобразования
поэтому синус я хочу возложить на внешнюю цепь, тактируемую от контроллера, а контроллер должен сосредоточится на сборе данных и задавании опорной частоты. такой алгоритм оптимален для минимизации погрешности, возникающей при не одновременном измерении тока и напряжения
Последний раз редактировалось spballiance; 20.02.2010 в 17:12.
|
|
|
|
20.02.2010, 20:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Регулировка частоты на контроллере
Сообщение от spballiance
|
но синус мне не нужен, и таблицу прямоугольников не хочу забивать в eeprom (ЦАП мне не нужен), мне нужно просто через правильные интервалы времени инвертировать пин какого-нибудь свободного порта. дальше я этим сигналом буду тактировать внешние вещи.
|
Таблица и не нужна, для формирования прямоугольника достаточно выводить в порт старший бит накопителя фазы. Но частота и правильные интервалы не одно и то же.
DDS выравнивает частоту за счет приличного джиттера. В Варианте Ридико с синусом это не проблема - ФНЧ поправит некрасивый сигнал до красивого синуса. С прямоугольником это не пройдет.
Сообщение от spballiance
|
иными словами: можно воспользоваться конечно библиотекой на Си delay_us и формировать интервалы с точностью до 1 мкс, но хотелось найти более изящный способ.
|
Ну прикиньте сами. 50000Гц это 20мкС. 49999.99Гц это 20,000396007840955250913968096568 мкС. Ближайшая частота, которую Вы сможете получить 21мкС =47619Гц. Т.е. шаг почти в 400Гц, а вовсе не 0,01. Если использовать таймер с аппаратным модулем сравнения, то при Fcpu=16000000 на 50000Гц это 320 тактов. 321 такт уже 49844, т.е. шаг 16Гц. Что тоже далеко не 0,01. А если нужен строго меандр, то ближайшее значение 322 такта = 49689Гц. Шаг уже ›300Гц.
Сообщение от spballiance
|
поэтому синус я хочу возложить на внешнюю цепь, тактируемую от контроллера
|
Так все же нужен синус? Поставьте отдельный контроллер с цапом и фильтрами именно на формирование частоты. Как у Ридико. А другим уже производите измерения. Это наименее затратный способ.
|
|
|
|
20.02.2010, 21:02
|
|
Вид на жительство
Регистрация: 13.02.2010
Сообщений: 372
Сказал спасибо: 12
Сказали Спасибо 15 раз(а) в 12 сообщении(ях)
|
Re: Регулировка частоты на контроллере
kison
все верно...
сейчас обдумываю постановку задачи, в принципе можно уйти от размерности частоты и переделать формулу на круговая частота=pi/delay_us(длина полупериода)
таким образом мне нужно:
20 точек * 20 измерений в диапазоне 10-20Гц--›100 000-50 000 мкс шаг неважен, т.к. я по изменению частоты делаю расчеты
20 точек * 20 измерений в р-не 90-200Гц--›11 111-5 000 мкс шаг неважен
затем просканировать диапазон 400-2000Гц - 2500-500 мкс - вот тут мне нужна приличная точность и разница между 500 и 501мкс уже 4 Гц - не айс, а найденная частота мне нужна для определенных выводов
таким образом delay_us() мне подойдет только для первых двух случаев, при поиске нужной частоты не катит....
а можно алгоритм DDS или Си код? асм ковырять не очень наглядно, хотя в свое время писал для с51 только на нем, да по 60 страниц ![Улыбка](images/smilies/icon_smile.gif)
в примере у него 8 регистров, суммирование с учетом переноса и Z, и т.д. и т.п. тяжеловато в голове разворачивать ![Улыбка](images/smilies/icon_smile.gif)
да и писать я буду на си, т.к. мне нужны библиотеки sin, cos, atan, LCD, d18s20...
писать на асме не буду, слишком заморочно.
второй контроллер как генератор частоты можно поставить atiny со связью с основным контроллером через uart, но это удорожание схемы....меги16 должно хватить на все это
мне синус нужно будет делать очень хороший и с определенной амплитудой и Umin›8V & Umax‹18V, поэтому я буду использовать внешнюю схему
|
|
|
|
20.02.2010, 21:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Регулировка частоты на контроллере
Сообщение от spballiance
|
а можно алгоритм DDS
|
Алгоритм расписан в начале статьи Ридико. Там всего две переменных - накопитель фазы и приращение фазы. Первая определяет мгновенную фазу, а вторая приращение фазы между выборками. У Ридико исходник несколько перегружен, он экономил флеш и храни только четверть таблицы синуса. Если хранить полную таблицу, то программа становится очень простой. Если таблица из 256 значений, то старший байт мгновенной фазы - индекс в этой таблице.
Сообщение от spballiance
|
второй контроллер как генератор частоты можно поставить atiny со связью с основным контроллером через uart, но это удорожание схемы....меги16 должно хватить на все это
|
Меги на генерацию хватит, но вот загружена она будет процентов на 80. Хватит ли остатка на все остальное?
Сообщение от spballiance
|
поэтому я буду использовать внешнюю схему
|
Что Вы подразумеваете под "внешней схемой"? Внешний DDS или усилитель с фильтром? Второе в любом случае обязательно должно быть.
|
|
|
|
20.02.2010, 22:22
|
|
Вид на жительство
Регистрация: 13.02.2010
Сообщений: 372
Сказал спасибо: 12
Сказали Спасибо 15 раз(а) в 12 сообщении(ях)
|
Re: Регулировка частоты на контроллере
Сообщение от kison
|
У Ридико исходник несколько перегружен, он экономил флеш и храни только четверть таблицы синуса.
|
он изящен, но не прозрачен
Цитата:
|
Меги на генерацию хватит, но вот загружена она будет процентов на 80. Хватит ли остатка на все остальное?
|
в режиме генерации она будет обрабатывать прерывания по АЦП и собирать массив данных. все преобразования будут потом, когда генерация отключена. но я еще пока не решил. нужно все взвесить.
возможно обработка АЦП будет слишком размазывать точность генерации
Цитата:
|
Что Вы подразумеваете под "внешней схемой"? Внешний DDS или усилитель с фильтром? Второе в любом случае обязательно должно быть.
|
второе.
|
|
|
|
20.02.2010, 22:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Регулировка частоты на контроллере
Сообщение от spballiance
|
он изящен, но не прозрачен
|
Ну если отбросить фокусы с экономией флеши:
Код:
|
uint32_t AccFz; // мгновенная фаза
uint32_t AddFz; // приращение фазы
#define DAC PORTB
uint8_t SinTbl[256] = {xx,xx,xx... // таблица значений для синуса
ISR(TIMER1_COMPA_vect) // вектор по совпадению OCR1A таймера 1
{
AccFz += AddFz;
DAC = SinTbl[AccFz ›› 24];
} |
Вот и весь алгоритм
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:12.
|
|