|
|
  |
Низкочастотный синусоидальный генератор с шагом сетки 0,01 Гц, требуется помощь |
|
|
|
May 18 2007, 19:12
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
По ссылке http://www.telesys.ru/electronics/projects.php?do=p035или http://www.platan.ru/shem/pdf/sin.pdfможно найти описание интересного генератора. Давно хотел сделать нечто подобное. Да и нужен такой прибор, только со своими "закидонами". Проблема вот в чем. Там приведен текст программы-обработчика прерыаний таймера. Я не специалист в АСМ. Частота генерации меняется путем изменения количества прерываний таймера за секунду или как это реализовано программно? Хочу повторить генератор, но ЛСД взять буквенно-цифровой, ОУ другие, ЦАП тоже посовременней... Нужна помощь разобраться с обработчиком прерываний. В статье замечено, что все четыре ветки должны иметь одинаковое время выполнения... с этим у меня неясность. Как управлять частотой, применяя тот обработчик прерываний и ту таблицу Sin? Хотелось бы уточнить. МК предлагается Mega8. Я думаю, что пользовательскую часть каждый напишет под себя как кому нужно. Я вот пишу на Си в CVAVR. Мне бы подстыковать обработчик прерываний на АСМ в текст программы на Си...
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 18 2007, 19:26
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(smk @ May 18 2007, 22:12)  По ссылке http://www.telesys.ru/electronics/projects.php?do=p035или http://www.platan.ru/shem/pdf/sin.pdfможно найти описание интересного генератора. Давно хотел сделать нечто подобное. Да и нужен такой прибор, только со своими "закидонами". (Бурча) Тоже мне, интерес... Тема моего дипломного проекта несколько десятилетий назад. Только тогда все работало не на микроконтролере, а на реверсивных счетчиках, триггерах и дешифраторах. А принцип вычисления синуса тот же - прибавляй/убавляй. И никакого С тогда не было. Сорри за оффтоп, но CV не работаю, а объединение ASM и C - компиляторо-зависимое.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
May 18 2007, 19:36
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(smk @ May 18 2007, 21:12)  Я вот пишу на Си в CVAVR. Мне бы подстыковать обработчик прерываний на АСМ в текст программы на Си... Поверьте, проще будет выучить asm. Цитата МК предлагается Mega8. Возможно тут будет целесообразно применить 2 МК. Один простой - напр. Tiny2313 - для выполнения основной задачи - генерации сигнала требуемой частоты, с прошивкой написанной полностью на asm. Второй - управляющий (любой какой вам нравится) для обслуживания экранчика, клавиатуры (если будет) и т.п. с программой на C.
|
|
|
|
|
May 18 2007, 19:40
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(smk @ May 18 2007, 23:12)  По ссылке http://www.telesys.ru/electronics/projects.php?do=p035или http://www.platan.ru/shem/pdf/sin.pdfможно найти описание интересного генератора. Давно хотел сделать нечто подобное. Да и нужен такой прибор, только со своими "закидонами". Проблема вот в чем. Там приведен текст программы-обработчика прерыаний таймера. Я не специалист в АСМ. Частота генерации меняется путем изменения количества прерываний таймера за секунду или как это реализовано программно? Хочу повторить генератор, но ЛСД взять буквенно-цифровой, ОУ другие, ЦАП тоже посовременней... Нужна помощь разобраться с обработчиком прерываний. В статье замечено, что все четыре ветки должны иметь одинаковое время выполнения... с этим у меня неясность. Как управлять частотой, применяя тот обработчик прерываний и ту таблицу Sin? Тогда (если нужно по-современее) и не надо извращаться - берется готовый чип DDS от AD (всякие там AD98xx, а для высоких частот - 99xx), и любым контроллером обслуживается. А программный DDS и обслуживание DAC через прерывания - это очень медленно, и верхняя граница неприлично низкая. Есть решение с куда большим быстродействием (9 тактов на итерацию), но в этом случае при смене рабочей частоты происходит прерывание генерации. Зато - с минимальными трудозатратами помещается в 2313, причем не только синус, но и пила, и треугольник, меандр (но на меандр это похоже лишь при большом оверсемплинге) и белый шум. При тактовой 20 MHz более-менее приличный синус получается до 400-500 kHz.
|
|
|
|
|
May 18 2007, 20:20
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата берется готовый чип DDS от AD очень дорого, однако... Цитата Поверьте, проще будет выучить asm. когда-нибудь выучу. обязательно. а сейчас прошу помочь с проблемой. Цитата Только тогда все работало не на микроконтролере, а на реверсивных счетчиках, триггерах и дешифраторах. Ну да. Наверняка и ПЗУ было с кодовой таблицей... Ностальгия - хорошо, но помощь лучше.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 18 2007, 20:33
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(smk @ May 18 2007, 21:57)  когда-нибудь выучу. обязательно. Если начать прямо сегодня, то думаю уже в это воскресенье можно написать helloworld.. через неделю без сомнения можно более-менее плавать в асм. Цитата Нужна помощь разобраться с обработчиком прерываний. В статье замечено, что все четыре ветки должны иметь одинаковое время выполнения... с этим у меня неясность. Как управлять частотой, применяя тот обработчик прерываний и ту таблицу Sin? Читать всю статью накладно, может быть конкретизируете вопрос? Какие ветки? Может быть начать с вопроса - как сделать генератор импульсов с регулируемой частотой следования? Отвлеченно о задаче. Можно пойти двумя путями. 1. Постоянная частота дискретизации + формирование требуемой формы и частоты сигнала математически. 2. Постоянная (таблично заданная) форма сигнала + изменяемая частота дискретизации. Каким путем собрались идти Вы?
|
|
|
|
|
May 18 2007, 20:55
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Мне нужно: 1) генерацию синусоиды в диапазон от 1 Гц до 35 кГц (хотябы) 2) возможность автоматической генерации с запрограммированным шагом в заданном диапазоне. 3) плавное и равномерное + логарифмическое изменение частоты в заданном диапазоне за заданное время. Если еще и линейно нарастающее одновременно генерить чтоб разверткой осцилографа управлять - вааще хорошо.
ну это так, в кратце. проект тем и хорош, что я могу его в любой момент переделать для конкретной задачи измереня.
Текст обработчика прерывания приведен ниже: Sum: in tsreg,SREG ;Save status register add PhaseK,FreqK ;Phase(0..31)=Phase(0..31)+Freq(0..31) adc PhaseL,FreqL adc PhaseM,FreqM adc PhaseN,FreqN mov ZL,PhaseM ;ZL < Phase(16..23) mov ZH,PhaseN ;ZH < Phase(24..31) sbrc PhaseN,2 com ZL ;ZL=!ZL if Phase.26==1 sbrc PhaseN,2 com ZH ;ZH=!ZH if Phase.26==1 andi ZH,0x03 ;Table address is 10 bit width ori ZH,0x04 ;Table base is 0x0400 (0x200*2) lpm ;r0 < table[Z] sbrc PhaseN,3 rjmp ph_ab ;jump if Phase.27==1 ph_cd: com r0 ;r0=!r0 cbi PORTD,MSB ;To minimize glitch, clear DAC.9, out PORTB,r0 ;and then setup DAC.1 — DAC.8 out SREG,tsreg ;Restore status register reti ph_ab: out PORTB,r0 ;To minimize glitch, setup DAC.1 — DAC.8, sbi PORTD,MSB ;and then set DAC.9 out SREG,tsreg ;Restore status register reti
В разных четвертях периода синуса выполнение обработчи ка прерывания происходит по различным веткам. Очень важно при этом обеспечить равное время выполнения каждой ветки. Поскольку в системе используется только одно прерывание, оказалось возможным расположить обработчик начиная с адреса вектора.
вместо квадратиков должны быть минусы.
mov ZL,PhaseM ;ZL <- Phase(16..23) mov ZH,PhaseN ;ZH <- Phase(24..31)
lpm ;r0 <- table[Z]
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
May 18 2007, 21:30
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(smk @ May 18 2007, 22:55)  Мне нужно: 1) генерацию синусоиды в диапазон от 1 Гц до 35 кГц (хотябы) 2) возможность автоматической генерации с запрограммированным шагом в заданном диапазоне. Шаг 0.1Гц? Цитата В разных четвертях периода синуса выполнение обработчи ка прерывания происходит по различным веткам. Очень важно при этом обеспечить равное время выполнения каждой ветки. Попадая в обработчик прерывания там есть некое подобие: <вход в обработчик> switch( <Квадрант > ) { case 0 ... case 1 ... case 2 ... case 3 ... } <выдача результата в DAC> так вот важно чтобы время выполнения от входа в обработчик до выдачи результата было всегда одинаковым (ни тактом больше ни тактом меньше) вне зависимости от case'a. Цитата Поскольку в системе используется только одно прерывание, оказалось возможным расположить обработчик начиная с адреса вектора. На C это реализовать, увы, нельзя. На Cи вы можете пойти другим путем, и получить ту же функциональность. Надо только поменять алгоритм обработчика прерывания: <вход в обработчик> static nexdactval = 0; <DAC = nextdacval> switch( <квадрант> { case 0: nextdacval = .... case 1: .... case 2: .... case 3: .... } Где уже можно не заботиться о равной длительности case'ов
|
|
|
|
|
May 18 2007, 23:05
|
Местный
  
Группа: Свой
Сообщений: 200
Регистрация: 10-04-06
Из: Украина,Запорожье
Пользователь №: 15 979

|
Вот моя "вариация на тему". Может пригодится. Мега8 на 20 МГц, ЦАП - R2-R, индикатор TI8148(вроде бы). Синусоида,пила,треугольник,меандр.Дискретность 0.01Гц. остальное содрано с телесистем. Файлы проекта
Эскизы прикрепленных изображений
Прикрепленные файлы
miniDDS.rar ( 133.5 килобайт )
Кол-во скачиваний: 148
TI8148.pdf ( 289.84 килобайт )
Кол-во скачиваний: 135
|
|
|
|
|
May 19 2007, 11:46
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(muravei @ May 19 2007, 08:27)  А кто как думает: если вместо ЦАПа(из статьи) применить ШИМ тини26 , искажения сильно "пострадают"? Учитывая "35кГц хотя бы" в посте выше - искажения не пострадают вообще. Они себя будут чувствовать вольготно, расти и шириться с ростом частоты.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|