Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Низкочастотный синусоидальный генератор с шагом сетки 0,01 Гц
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
smk
По ссылке

http://www.telesys.ru/electronics/projects.php?do=p035

или

http://www.platan.ru/shem/pdf/sin.pdf

можно найти описание интересного генератора. Давно хотел сделать нечто подобное. Да и нужен такой прибор, только со своими "закидонами".

Проблема вот в чем. Там приведен текст программы-обработчика прерыаний таймера. Я не специалист в АСМ. Частота генерации меняется путем изменения количества прерываний таймера за секунду или как это реализовано программно? Хочу повторить генератор, но ЛСД взять буквенно-цифровой, ОУ другие, ЦАП тоже посовременней...

Нужна помощь разобраться с обработчиком прерываний. В статье замечено, что все четыре ветки должны иметь одинаковое время выполнения... с этим у меня неясность. Как управлять частотой, применяя тот обработчик прерываний и ту таблицу Sin?

Хотелось бы уточнить. МК предлагается Mega8. Я думаю, что пользовательскую часть каждый напишет под себя как кому нужно. Я вот пишу на Си в CVAVR. Мне бы подстыковать обработчик прерываний на АСМ в текст программы на Си...
Dog Pawlowa
Цитата(smk @ May 18 2007, 22:12) *
По ссылке
http://www.telesys.ru/electronics/projects.php?do=p035
или
http://www.platan.ru/shem/pdf/sin.pdf

можно найти описание интересного генератора. Давно хотел сделать нечто подобное. Да и нужен такой прибор, только со своими "закидонами".

(Бурча) Тоже мне, интерес... Тема моего дипломного проекта несколько десятилетий назад. Только тогда все работало не на микроконтролере, а на реверсивных счетчиках, триггерах и дешифраторах. А принцип вычисления синуса тот же - прибавляй/убавляй.
И никакого С тогда не было. biggrin.gif
Сорри за оффтоп, но CV не работаю, а объединение ASM и C - компиляторо-зависимое.
defunct
Цитата(smk @ May 18 2007, 21:12) *
Я вот пишу на Си в CVAVR. Мне бы подстыковать обработчик прерываний на АСМ в текст программы на Си...

Поверьте, проще будет выучить asm.

Цитата
МК предлагается Mega8.

Возможно тут будет целесообразно применить 2 МК.
Один простой - напр. Tiny2313 - для выполнения основной задачи - генерации сигнала требуемой частоты, с прошивкой написанной полностью на asm. Второй - управляющий (любой какой вам нравится) для обслуживания экранчика, клавиатуры (если будет) и т.п. с программой на C.
rx3apf
Цитата(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.
smk
Цитата
берется готовый чип DDS от AD

очень дорого, однако...

Цитата
Поверьте, проще будет выучить asm.

когда-нибудь выучу. обязательно. а сейчас прошу помочь с проблемой.

Цитата
Только тогда все работало не на микроконтролере, а на реверсивных счетчиках, триггерах и дешифраторах.


Ну да. Наверняка и ПЗУ было с кодовой таблицей...

Ностальгия - хорошо, но помощь лучше.
defunct
Цитата(smk @ May 18 2007, 21:57) *
когда-нибудь выучу. обязательно.

Если начать прямо сегодня, то думаю уже в это воскресенье можно написать helloworld..
через неделю без сомнения можно более-менее плавать в асм.

Цитата
Нужна помощь разобраться с обработчиком прерываний. В статье замечено, что все четыре ветки должны иметь одинаковое время выполнения... с этим у меня неясность. Как управлять частотой, применяя тот обработчик прерываний и ту таблицу Sin?

Читать всю статью накладно, может быть конкретизируете вопрос? Какие ветки?

Может быть начать с вопроса - как сделать генератор импульсов с регулируемой частотой следования?

Отвлеченно о задаче.
Можно пойти двумя путями.
1. Постоянная частота дискретизации + формирование требуемой формы и частоты сигнала математически.
2. Постоянная (таблично заданная) форма сигнала + изменяемая частота дискретизации.

Каким путем собрались идти Вы?
smk
Мне нужно:
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]
defunct
Цитата(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'ов
viael
Вот моя "вариация на тему". Может пригодится.
Мега8 на 20 МГц, ЦАП - R2-R, индикатор TI8148(вроде бы).
Синусоида,пила,треугольник,меандр.Дискретность 0.01Гц.
остальное содрано с телесистем.

Файлы проекта
smk
Цитата
Вот моя "вариация на тему". Может пригодится.


А схемки не сохранилось?
muravei
А кто как думает: если вместо ЦАПа(из статьи) применить ШИМ тини26 , искажения сильно "пострадают"?
ReAl
Цитата(muravei @ May 19 2007, 08:27) *
А кто как думает: если вместо ЦАПа(из статьи) применить ШИМ тини26 , искажения сильно "пострадают"?

Учитывая "35кГц хотя бы" в посте выше - искажения не пострадают вообще. Они себя будут чувствовать вольготно, расти и шириться с ростом частоты.
rx3apf
Цитата(smk @ May 19 2007, 00:20) *
очень дорого, однако...

AD9833 (тактовая частота до 25 MHz) - <$4 (@1000 шт), баксов шесть-семь в розницу.
Это дорого ?
muravei
Цитата(ReAl @ May 19 2007, 15:46) *
Учитывая "35кГц хотя бы" в посте выше - искажения не пострадают вообще. Они себя будут чувствовать вольготно, расти и шириться с ростом частоты.

Как и в обычном ДДС(в том числе и рассматриваемом) Вопрос именно про эту схему
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.