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

 
 
> Низкочастотный синусоидальный генератор с шагом сетки 0,01 Гц, требуется помощь
smk
сообщение May 18 2007, 19:12
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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. Мне бы подстыковать обработчик прерываний на АСМ в текст программы на Си...


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smk
сообщение May 18 2007, 20:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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]


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 18 2007, 21:30
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 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'ов
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 04:06
Рейтинг@Mail.ru


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