Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: генератор с дробным коэфициентом
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
sKWO
Добрый день всем!
Возникла необходимость создания генератора прямоугольных импульсов на микроконтроллере ATtiny2313 на частоту от 307 до 320 килогерц. Кварц на 16 мегагерц.
Может кто знает быстрый алгоритм создания дробного коэфициента генератора?! help.gif
Мой в обработчике прерывания не успевает! А на асме пока не охота писать.
Пример програмной реализации прикрепляю....
_artem_
по листингу смотрели сколько регистров в стек кладет ?
Если ИАР ипользуете м то здесь добрые люди подсказали использовать __raw в перед названием функции прерывания - стек не будет использоваться . Второе выделите регистры под переменные - будет быстрее . Можете индивидуально назначать их.
Затем можете поднять кварц то 20 МГц некоторые делают до 24 МГц на 2313 .

Удачи .


i eto posmotrite :
http://www.myplace.nu/avr/minidds/index.htm
=GM=
Цитата(sKWO @ Jul 26 2007, 11:07) *
Возникла необходимость создания генератора прямоугольных импульсов на микроконтроллере ATtiny2313 на частоту от 307 до 320 килогерц. А на асме пока не охота писать

Идея вашего метода хороша, но на практике плохо реализуема, поскольку в регистре OCR1A будет число 25, то вы можете получить максимум 25 градаций между 600 и 640 кГц.

Вам artem дал хорошую ссылку, абсолютно ваш случай, даже ещё лучше. Дженсен тратит 9 тактов на выдачу одной выборки, а вы можете снизить до 6 тактов, даже не напрягаясь, но на асме.

Код
loop: add      r28,r24     ; 1
      adc      r29,r25     ; 1
      adc      r30,r26     ; 1
      out      portb,r30   ; 1 - bit 7 is а meandre output
      rjmp     loop        ; 2, so 6 cycles in total


Это даст 2666 кГц частоты выдачи выборок, или 4.3 выборки на период для требуемых 620 кГц.

Чуть-чуть напрягшись (опять же на асме!) можете снизить основной цикл до 5 тактов или 5.2 выборки на период для 620 кГц.
sKWO
Цитата(_artem_ @ Jul 26 2007, 15:48) *
по листингу смотрели сколько регистров в стек кладет ?
Если ИАР ипользуете м то здесь добрые люди подсказали использовать __raw в перед названием функции прерывания - стек не будет использоваться . Второе выделите регистры под переменные - будет быстрее . Можете индивидуально назначать их.
Затем можете поднять кварц то 20 МГц некоторые делают до 24 МГц на 2313 .

Удачи .
i eto posmotrite :
http://www.myplace.nu/avr/minidds/index.htm

Спасибо всем!
Артём, посмотрел ссылочку и понял -- жаль раньше ёё не видел, класс.
Я плату развёл и спаял и от своего метода пока постараюсь не отказоваться.
С формированием частоты через порт ... борьба с "нопами" и только ассемблер , чуть накладно. А использовать
ком порт для управления генератором наверное сильно круто особенно в моём положении. Я делаю управление с
кнопок, значения на ЖКИ. Возможно попытаюсь подхватить идею Дженсена и переделать без ком порта.
Помогли написать программу в кодэ визионе а я подправил под ИАР. Можна написать и оптимальнее, но
я там написал для наглядности, правда на ассемблерных вставках.
Чуточку изменил режим работы таймера1 Fast PWM top=OCR1A.
OCR1A -- значение периода частоты по которому работает алгоритм --- количество циклов в
обработчике прерывания возросло !
Выход --- OC1B output: Non-Inv -- полпериода выходной частоты. Правда запись в регистр сравнения OC1B
пока не написал но это аналогично.
кому интересно...прикрепляю
Извините, но у меня вопрос конечно касающийся с тонкостями работы в ИАРе и несовсем по теме:
в кодэ визионе есть переменная величина типа бит в ИАРе нигде не встречал. Неужели нужно создавать битовое поле
для битовых переменных? если да то через структуру или дефайн (так на форуме ПРОТОСС советует)?
и просьба может кто поможет с простыми функциями преобразования шестнацеричного числа в
десятичное и наоборот
Заранее благодарен!!
sKWO
Цитата(=GM= @ Jul 26 2007, 18:42) *
Идея вашего метода хороша, но на практике плохо реализуема, поскольку в регистре OCR1A будет число 25, то вы можете получить максимум 25 градаций между 600 и 640 кГц.

Извините но не совсем Вас понял.
Маленький комментарий программе (алгоритму)
РЕЖИМ Fast PWM top=OCR1A
ВЫХОД OC1B output: Non-Inv
ЧАСТОТА 307 ... 320 Килогерц
ПРЕРЫВАНИЕ по периоду выходной частоты (достигается записью в OCR1A )
ПОЛУПЕРИОД изменение значения OCR1B
МИНУСА узкополосность (хотя можно усложнить алгоритм), джеттер, дребезжание *фазы*
КВАРЦ допустим 24 Мегагерца (за период 320Килогерц 75тактов в обработчике)

работа построена по следующему принципу:
переменная полупериода -- четыре регистра (long int)
старшие два -- реальная часть переменной long int
младшие два -- мнимая часть переменной long int

Вот мнимая часть, старший из младших регистров
0х80 | 0x40 | 0x20 | 0x10 | 0x08 | 0x04 | 0x02 | 0x01
| | | | | | | |
0,5 0,25 0,125 0,0625 0,03125 0,015625 0,0078125 0,00390625


#pragma vector = TIMER1_COMPA_vect
__interrupt void irqHandler(void)
Обнуление старших двух регистров PPperiodTmpH = 0;(правильная работа по цыклу)
суммирование мнимой части (младшие два) а также перезапись старших (старшие два)
запись старших двух регистров в OCR1A
Tmp = OCR1A - OCR1B ;
OCR1B = Tmp;
ВЫХОД

если мнимая часть переполняется (adc суммирование с переносом)--- младший из
старших регистров увеличивается

Так, если седьмой бит в старшем из младших установлен регистров(0х80) то дробный коэфициент равен 0,5
ну и соответственно так дальше.... Думаю не плохо..
_artem_
для десятичной конвертации у атмела есть ассемблерные функции:
http://www.atmel.com/dyn/resources/prod_do...nts/doc0938.pdf
http://www.atmel.com/dyn/resources/prod_documents/AVR204.zip


А битовая переменная это дело вкуса , может ошибаюсь но иар вроде бы ее нет, можете использовать бит филд или байт , вобшем дело вкуса .
Alex_Pol
Цитата(sKWO @ Jul 28 2007, 19:46) *
Спасибо всем!
Я делаю управление с
кнопок, значения на ЖКИ. Возможно попытаюсь подхватить идею Дженсена и переделать без ком порта.
Хотите с кнопками - запросто. Посмотрите здесь. http://sevzirfo.narod.ru/sin.htm
Автор поклонник алгоритм - билдера, исходники у него в этом странном формате. Первую прошивку я в своё время перевёл в более вменяемую форму. Исходник - в аттаче.
=GM=
Цитата(sKWO @ Jul 28 2007, 16:49) *
Извините но не совсем Вас понял

Да и я вас не понимаю. Ну получили вы частоту ШИМ=16000/26=615 кГц, ну изменили скважность шима, ну и что? Частота 615 кГц никуда не делась, надо её фильтровать от требуемой частоты, скажем, 620. А как? Это будет фильтрец размером со стол.
sKWO
Цитата(_artem_ @ Jul 26 2007, 15:48) *
Если ИАР ипользуете м то здесь добрые люди подсказали использовать __raw в перед названием

Артём простите но......
Кстати про __raw есть только в пдф на мср, на авр нет!
Там оно называется или __task или __C_task
__raw
Спасибо всем!!
_artem_
Я тоже raw не нашел, но работает вроде бы . Сравните ассемблерный выход - тогда увидите разницу.
sKWO
Цитата(_artem_ @ Jul 31 2007, 15:16) *
Я тоже raw не нашел, но работает вроде бы . Сравните ассемблерный выход - тогда увидите разницу.

Согласен. Но на версии 3.10 выдаёт ошибку. 4.30А нормально но описания и там нету.
С уважением
Igor26
http://electronix.ru/forum/lofiversion/index.php/t10786.html
Посмотрите, здесь это обсуждалось.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.