Форум: "Прочее";
Текущий архив: 2015.12.20;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.65 MB
Время: 0.006 c