Страница 1 из 1
Увеличение частоты синусоиды на AVR
Добавлено: Сб фев 27, 2010 18:18:47
Insase
Всем привет. У меня такая задачка.
На Atmega 16 получил синусоиду, используя R-2R.
Теперь необходимо, например, раз в секунду увеличивать частоту сигнала на 100 Hz и так от 0 до 10KHz.
С таймерами дела у меня обстоят плохо, помогите реализовать это на CVAVR.
Добавлено: Сб фев 27, 2010 21:12:37
Aheir
А как синусоида получается?
Добавлено: Сб фев 27, 2010 21:26:53
Insase
Есть массив wave[256]. Для каждого элемента массива записан свой байт (значение для порта). Перебором от 0 до 255 мы получаем период синусоиды.
char wave[256] = {0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae... и т.д.
Добавлено: Вс фев 28, 2010 12:35:08
Engineer_Keen
Ну так перебирайте массив быстрее! А каким образом происходит акт обращения к массиву? Если тупо в цикле, тогда поможет только перескакивание через значения. Если по таймеру, то или изменение делителя (грубо - 8, 64 и т.д.) или использование прерывания по сравнению таймера со спец регистрами А или В (плавно 0-255)
Добавлено: Вс фев 28, 2010 15:56:00
Insase
да надо использовать таймер, но у меня не получается разобраться с ними.
Добавлено: Вс фев 28, 2010 21:22:42
Aheir
Ну так тогда и спрашивайте о настройке таймера, а не о выводе синуса.
Тем по таймерам навалом, спрашивайте там.
Добавлено: Пн мар 01, 2010 01:22:34
NiTr0
Insase писал(а):Есть массив wave[256]

Как все запущено...
Если хочется уж табличный синтез - то таблички на 64 значения хватит, ибо нефиг дублировать то, то можно высчитать элементарными арифметическими операциями, а если с интерполяцией промежуточных (что для R-2R 5% точности вполне прокатит без ухудшения параметров выходного сигнала) - и того меньше можно урезать, до 16-32 байт...
Добавлено: Пн мар 01, 2010 09:50:35
Insase
С таймерами разобрался, wave[256] - это просто для примера пока взял массив.
Получается такая вот штука:
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
k++;
if (k>=freq){
n++;
k=0;
if (n>255) {
n = 0;
freq+=10;
}
PORTC = wave[n];
}
}
Поставив таймер на максимальную частоту получаем, что такт происходит с частотой Foc=16Mhz/2*(1+1), т.е. 4Mhz.
Берем freq=1, каждое значение выплевывается через 0,25мкс
Значит частота выплевывания точки = 4 МГц, а частота выплевывания периода синуса 4МГц/256=15625Гц
Дальше берем f=2, период уже 0,5мкс и частота выплевывания одной точки - 2 мгц.
Значит период синуса в 2 раза меньше, т.е. 7кгц.
Как менять частоту синуса линейно?
Добавлено: Пн мар 01, 2010 19:43:09
Aheir
Неверно ставите вопрос. В этой ситуации частота у Вас тоже изменяется линейно (через две точки - чем не линия?). Правильный вопрос: как обеспечить шаг (дискрет) изменения частоты в хх Гц, где хх - известное и нужное только Вам значение.
Добавлено: Вт мар 02, 2010 22:40:37
12val12
âàì íóæíà òîëüêî ñèíóñîèäà è òîëüêî äî 15 êÃö?
Добавлено: Вт мар 02, 2010 22:46:32
NiTr0
Insase писал(а):Как менять частоту синуса линейно?
При частотах от 4 МГц - только задержками в теле основного цикла программы.
Добавлено: Чт мар 04, 2010 14:08:30
Insase
12val12 писал(а):вам нужна только синусоида и только до 15 кГц?
синусойда, ну хотя бы до 4KHz уже.
Добавлено: Чт мар 04, 2010 14:17:35
Insase
В общем, решили завязать с этой идеей, и просто генерировать сигнал с помощью AD9833.
Добавлено: Чт мар 04, 2010 16:57:11
Neekeetos
Insase писал(а):В общем, решили завязать с этой идеей, и просто генерировать сигнал с помощью AD9833.
Ну какая ирония. А что помешало сделать программный DDS раз уж частота до 4к всего? В тырнете полно примеров.
Добавлено: Чт мар 04, 2010 17:31:57
Twilo
наверное то, что никто готовой прошивки с исходником не предоставил
Добавлено: Чт мар 04, 2010 22:30:22
12val12
à ïî÷åìó Øèì íå èñïîëüçîâàòü
âåäü ÷àñòîòà øèì áóäåò 16Ìãö/256= 62 500 Ãö
òðåìÿ Rc öåïî÷êàìè îíà îòôèëüòðóåòñÿ â 210 ðàç
(ïðè ìàêñèìàëíîé òðåáóåìîé 10êÃö)