реклама на сайте
подробности

 
 
> генератор с дробным коэфициентом, на ATtiny2313
sKWO
сообщение Jul 26 2007, 12:07
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Добрый день всем!
Возникла необходимость создания генератора прямоугольных импульсов на микроконтроллере ATtiny2313 на частоту от 307 до 320 килогерц. Кварц на 16 мегагерц.
Может кто знает быстрый алгоритм создания дробного коэфициента генератора?! help.gif
Мой в обработчике прерывания не успевает! А на асме пока не охота писать.
Пример програмной реализации прикрепляю....
Прикрепленные файлы
Прикрепленный файл  interrupt.zip ( 35.64 килобайт ) Кол-во скачиваний: 96
 


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_artem_
сообщение Jul 26 2007, 12:48
Сообщение #2


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



по листингу смотрели сколько регистров в стек кладет ?
Если ИАР ипользуете м то здесь добрые люди подсказали использовать __raw в перед названием функции прерывания - стек не будет использоваться . Второе выделите регистры под переменные - будет быстрее . Можете индивидуально назначать их.
Затем можете поднять кварц то 20 МГц некоторые делают до 24 МГц на 2313 .

Удачи .


i eto posmotrite :
http://www.myplace.nu/avr/minidds/index.htm


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 26 2007, 15:42
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(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 кГц.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
sKWO
сообщение Jul 28 2007, 17:49
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(=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
ну и соответственно так дальше.... Думаю не плохо..


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 30 2007, 09:06
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(sKWO @ Jul 28 2007, 16:49) *
Извините но не совсем Вас понял

Да и я вас не понимаю. Ну получили вы частоту ШИМ=16000/26=615 кГц, ну изменили скважность шима, ну и что? Частота 615 кГц никуда не делась, надо её фильтровать от требуемой частоты, скажем, 620. А как? Это будет фильтрец размером со стол.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016