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

 
 
> генерация частот
Митя
сообщение Sep 10 2010, 15:36
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 15-08-07
Пользователь №: 29 802



Нужно сформировать на 6 ножках
прямоугольники с частотами
349 370 415 440 494 523 Гц.
как это можно сделать на тине или меге небольшой?
Как можно достичь большей точности?
Больше ничем процу можно не заниматься.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
=GM=
сообщение Sep 10 2010, 16:31
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Шесть программных ШИМ плюс шесть фильтров плюс шесть компараторов


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
adc
сообщение Sep 11 2010, 05:49
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



Самый простой способ без премудростей, как сказал ув. =GM=, это программные шим.
Можно сделать таблицу из 1000 значений и выплевывать в порт. с частой 1000Гц.
Если нужно шаг 0.5 Гц то 2000 значений и 2кГц.
Важно правильно посчитать делители тактирования контроллера чтобы получить точно 1кГц.

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

Сообщение отредактировал adc - Sep 11 2010, 05:55
Go to the top of the page
 
+Quote Post
Grechko
сообщение Sep 11 2010, 07:34
Сообщение #4





Группа: Участник
Сообщений: 12
Регистрация: 16-06-08
Пользователь №: 38 329



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

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

Будет большой Джиттер http://ru.wikipedia.org/wiki/Джиттер
частоту надо брать намного больше
Go to the top of the page
 
+Quote Post
adc
сообщение Sep 11 2010, 13:44
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836



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

Вопрос в том что вопрошающему наверное требуется меандр.
А по поводу джитера несогласен.. Откуда он возьмется если тупо читаем данные и посылаем их в порт. Да хоть в цикле можно выкидывать, только посчитать тики надо. А можно и по таймеру... Тут вообще все в порядке..
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 12 2010, 10:05
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Посмотри ATmega32/64M1, там есть Power Stage Controller, я, правда толком не понял что это такое, но мне кажется это как раз то, что тебе надо. Заодно и нам расскажешь. smile.gif
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 12 2010, 10:17
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(777777 @ Sep 12 2010, 14:05) *
Посмотри ATmega32/64M1, там есть Power Stage Controller, я, правда толком не понял что это такое, но мне кажется это как раз то, что тебе надо. Заодно и нам расскажешь. smile.gif


Его уже запустили в производство?
А то в связи с последними обсуждениями Атмела на форуме может возникнуть впечатление, что никогда уже и не запустят.
PSC есть и в AT90PWM2/3/ На 64 мегагерцах тактовой вполне себе работает.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Sep 12 2010, 10:36
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



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

Джиттера не было бы, если бы требуемые частоты можно было бы получить целочисленным делением какого-то одного значения. Увеличивая частоту дискретизации, джиттер можно уменьшить. Иначе только переводом в синус, фильтрацией и последующим превращением в прямоугольник. Если джиттер не столь критичен, то самое простое - шесть программно-реализованных DDS и минимальная длительность цикла (т.е. максимальная частота дискретизации), все строго на регистрах...
Go to the top of the page
 
+Quote Post
Митя
сообщение Sep 12 2010, 16:12
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 15-08-07
Пользователь №: 29 802



>Шесть программных ШИМ плюс шесть фильтров плюс шесть компараторов
Что-то сложновато, хотелось-бы одним процессором обойтись.

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

> Джиттера не было бы, если бы требуемые частоты можно было бы получить целочисленным делением какого-то одного значения.
к сожалению частоты такие, "не хорошие" smile.gif

Сообщение отредактировал Митя - Sep 12 2010, 16:13
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 12 2010, 16:51
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(Митя @ Sep 12 2010, 20:12) *
к сожалению частоты такие, "не хорошие" smile.gif


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

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


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
SAWushka
сообщение Sep 12 2010, 19:58
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 67
Регистрация: 1-12-07
Пользователь №: 32 868



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);
            }
    }
}
Go to the top of the page
 
+Quote Post
777777
сообщение Sep 13 2010, 03:57
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Oldring @ Sep 12 2010, 14:17) *
Его уже запустили в производство?
А то в связи с последними обсуждениями Атмела на форуме может возникнуть впечатление, что никогда уже и не запустят.

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

А его еще не сняли с производства? smile.gif
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 13 2010, 08:34
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



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


Точно! Появились уже по 5 баксов в розницу на буржуйских складах. А я и не заметил smile.gif


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 13 2010, 14:47
Сообщение #14


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Митя @ Sep 12 2010, 15:12) *
Что-то сложновато, хотелось бы одним процессором обойтись

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

Интересно, зачем вам меандры первой октавы, рояль настраивать?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Митя
сообщение Sep 19 2010, 07:25
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 15-08-07
Пользователь №: 29 802



Спасибо за пример! Попробую в этом направлении

Боюсь если по такому генератору настроить рояль, настройщика такого побьют smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 03:14
Рейтинг@Mail.ru


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