Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.12.20;
Скачать: CL | DM;

Вниз

Midi 2 Beep-код   Найти похожие ветки 

 
brother ©   (2015-02-09 18:14) [40]

[37] хотелось бы посмотреть на готовый аппарат...


 
Дмитрий С ©   (2015-02-09 18:17) [41]


> brother ©   (09.02.15 18:14) [40]

Как будет готово видео выложу.


 
Kilkennycat ©   (2015-02-09 18:52) [42]


> стоит ли припаять кварц и получить 16 MHz или 8и будет достаточно
> для этой задачи?


для этой задачи хватило бы и внутреннего генератора, тут больше вопрос энергопотребления... если батарейное - старайся снизить частоту и избавляться от кварца.
в случае батарейки - светодиоды обязательно шимом, снизишь в десяток раз потребление, кроме того, теоретически светодиодик тогда можно напрямую на порт контроллера вешать (это зависит от светодиодика, конечно, от контроллера, ну и от уверенности, что не возникнет ситуации, когда все светодиодики зажгутся без шима).
по поводу пищалки: динамик, конечно, приятнее. но сожрет больше, что опять же, нежелательно при батарейном питании.


 
Inovet ©   (2015-02-10 03:05) [43]

> [35] Дмитрий С ©   (09.02.15 16:53)
> А как она может синусоиду

Настоящие джедаи пишут "Синусойда" и для полного пассворда добавлялют "джа", а особо продвинутые в искусствах ингаляций знают тайное слово "Растафари".


 
Дмитрий С ©   (2015-02-10 23:19) [44]

Пока что-то не выходит:(

Настроил таймер в режиме ШИМ на частоте примерно 15KHz (8 битный таймер в два прохода на частоте генератора 8MHz. 8000000/512=15625).
Повесил прерывание на переполнение счетчика этого самого таймера (выполняется раз в 512 тактов процессора), где обновляю регистр сравнения шима (1 раз за 8 срабатываний таймера):

 tickCount ++;
 OCR1A = sinCache[(tickCount >> 3) % sizeof(sinCache)]; // (tickCount div 8) mod sizeof(sinCache);

Где:

volatile byte sinCache[64];
 for(int i =0; i<sizeof(sinCache); i++) {
   sinCache[i] = 127 + round(127*sin(6.283 * 440 * i / 1962)); // sin(2*pi*440*i/1962). 1962=15625/8
 }

Звук всеравно получается мерзский и даже рядом не стоит с частотой 440 Гц.


 
Kilkennycat ©   (2015-02-10 23:40) [45]

этот мк случайно не st7fox?


 
Дмитрий С ©   (2015-02-10 23:48) [46]


> Kilkennycat ©   (10.02.15 23:40) [45]

Нет. Atmega328, извлеченная из ардуиноподобной платы.


 
Kilkennycat ©   (2015-02-11 00:14) [47]

странно, что не угадал, ведь так мало вариантов было...
а как ты думаешь, есть ли какая-нибудь разница между микроконтроллерами, их компиляторами, конфигурацией?
и в чем выражается мерзский и даже рядом не стоит с частотой 440 Гц.?
какую частоту выдает?


 
Дмитрий С ©   (2015-02-11 00:40) [48]

Точно не скажу, но намного выше. Ощушение, что на  уши давит.
При это есть и более низкий звук с гуляющей частотой.

Я не настолько глубоко знаком с программированием мк. Я отключил все  прерывания, кроме своего, и не использовал ардуиновские функции в его обработчике
Это то что было в моих силах:)

Поискал ещё в ютубе мелодии на ардуино. - почти везде обычный писк (включение/выключение пина с заданной частотой). В одном месте я увидел идею, которая может сработать: формировать напряжение не с помощью pwm, а с помощью 8 ног МК и кучи резисторов. В этом случае,я полагаю, можно значительно увеличить частоту дискретизации. Хотя я, конечно, не уверен что проблема в ней.


 
Kilkennycat ©   (2015-02-11 00:47) [49]


> 8 ног МК и кучи резисторов

это примитивный цап


> Я не настолько глубоко знаком с программированием мк.

это понятно.
Но тут вся проблема, как и в вопросах по делфи: ты не даешь информацию.
в твоем случае помимо всего кода (включая заголовочные файлы, конфиги и инфа о компиляторе, включая режимы компиляции) еще и необходимо информировать об аппаратной реализации, может ты на порт повесил фиг знает какой кондюк и резюк, а может через мост сделал- никому неизвестно.


 
RWolf ©   (2015-02-11 01:01) [50]

Припаяйте какую-нибудь YM2149F и выгружайте в неё любую из статыщмильёнов спектрумовских чиптюнов.


 
Inovet ©   (2015-02-11 01:20) [51]

У тебя 15625 - это частота прерывайний? При этом ШИМ 8 бит? Тогда
15625 / 256 примерно 61 Гц. Откуда взялись 440?


 
Kilkennycat ©   (2015-02-11 02:20) [52]


> Откуда взялись 440?

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


 
Дмитрий С ©   (2015-02-11 12:32) [53]

Настало время рассказать подробнее.

Сейчас я хочу сделать двухголосную полифонию с поддержкой аккордов (т.к. они есть в выбранной мной мелодии).

Я действительно искал примеры в ютубе, чтобы быть уверенным, что это возможно сделать на моем МК.

МК у меня следующий: Atmega328P-PU с ардуиновским бутлоадером. IDE: тоже ардуино. Компилятор в ней GCC. Сторонних библиотек никаких нет.

Кварц я не припаивал, и с помощью fuse битов включил встроенный в микросхему генератор 8МГц. Сделал я это давно и уже не помню как.

Схема подключения такая: одна нога динамика припаяна к ноге PB4, другая через резистор 120 Ом (корич,красн,корич) к PB1 (т.к. на ней выход выбранного мной таймера и ШИМ-а). Так же к контактам динамика я припаял конденсатор 0,1 мкф (вот такой http://neoviservis.narod.ru/images/cap_k10_17_104.jpg ).
Динамик вытащил из дешевой нокии (он состоит из пленочки, катушки и магнита).
На ногу PB4 я подаю просто минус. На ногу PB1 - ШИМ-сингал.

Была идея вместо минуса в PB4 припаять к другому ШИМ выходу этого же таймера (PB2), чтобы увеличить разрядность потока на 1 бит и увеличить амплитуду колебаний, путем поочередного включения шимов. Но пока до нее не дошел.

Скетч следующий:

volatile unsigned long tickCount = 0;
volatile byte sinCache[1024];

void setup() {
 Serial.begin(9600);
 
 // http://www.jameco.com/Jameco/workshop/JamecoBuilds/arduinocircuit_fig12.jpg
 pinMode(9, OUTPUT);  // Режим ноги PB1 (так что для ШИМа)
 pinMode(12, OUTPUT); // Режим ноги PB4
 digitalWrite(12, 0); // Минус на PB4
 
 for(int i=0; i<sizeof(sinCache); i++) {
   sinCache[i] = 127 + round(127*sin(2 * 3.1415926 * 440 * i / 15700));
   Serial.print(i);
   Serial.print(" ");
   Serial.println(sinCache[i]);
 }

 // Неинвертированный | Шим 8 бит http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_38.htm
 // и http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_43.htm
 TCCR1A = (1<<7) | (1<<0);

 // http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_39.htm
 TCCR1B = (1 << 0); // Без делителя частоты
 
 SREG |= (1<<7); // Глобальное разрешение прерываний.
 TIMSK1 = (1<<TOIE1); // Разрешить прерывание по переполнению Т1. (остальные выключены)
 
 // Для диагностики, значения не имеет:
 unsigned long predTickCount = tickCount;
 while(1) {
   Serial.print(OCR1A);
   Serial.print(" ");
   Serial.print(tickCount);
   Serial.print(" ");
   Serial.println(tickCount - predTickCount);
   predTickCount = tickCount;
   delay(1000);
 }
}

ISR(TIMER1_OVF_vect) {
 tickCount ++;
 // http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh/mega103_43.htm
 OCR1A = sinCache[(tickCount) % sizeof(sinCache)];
}

void loop() {
}



Записать результат смогу вечером.


> Inovet ©   (11.02.15 01:20) [51]
> У тебя 15625 - это частота прерывайний? При этом ШИМ 8 бит?
>  Тогда
> 15625 / 256 примерно 61 Гц. Откуда взялись 440?

15625 раз в секунду таймер успевает дойти с 0 до 255 и затем до 0.
440 образуется путем формирования синусоиды с помощью изменения ширины ШИМ-а.


 
Kilkennycat ©   (2015-02-11 13:19) [54]


> Схема подключения такая: одна нога динамика припаяна к ноге
> PB4, другая через резистор 120 Ом (корич,красн,корич) к
> PB1 (т.к. на ней выход выбранного мной таймера и ШИМ-а).
>  Так же к контактам динамика я припаял конденсатор 0,1 мкф

то есть, если напутаешь с начальным состоянием порта мк, достигаешь тока в 40 миллиампер. Скоро пойдешь покупать новый проц.


 
RWolf ©   (2015-02-11 13:40) [55]

Ну, то есть, частота ШИМ 15625/2 = 7.8125 кГц?
Чтобы получить оценку верхней границы частот сигнала, делим ещё на 4. Грязноватый звук выйдет.


 
Дмитрий С ©   (2015-02-11 13:42) [56]


> то есть, если напутаешь с начальным состоянием порта мк,
>  достигаешь тока в 40 миллиампер. Скоро пойдешь покупать
> новый проц.

Вряд-ли. Во-первых динамик тоже имеет сопротивление, хоть и незначительное. Во-вторых, отлаживаюсь я на 3,3 В, а в итоге работать будет от 4,5 В (три батарейки по 1,5 В). Поэтому ток не превысит 40 мА и всегда будет являться допустимым.


 
Inovet ©   (2015-02-11 13:43) [57]

Т.е. ты исходил из предположения о сопротивлении динамика больше килоома, что-то мне кажется, что его сопротивление несколько десятков Ом, 32 Ома например. Про увеличение разрядности на 1 бит не понял, тем более не понял про увеличение амплитуды. Ладно. У тебя динамик воспроизводит эти твои 15625 Гц с соответсвующими артефактами. ФНЧ надо ниже настроить, да и усилитель надо бы сделать, хоть на одном транзисторе.


 
Дмитрий С ©   (2015-02-11 13:47) [58]


> Ну, то есть, частота ШИМ 15625/2 = 7.8125 кГц?
> Чтобы получить оценку верхней границы частот сигнала, делим
> ещё на 4. Грязноватый звук выйдет.

Почему на два делить?
15625, а по факту получается 15700, это грубо говоря количество минимумов на рисунке:
http://www.gaw.ru/im/_micros/avr/arh/34.gif
т.е. это и есть частота шима.

Можно по подробнее по поводу "делим еще на 4"?


 
Дмитрий С ©   (2015-02-11 13:51) [59]


> Inovet ©   (11.02.15 13:43) [57]

Я исходил из пункта "Во-вторых" из [56].

3,3 В / 120 Ом = 27,5 мА (при допустимых 50)
4,5 В / 120 Ом = 37,5 мА (при допустимых чуть более 40)

Что значит "ФНЧ надо ниже настроить" ?

Усилитель сделаю, как получу нормальный звук без него.


 
Inovet ©   (2015-02-11 13:53) [60]

> [59] Дмитрий С ©   (11.02.15 13:51)
> Что значит "ФНЧ надо ниже настроить" ?

Ты кондесатор тот на 0,1 мкФ от фонаря впаял?

> [59] Дмитрий С ©   (11.02.15 13:51)
> Усилитель сделаю, как получу нормальный звук без него.

Утром деньги, вечером стулья.


 
Inovet ©   (2015-02-11 13:55) [61]

Это если предположить, что в программе всё правильно сделано, и на вышоде действительно шим той синусоиды на 440 Гц, а не фигня какая-нибудь.


 
RWolf ©   (2015-02-11 13:59) [62]


> Почему на два делить?15625, а по факту получается 15700,

Всё верно, я уже прочитал выше.


>  Можно по подробнее по поводу "делим еще на 4"?

Ну, меня так учили: настраивай ФНЧ на четверть частоты ШИМ, чтобы полезный сигнал в звоне не тонул.


 
Дмитрий С ©   (2015-02-11 14:05) [63]

По-поводу увеличения битности и амплитуды вот мои соображения:

Мы имеем два 8-битных ШИМ выхода, подключаем к ним динамик, назовем их А и Б.

Далее формируем 9-битный сигнал: от -255 до 255. Пусть значение сигнала в рассматриваемый момент времени t: S(t).

Динамик расположен так, что его диафрагма двигается вверх и вниз.

Рассмотрим несколько ситуаций:

1. S(t) = 0.  На ноги А и Б одновременно подается 0 или 1. Диафрагма находится в нейтральном положении.
2. S(t) = 200 (т.е. >0). На ногу Б подается 0, на ногу А - ШИМ сигнал 200/255. Диафрагма находится выше нейтрального положения на 200/255 от предельного.
3. S(t) = -200 (т.е. <0). На ногу А подается 0, на ногу Б - ШИМ сигнал 200/255.
Диафрагма находится ниже нейтрального положения на 200/255 от предельного.

------------------------

Пока писал, пришел в голову другой вариант с одним ШИМ-ом. Положим, что нога А - ШИМ, а Б - обычная 0/1.

Рассмотрим несколько ситуаций:
1. S(t) = 0.  На ноги А и Б одновременно подается 0 или 1. Диафрагма находится в нейтральном положении.
2. S(t) = 200 (т.е. >0). На А - ШИМ сигнал 200/255, на Б - 0. Диафрагма находится выше нейтрального положения на 200/255 от предельного.
3. S(t) = -200 (т.е. <0). На А - ШИМ (255-200)/255, на ногу Б - 1. Диафрагма находится ниже нейтрального положения на 200/255 от предельного.

В итоге получаем, что диафрагма динамика перемещается не от 0 до 1, а от -1 до 1 (амплитуда увеличена в два раза), а сигнал получился 9 битный (-255 до 255).


 
Kilkennycat ©   (2015-02-11 14:09) [64]


> Поэтому ток не превысит 40 мА и всегда будет являться допустимым.

неверно.
во-первых, даже при 3.3 в. ток более 20 ма.
при 4.5 ты приблизился к максимальному значению потребления.
Напомню, что максимальное вовсе не равно номинальному.
ну и реализация моста на двух ногах... в момент переключения может выйти кака.


 
Дмитрий С ©   (2015-02-11 14:10) [65]


> Ты кондесатор тот на 0,1 мкФ от фонаря впаял?

Практически.
А вообще отсюда http://www.pic24.ru/doku.php/osa/ref/appendix/quartet


> Ну, меня так учили

Я правильно понял, частота дискретизации самого звука минимум в 4 раза меньше чем частота ШИМ-а должна быть?
На виндовом waveOut я проверил, что частоты дискретизации самого звука 1,96 кГц мне хватит, поэтому у меня даже с запасом.


var
 WF: tWAVEFORMATEX;
 WaveOutHandle: HWAVEOUT;
 i: Integer;

 Buf: array[0..3*8000-1] of byte;
 H: TWaveHdr;
begin
  wf.cbSize := SizeOf(wf);
 wf.wFormatTag:=WAVE_FORMAT_PCM;
 wf.nChannels := 1;    //1 канала
 wf.wBitsPerSample := 8;    //8 бит
 wf.nBlockAlign:=(wf.nChannels * wf.wBitsPerSample) div 8;
 wf.nSamplesPerSec := 1960;    //1,96 кГц
 wf.nAvgBytesPerSec := wf.nSamplesPerSec * wf.nBlockAlign;

 Winapi.Windows.Beep(880, 2000);
 for I := 0 to Length(Buf) - 1 do
 begin
   if I < 8000 then
     Buf[I] := ( 127 +  Round(127 * ( Sin(2 * Pi * I * 880 / wf.nSamplesPerSec) )))
   else
   if I < 16000 then
     Buf[I] := ( 127 +  Round(127 * ( Sin(2 * Pi * I * 440 / wf.nSamplesPerSec) )))
   else
     Buf[I] := ( 127 +  Round(127 * ( Sin(2 * Pi * I * 440 / wf.nSamplesPerSec) + Sin(2 * Pi * I * 880 / wf.nSamplesPerSec) )/2));

 end;
 ZeroMemory(@H, SizeOf(H));
 H.lpData := PAnsiChar(@Buf);
 H.dwBufferLength := SizeOf(Buf);
 H.dwBytesRecorded := 0;
 H.dwFlags := WHDR_INQUEUE;
 H.dwLoops := 10;

 waveOutOpen(@WaveOutHandle, WAVE_MAPPER, @wf, 0, 0, WAVE_ALLOWSYNC or CALLBACK_NULL);
 waveOutPrepareHeader(WaveOutHandle, @H, sizeof(H));
 waveOutWrite(WaveOutHandle, @H,sizeof(H));
 waveOutReStart(WaveOutHandle);
end;


 
Дмитрий С ©   (2015-02-11 14:14) [66]


> неверно.
> во-первых, даже при 3.3 в. ток более 20 ма.
> при 4.5 ты приблизился к максимальному значению потребления.
>
> Напомню, что максимальное вовсе не равно номинальному.
> ну и реализация моста на двух ногах...
>  в момент переключения
> > может выйти кака.


Там в любом случае ШИМ сигнал - даже за пределами этого тока - маловероятно что МК испортится. И при 3.3 V допустимый ток - 50 мА - это из описания МК.

А до "каки" еще дойти нужно:) Учитывая что выходы на одном порту будут, то переключатся они будут одновременно практически. Не знаю, правда, как конденсатору будет от этого:) Но, повторюсь, до этого еще дойти нужно.


 
Inovet ©   (2015-02-11 14:16) [67]

> [65] Дмитрий С ©   (11.02.15 14:10)
> Практически.
> А вообще отсюда

Ну так там сколько написано? 78 кГц, а у тебя 15 кГц.


 
Дмитрий С ©   (2015-02-11 14:17) [68]


> Ну так там сколько написано? 78 кГц, а у тебя 15 кГц.

Если хочешь помочь - помоги, а это я и сам вижу :(


 
Inovet ©   (2015-02-11 14:24) [69]

> [68] Дмитрий С ©   (11.02.15 14:17)

На 78 уже сам динамик добавит фильтрации, потому что не воспроизведёт такую частоту и будет усреднять. А 15 воспроизведёт достаточно хорошо, надо фильтровать сильнее, увеличь ёмкость конденсатора до 0,5 мкФ.


 
Дмитрий С ©   (2015-02-11 14:32) [70]

Пока у меня идея: увеличить частоту ШИМа.

И следующие идеи:
1. Сделать формирования ШИМ-сигнала вручную с периодом 128, вместо 512, тем самым увеличить частоту в 4 раза, до примерно 62 кГц. Пожертвовав 1-им битом звуковой полосы.

2. Впаять кварц на 16 или 20 МГц. Для 8-битного шима, получаем: 20MHz/256 = 78 КГц - уже лучше.

Интересно: а можно переключаться *на ходу* между внешним кварцем и внутренним генератором?


 
Kilkennycat ©   (2015-02-11 14:45) [71]


> Там в любом случае ШИМ сигнал - даже за пределами этого
> тока - маловероятно что МК испортится. И при 3.3 V допустимый
> ток - 50 мА

не в любом случае. есть три случая, когда его там не будет. в момент включения, при сбое-зависании и при ошибке.
и там не допустимый, а максимальный. работа на максимальном ни чем не гарантированна, попадется один мк - проработает долго, другой - сдохнет сразу.
и где ты увидел в даташите 50? там 40. И ты говорил, что 3.3 - это отладка, а работа при 4.5, как-то странно, обычно отлаживают-тестируют в рабочем или более экстремальном режиме, но никак наоборот


> а можно переключаться *на ходу* между внешним кварцем и
> внутренним генератором?


читай даташит. там все есть.


 
RWolf ©   (2015-02-11 15:24) [72]


> Дмитрий С ©   (11.02.15 14:32) [70]
> Пока у меня идея: увеличить частоту ШИМа. И следующие идеи:
> кварц на 16 или 20 МГц.

есть специальные меги с встроенным умножителем частоты ШИМ.


 
Kilkennycat ©   (2015-02-11 16:13) [73]


> 2. Впаять кварц на 16 или 20 МГц. Для 8-битного шима, получаем:
>  20MHz/256 = 78 КГц - уже лучше.

я могу на твоей атмеге при внутреннем генераторе 8 МГц получить шим максимально 4 МГц... просто почитал даташит. еще и занижать придется.


> 20MHz/256 = 78 КГц - уже лучше.

формула неверна. в даташите иной расчет.


 
Дмитрий С ©   (2015-02-11 16:35) [74]


> я могу на твоей атмеге при внутреннем генераторе 8 МГц получить
> шим максимально 4 МГц... просто почитал даташит. еще и занижать
> придется.

Так я хочу программный шим сделать. Перевести таймер в обычный режим. А в прерывании на достижении таймером определенного значения обновлять настройки таймера так, чтобы получить шим длиной 128 тактов, вместо 512, который является минимальным аппаратным.

Хотя, конечно, в крайних положениях обработчику не хватит времени выполниться.

Выходит что этот МК неспособен сделать то что я от него хочу?


 
RWolf ©   (2015-02-11 16:40) [75]

Чем Fast PWM не угодил?


 
Дмитрий С ©   (2015-02-11 16:55) [76]


> RWolf ©   (11.02.15 16:40) [75]

Начал искать что это такое и нашел клевую статью, как раз на похожую тему.

http://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-shim.html

Спасибо.

P.S. Кто-нить знает места в Москве, куда можно придти поработать с этим всем и где будет оборудование (паяльник, осциллограф) и возможно советчик:)


 
Kilkennycat ©   (2015-02-11 17:53) [77]


> Так я хочу программный шим сделать.

зачем? есть замечательный аппаратный, и не один, можно полифонию забабахать. меньшими усилиями. а ты хочешь программный.... развивая идею дальше, тебе и мк не нужен будет - несколько резисторов, счетчик ИД, одна ЛА3 и операционный усилитель.


 
RWolf ©   (2015-02-11 17:57) [78]


>  [77]

Есть замечательные аппаратные музыкальные процессоры за сущие копейки. Вся эта возня с шимами не стоит домашнего применения; я понимаю, если в серийном приборе — там надо экономить.


 
Дмитрий С ©   (2015-02-11 18:49) [79]


> Kilkennycat ©   (11.02.15 17:53) [77]

У аппаратного частота слишком маленькая.


> RWolf ©   (11.02.15 17:57) [78]

Ну уже поздно, устройство уже собрано. А идея "забабахать" полифонию пришла уже после того как я его собрал.


 
Kilkennycat ©   (2015-02-11 20:17) [80]


> У аппаратного частота слишком маленькая.

вовсе нет... ты просто не чувствуешь.
сам подумай - чем обусловлено наличие аппаратного шима? неужели разработчики занизили его б частотную характеристику, к коему нет никаких предпосылок, в угоду чему либо? размышляй объективно, что разработчики мк несколько сильнее тебя и меня вместе взятых (и это так), и невозможность извлечь правильный звук, это не их косяк, а наш.
попробуй осознать шим, что это не только частота, т.е. отношение периода к единице, но и скважность и длительность, что существует множество режимов шим, которые позволяют моделировать в какой-то степени и ам и чм модуляцию, там такие звуки можно извлекать, что просто жуть. Вся фишка именно в осознании того, как это работает.
в противном случае проще потратить 3*N+1 резисторов и собрать примитивный Цап и гнать 8(16)-битный wav



Страницы: 1 2 3 вся ветка

Текущий архив: 2015.12.20;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.009 c
2-1403613872
Dennis I. Komarov
2014-06-24 16:44
2015.12.20
function Format


2-1403529768
Sakipiel
2014-06-23 17:22
2015.12.20
Все события на одной процедуре


15-1429522423
pavelnk
2015-04-20 12:33
2015.12.20
По Андроиду


15-1429825354
Rouse_
2015-04-24 00:42
2015.12.20
К девятому мая


2-1403717600
Sakipiel
2014-06-25 21:33
2015.12.20
как добавить элемент в наследника TCollection