Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: генерация частот
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Митя
Нужно сформировать на 6 ножках
прямоугольники с частотами
349 370 415 440 494 523 Гц.
как это можно сделать на тине или меге небольшой?
Как можно достичь большей точности?
Больше ничем процу можно не заниматься.
=GM=
Шесть программных ШИМ плюс шесть фильтров плюс шесть компараторов
adc
Самый простой способ без премудростей, как сказал ув. =GM=, это программные шим.
Можно сделать таблицу из 1000 значений и выплевывать в порт. с частой 1000Гц.
Если нужно шаг 0.5 Гц то 2000 значений и 2кГц.
Важно правильно посчитать делители тактирования контроллера чтобы получить точно 1кГц.

Упс, поспешил.. Вам наверное меандр подавай?
Grechko
Цитата(adc @ Sep 11 2010, 08:49) *
Самый простой способ без премудростей, как сказал ув. =GM=, это программные шим.
Можно сделать таблицу из 1000 значений и выплевывать в порт. с частой 1000Гц.
Если нужно шаг 0.5 Гц то 2000 значений и 2кГц.
Важно правильно посчитать делители тактирования контроллера чтобы получить точно 1кГц.

Упс, поспешил.. Вам наверное меандр подавай?

Будет большой Джиттер http://ru.wikipedia.org/wiki/Джиттер
частоту надо брать намного больше
adc
Цитата(Grechko @ Sep 11 2010, 11:34) *
Будет большой Джиттер http://ru.wikipedia.org/wiki/Джиттер
частоту надо брать намного больше

Вопрос в том что вопрошающему наверное требуется меандр.
А по поводу джитера несогласен.. Откуда он возьмется если тупо читаем данные и посылаем их в порт. Да хоть в цикле можно выкидывать, только посчитать тики надо. А можно и по таймеру... Тут вообще все в порядке..
777777
Посмотри ATmega32/64M1, там есть Power Stage Controller, я, правда толком не понял что это такое, но мне кажется это как раз то, что тебе надо. Заодно и нам расскажешь. smile.gif
Oldring
Цитата(777777 @ Sep 12 2010, 14:05) *
Посмотри ATmega32/64M1, там есть Power Stage Controller, я, правда толком не понял что это такое, но мне кажется это как раз то, что тебе надо. Заодно и нам расскажешь. smile.gif


Его уже запустили в производство?
А то в связи с последними обсуждениями Атмела на форуме может возникнуть впечатление, что никогда уже и не запустят.
PSC есть и в AT90PWM2/3/ На 64 мегагерцах тактовой вполне себе работает.
rx3apf
Цитата(adc @ Sep 11 2010, 17:44) *
Вопрос в том что вопрошающему наверное требуется меандр.
А по поводу джитера несогласен.. Откуда он возьмется если тупо читаем данные и посылаем их в порт. Да хоть в цикле можно выкидывать, только посчитать тики надо. А можно и по таймеру... Тут вообще все в порядке..

Джиттера не было бы, если бы требуемые частоты можно было бы получить целочисленным делением какого-то одного значения. Увеличивая частоту дискретизации, джиттер можно уменьшить. Иначе только переводом в синус, фильтрацией и последующим превращением в прямоугольник. Если джиттер не столь критичен, то самое простое - шесть программно-реализованных DDS и минимальная длительность цикла (т.е. максимальная частота дискретизации), все строго на регистрах...
Митя
>Шесть программных ШИМ плюс шесть фильтров плюс шесть компараторов
Что-то сложновато, хотелось-бы одним процессором обойтись.

>Вопрос в том что вопрошающему наверное требуется меандр.
Ну да, я же написал "-Прямоугольники на 6 ножках"
6 меандров и нужно.

> Джиттера не было бы, если бы требуемые частоты можно было бы получить целочисленным делением какого-то одного значения.
к сожалению частоты такие, "не хорошие" smile.gif
Oldring
Цитата(Митя @ Sep 12 2010, 20:12) *
к сожалению частоты такие, "не хорошие" smile.gif


Генератор на 60919532519560 герц с последующим делителем частоты - идеальное решение вашей задачи. biggrin.gif

Какие требования по точности и по джиттеру? 15-битной точности с "обычным" для цифровых схем джиттером достаточно? Поставьте AVR, работающий на 16 мегагерцах, и заиспользуйте 16-битный таймер для формирования частоты.
SAWushka
1111493779.gif

Как то так, отставать будет на десяток - другой циклов, считать лень. Частота будет довольно точная, к примеру для кварца 20МГц, и без всяких предделителей 349Гц превратится в 349.0036 Гц, и небольшое запаздывание, в пределах пары микросекунд.
Код для Tiny2313. Частоты могут быть разными, очень разными. В разумных пределах конечно.

Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define INV_B(x) ^=(1<<x)
#define SET_B(x) |= (1<<x)
#define BitIsClear(reg, bit) ((reg & (1<<bit)) == 0)

#define F 20000000

#define f1 550
#define f2 560
#define f3 570
#define f4 580
#define f5 590
#define f6 600

#define n1 (F/(2*f1))
#define n2 (F/(2*f2))
#define n3 (F/(2*f3))
#define n4 (F/(2*f4))
#define n5 (F/(2*f5))
#define n6 (F/(2*f6))

volatile unsigned char overflow;
volatile unsigned int N1,N2,N3,N4,N5,N6;


///////////////////////////////////////////
/////////     ISR TIMER0_OVF   ////////
///////////////////////////////////////////
ISR (TIMER1_OVF_vect)
{
    overflow =0;
    
    if (N1>n1)
        {
        PORTB INV_B(1);                    
        N1=N1+n1;                        
        }

    if (N2>n2)
        {
        PORTB INV_B(2);                    
        N2=N2+n1;                        
        }

    if (N3>n3)
        {
        PORTB INV_B(3);                    
        N3=N3+n3;                        
        }

    if (N4>n4)
        {
        PORTB INV_B(4);                    
        N4=N4+n4;                        
        }

    if (N5>n5)
        {
        PORTB INV_B(5);                    
        N5=N5+n5;                        
        }

    if (N6>n6)
        {
        PORTB INV_B(6);                    
        N6=N6+n6;                        
        }
}


///////////////////////////////////////////
/////////          MAIN      ////////
///////////////////////////////////////////

int main(void)
{    

    overflow = 0;
    N1=n1; N2=n2; N3=n3; N4=n4; N5=n5; N6=n6;
    
    TCCR1B = (0<<CS12)|(0<<CS11)|(1<<CS10);    
    TIMSK = (1<<TOIE1);
    sei();

    while (1)
    {
        
            ////// 1  /////
        if ((TCNT1>=N1)&(BitIsClear(overflow,1)))
            {
                PORTB INV_B(1);                    
                N1=N1+n1;                        
                if (N1<n1) overflow SET_B(1);    
            }                                    
    
            ////// 2  /////
        if ((TCNT1>=N2)&(BitIsClear(overflow,2)))
            {
                PORTB INV_B(2);
                N2=N2+n2;
                if (N2<n2) overflow SET_B(2);
            }

            ////// 3  /////
        if ((TCNT1>=N3)&(BitIsClear(overflow,3)))
            {
                PORTB INV_B(3);
                N3=N3+n3;
                if (N3<n3) overflow SET_B(3);
            }

            ////// 4  /////
        if ((TCNT1>=N4)&(BitIsClear(overflow,4)))
            {
                PORTB INV_B(4);
                N4=N4+n4;
                if (N4<n4) overflow SET_B(4);
            }

            ////// 5  /////
        if ((TCNT1>=N5)&(BitIsClear(overflow,5)))
            {
                PORTB INV_B(5);
                N5=N5+n5;
                if (N5<n5) overflow SET_B(5);
            }

            ////// 6  /////
        if ((TCNT1>=N6)&(BitIsClear(overflow,6)))
            {
                PORTB INV_B(6);
                N6=N6+n6;
                if (N6<n6) overflow SET_B(6);
            }
    }
}
777777
Цитата(Oldring @ Sep 12 2010, 14:17) *
Его уже запустили в производство?
А то в связи с последними обсуждениями Атмела на форуме может возникнуть впечатление, что никогда уже и не запустят.

При чем тут производство? Разумеется, его запустили уже давно, проблема только с доставанием, которая, как объясняют (врут наверное), вызвана кризисом и новым таможенным кодеском. Но тем не менее наши снабженцы нашли у какого-то поставшика разумное количество (не 2000 шт. как у остальных).
Цитата(Oldring @ Sep 12 2010, 14:17) *
PSC есть и в AT90PWM2/3/ На 64 мегагерцах тактовой вполне себе работает.

А его еще не сняли с производства? smile.gif
Oldring
Цитата(777777 @ Sep 13 2010, 07:57) *
При чем тут производство? Разумеется, его запустили уже давно, проблема только с доставанием, которая, как объясняют (врут наверное), вызвана кризисом и новым таможенным кодеском. Но тем не менее наши снабженцы нашли у какого-то поставшика разумное количество (не 2000 шт. как у остальных).


Точно! Появились уже по 5 баксов в розницу на буржуйских складах. А я и не заметил smile.gif
=GM=
Цитата(Митя @ Sep 12 2010, 15:12) *
Что-то сложновато, хотелось бы одним процессором обойтись

Пришла в голову мысль сделать фрагмент подобный программному DDS на 6 каналов, но без формирования синуса. Если писать на асме, то цикл составит 50 тактов, т.е. легко получится 400 квыборок/с и точность для частот порядка 0.1%.

Интересно, зачем вам меандры первой октавы, рояль настраивать?
Митя
Спасибо за пример! Попробую в этом направлении

Боюсь если по такому генератору настроить рояль, настройщика такого побьют smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.