|
|
 |
Ответов
(1 - 14)
|
Sep 11 2010, 07:34
|
Группа: Участник
Сообщений: 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/Джиттерчастоту надо брать намного больше
|
|
|
|
|
Sep 11 2010, 13:44
|

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

|
Цитата(Grechko @ Sep 11 2010, 11:34)  Будет большой Джиттер http://ru.wikipedia.org/wiki/Джиттерчастоту надо брать намного больше Вопрос в том что вопрошающему наверное требуется меандр. А по поводу джитера несогласен.. Откуда он возьмется если тупо читаем данные и посылаем их в порт. Да хоть в цикле можно выкидывать, только посчитать тики надо. А можно и по таймеру... Тут вообще все в порядке..
|
|
|
|
|
Sep 12 2010, 16:12
|
Участник

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

|
>Шесть программных ШИМ плюс шесть фильтров плюс шесть компараторов Что-то сложновато, хотелось-бы одним процессором обойтись. >Вопрос в том что вопрошающему наверное требуется меандр. Ну да, я же написал "-Прямоугольники на 6 ножках" 6 меандров и нужно. > Джиттера не было бы, если бы требуемые частоты можно было бы получить целочисленным делением какого-то одного значения. к сожалению частоты такие, "не хорошие"
Сообщение отредактировал Митя - Sep 12 2010, 16:13
|
|
|
|
|
Sep 12 2010, 19:58
|
Участник

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

|
Как то так, отставать будет на десяток - другой циклов, считать лень. Частота будет довольно точная, к примеру для кварца 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); } } }
|
|
|
|
|
Sep 13 2010, 14:47
|

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

|
Цитата(Митя @ Sep 12 2010, 15:12)  Что-то сложновато, хотелось бы одним процессором обойтись Пришла в голову мысль сделать фрагмент подобный программному DDS на 6 каналов, но без формирования синуса. Если писать на асме, то цикл составит 50 тактов, т.е. легко получится 400 квыборок/с и точность для частот порядка 0.1%. Интересно, зачем вам меандры первой октавы, рояль настраивать?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 19 2010, 07:25
|
Участник

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

|
Спасибо за пример! Попробую в этом направлении Боюсь если по такому генератору настроить рояль, настройщика такого побьют
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|