Страница 1 из 2
Гитарный тюнер на AVR : ищу схему
Добавлено: Сб июн 16, 2007 22:25:15
Ra
Собственно сабж. Где то видел схемку гитарного тюнера на 2х тини12L - я вот думаю, можно ли собрать его на одной меге?
Поделитесь соображениями, честно говоря я очень слабо представляю себе прошивку....
На компе, было дело, писал преобразование Фурье, чтоб выделить основную частоту - но что то мне сомнительно, что тот кто делал такой тюнер на тини запихал в него монструозный код преобразования - может быть есть более простой путь?
Заранее благодарен.
P.S. Очень жду ответов, т.к. это именно тот прибор которых хотелось бы собрать - именно потому что нужен, а не просто ради эксперимента..
Добавлено: Сб июн 16, 2007 23:02:38
Negor
Увидел твою темку - самому стало интересно... вот нашёл схемку на at90s2323
http://www.myplace.nu/avr/gtuner/ код на Си
Добавлено: Сб июн 16, 2007 23:11:10
Ra
Огромное спасибо, попробую разобраться.....
Добавлено: Сб июн 16, 2007 23:24:21
Negor
вот сдесь твой единомышленник создал темку и ему отвечают+опсуждение приведённой схемы
http://www.guitar.ru/board/11/theme-33028-1.html
Добавлено: Сб июн 16, 2007 23:43:16
Ra
Тема там давно умерла, последний пост в 2004 году... Так что врядли стоит там задавать вопросы =)
Честно говоря, я не очень понимаю как такой тюнер вообще работает - я в том смысле, что тут не используется ацп, я считал что сигнал с микрофона должен идти на ацп....
Добавлено: Вс июн 17, 2007 00:01:42
Nanobyte
Добавлено: Пн июн 18, 2007 15:57:41
Ra
Народ, еще такой вопрос - купил микрофон вот такой:
http://www.chip-dip.ru/product0/94347354.aspx
А схемы подключения на сайте нет - не подскажете куда там подавать питание? Там два абсолютно идентичных вывода, никаких маркировок. А я так понимаю, что он должен быть подключен к земле, питанию, и входу схемы... (я про вот эту схему:
http://www.myplace.nu/avr/gtuner/gtuner_sch.gif )
Добавлено: Ср июн 20, 2007 03:40:10
Mamonth
При двух выводах, питание подключать просто некуда. Забудь про питание на микрофоне
Добавлено: Вт сен 11, 2007 18:47:48
Ra
Прошу прощения что вновь тему поднимаю, только сейчас руки дошли.... и то, не совсем
2 Mamonth - можно тогда подробнее, как его подключать?
Там например один вывод маркированый, другой - нет - если к питанию не надо, то как тогда?
http://www.myplace.nu/avr/gtuner/gtuner_sch.gif - здесь то разъем на три вывода......
Добавлено: Ср сен 26, 2007 15:46:47
Mamonth
Ну тут три вывода для удобства просто сделаны рядом. Микрофон цепляешь одним концом к ground вторым к input (как правило каким-куда не важно, если микрофон с двумя выводами). Питание подаешь на Vcc (плюс напряжения) и ground или GND что одно и тоже(минус напряжения). +5V Supply сделан для удобства подключения например дополнительного усилителя, если он имеется, как например в трехвыводных микрофонах. Только смотри, бываю микрофоны которые с транзистором внутри (были такие в старых советских магнитофонах) и им хватит 5 вольт за глаза, а бывают с напряжением питания 48 Вольт. Вторые как правило профессиональные, и даже самые дешевые (даже китайская подделка) редко стоят меньше 1000 рублей.
Добавлено: Ср сен 26, 2007 15:53:39
Mamonth
Вообще тюнер этот расчитан на подключение электрогитары напрямую, или у тебя акустика?
Добавлено: Ср сен 26, 2007 16:31:43
Ra
Аккустика. С подключением я уже сам разобрался, спасибо.
Вопрос в другом - как ЭТО работает?
Помогите плз понять - какого вида идет сигнал на ногу контроллера-то?
Я что то не пойму, в каких пределах (вольт) он скачет?
И как вообще этот тюнер работает - для контроллера же все что меньше 2.5 (или сколько там) - это лог 0, а все что больше - лог 1!
Добавлено: Чт сен 27, 2007 02:54:31
Mamonth
На резисторах R1-R2 собран делитель напряжения задающий рабочую точку транзистора VT1. Не уверен, но получается усилитель класса B, т.е. каждая полуволна усиливается своим транзистором. Резистор R3 - создает подтяжку и ограничивает ток через транзистор, в таком случае на вход контроллера приходят импульсы похожие на половинки синуса, дальше стоит таймер (и по переполнению обрабатывается).
Вот здесь:
Код: Выделить всё
while (bit_is_set(PINB,1)) // ignore hi->lo edge transitions
if (count_hi > 80) // skip if no edge is seen within
break; // a reasonable time
while (bit_is_clear(PINB,1)) // wait for lo->hi edge
if (count_hi > 80) // skip if no edge is seen within
break;
Стоит цикл который смотрит, когда идет положительный и когда отрицательный перепад. Соответственно в эти моменты времени обрабатывается процедура по переполнению таймера. Затем обрабатывается значение count_hi и засвечиваются необходимые светодиоды... Собственно примерно все.
Добавлено: Чт сен 27, 2007 06:20:49
tych
Я просто прогу для ПК скачал. С микрофона нормально настривать гитарку.
Добавлено: Чт сен 27, 2007 11:28:34
Ra
Ну я собрал его, только вместо диодов сделал экранчик, чтоб выдавать туда частоту и октаву... Но что то он слабо работает - он только в том случае определяет, если я, допустим, на компе сгенерю ровно 440 герц и очень громко их подам....
А гитарные струны - почти не определяет - выдает с разбросом от 80 до 400 герц почти
Может, дело в усилителе? Если будет на 2х - то будет лучше? или я где то в проге накосячил... Я же ее писал на кодевижен, базируясь на том коде...
А по поводу проги на комп - так и у меня есть, просто охота собрать в железе.......
...но получается усилитель класса B, т.е. каждая полуволна усиливается своим транзистором.
Хм... я тут вижу только один транзистор =)
Mamonth, спасибо за пояснения - в общем, я примерно так и представлял - но тогда я не понимаю почему он так глючит.
Добавлено: Пт сен 28, 2007 03:33:32
Mamonth
Ra писал(а):
...но получается усилитель класса B, т.е. каждая полуволна усиливается своим транзистором.
Хм... я тут вижу только один транзистор =)
Mamonth, спасибо за пояснения - в общем, я примерно так и представлял - но тогда я не понимаю почему он так глючит.
Один транзистор - потому что его вполне достаточно одного. Зачем усложнять схему если подсчет идет по положит. а затем по отрицательному перепаду? Потому и остался всего один транзистор.
А глючить он может по совершенно различным причинам, начиная от неверной частоты кварца, до косяка в программе или настройке фузов. Если бы я начал делать что-то подобное, я бы сперва сделал частотомер, а потом переиначил его в тюнер. Частоты у гитар небольшие (даже на первых струнах в районе 12-24 ладов), так что, проблем особых я не вижу.

Дерзай!
Добавлено: Пт сен 28, 2007 12:37:20
Ra
В общем, тактируется от внутреннего генератора меги, на 1 мегагерц.
Фузы все по стандарту, не менял ничего.
Код: Выделить всё
#define MAX_SMPL 60
#define SAMPLES 64
#define BASE_FREQUENCY 125000
unsigned long int Cnt_Hi=0;
float Freq=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
Cnt_Hi++;
}
void main(void)
{
//......тут разные инициализации
TCCR0A=0x00;
TCCR0B=0x02; //таймер0 на 125 000 герц
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
//......тут разные инициализации
lcd_init(20);
#asm("sei")
while (1)
{
lcd_clear();
if(szFreq[0]!=0)
{
strcpyf(Str,"Frequency:");
strcat(Str,szFreq);
strcatf(Str," Hz - ");
strcat(Str,szNote);
strcat(Str,szOct);
strcatf(Str,"+");
strcat(Str,szErr);
}
lcd_puts(Str);
while(PINC.3!=1);
TCNT0=0;
Cnt_Hi=0;
Cnt=0;
for(i=0;i<SAMPLES>MAX_SMPL)
while(PINC.3!=0)
if(Cnt_Hi>MAX_SMPL)
break;
while(PINC.3!=1)
if(Cnt_Hi>MAX_SMPL)
break;
Cnt+=(Cnt_Hi<<8>MAX_SMPL)
break;
TCNT0=0;
Cnt_Hi=0;
}
if(Cnt_Hi<=MAX_SMPL)
{
Freq=BASE_FREQUENCY*SAMPLES/(float)Cnt;
//....Дальше идет определение октавые, хрен бы с ним - сначала с частотой надо разобраться
}
P.S. опечатался, когда копировал.....
Добавлено: Пт сен 28, 2007 12:39:25
Ra
2 Mamonth Посмотри плз - у меня уже "глаз замылился" - может где и есть косяк, я не вижу.....
Добавлено: Пт сен 28, 2007 13:53:51
Mamonth
Что-то я не вижу кода по определению положительного и отрицательного перепада... это раз. Второе, ты бы уж выкладывал программу полностью, а то много непонятного. Какой кварц стоит, какие фузы установлены и прочее ))
Добавлено: Пт сен 28, 2007 13:58:34
Ra
Ra писал(а):В общем, тактируется от внутреннего генератора меги, на 1 мегагерц.
Фузы все по стандарту, не менял ничего.
Вот, я же написал.
А перепады -
Код: Выделить всё
while(PINC.3!=1); //ждем 1 на ноге
TCNT0=0;
Cnt_Hi=0; //обнуляем каунтеры
Cnt=0;
for(i=0;i<SAMPLES>MAX_SMPL)
break;
while(PINC.3!=0) //Ждем перепада с 1 на 0
if(Cnt_Hi>MAX_SMPL)
break;
while(PINC.3!=1) //ждем с 0 на 1
if(Cnt_Hi>MAX_SMPL)
break;
Cnt+=(Cnt_Hi<<8>MAX_SMPL)
break;
}
Ну я по образу и подобию того тюнера, на который мне ссылку кинули, сделал. Там примерно так же - в Cnt будет сумма тиков за SAMPLES измерений, потом мы ее делим на SAMPLES - получаем среднее количество тиков в периоде.