А как на счет долговременной стабильности задающих генераторов? Ваш инструмент строй держать не будет, бикоз в частотозадающих цепях надо будет термокомпенсированные кондеры применять и прецизионное питание. А на МК кварцованная тактовая, уход частоты при сквозняке минимальный. [.
Отвечу честно - никак! в былые годы поигрывал на Юность, где кварцами и не пахло. Это первая ЭМИ 60 годов. За три года ни разу не лазили подстраивать ноты. Можно из любой "мухи раздуть слона" и долго и нудно решать надуманную проблему. Однако же Страдивари не занимался такой хуйней, музыкант сам подстроит высоту звучания струн. Я гляжу тут все практически уперлись в одну тему - как сделать генератор. но никто даже и не заикается: как обработать звук так, чтобы он звучал мощно и благородно.... А генератор - это самое простое....
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Относительно идеи "один генератор - несколько (12) базовых частот на выходе"...
Метод табличного формирования неприемлем по причинам недостаточного объема ОЗУ в "бюджетных" МК. Метод аппаратного синтеза - ограничен количеством аппаратных ресурсов один 16-разрядный таймер=одна нота (частота), а таймеров максимум 3 это ежли не брать за основу mcs5x (54/58) с программируемой матрицей счетчиков... Метод программного синтеза имеет ограничения по минимальному кванту равное максимальной длительности программы обработки всего массива плюс десяток машинных циклов... А это уже неприемлемо с точки зрения точности генерируемых интервалов... Вопчем... или ищем чего из mcs51(или иных) с Programmable Counter Array(PCA) на борту или ставим 4 штуки 580ВИ53/1810ВИ54 (I8254) что "бюджетным" уж никак не назовешшш... К вопросу "откуда рога" набросок обработчика массива двенадцати 16-разрядных счетчиков на АВР (загрузка начальных данных в массив пропущена) ... Спойлер
Код:
; заготовка для двенадцатиканального массива счетчиков в генерацией ; выходного сигнала ;---------- ; variable definitions ;(таблица обьявленных имен) ;_____ ;таблица обьявленных имен - пользовательские константы ; .equ step_C = ; константа досчета ноты С 8372,0 .equ step_CD = ; константа досчета ноты C#/Db 8869,8 .equ step_D = ; константа досчета ноты D 9397,3 .equ step_DE = ; константа досчета ноты D#/Eb 9956,1 .equ step_E = ; константа досчета ноты E 10548,0 .equ step_F = ; константа досчета ноты F 11175 .equ step_FG = ; константа досчета ноты F#/Gb 11840 .equ step_G = ; константа досчета ноты G 12544 .equ step_GA = ; константа досчета ноты G#/Ab 13290 .equ step_A = ; константа досчета ноты A 14080 .equ step_AH = ; константа досчета ноты A#/Hb 14917 .equ step_H = ; константа досчета ноты H 15804 ;_____ ;таблица обьявленных имен - переназначение регистров РОН ; ; регистры R26-R31 заранее объявлены как X,Y и Z ; R31:R30=ZH:ZL (Z) ; R29:R28=YH:YL (Y) ; R27:R26=XH:XL (X) ; .def BH = r25 ; регистр (полный) .def BL = r24 ; регистр (полный) .def outbuf_h = r23 ; регистр (полный) .def outbuf_l = r22 ; регистр (полный) ; .def name = r21 ; регистр (полный) ; .def name = r20 ; регистр (полный) ; .def name = r19 ; регистр (полный) ; .def name = r18 ; регистр (полный) ; .def name = r17 ; регистр (полный) ; .def name = r16 ; регистр (полный) ; .def regn = r15 ; регистр (урезан) ; .def regn = r14 ; регистр (урезан) ; .def regn = r11 ; регистр (урезан) ; .def regn = r10 ; регистр (урезан) ; .def regn = r9 ; регистр (урезан) ; .def regn = r8 ; регистр (урезан) ; .def regn = r7 ; регистр (урезан) ; .def regn = r6 ; регистр (урезан) ; .def regn = r5 ; регистр (урезан) ; .def regn = r4 ; регистр (урезан) ; .def regn = r3 ; регистр (урезан) ; .def regn = r2 ; регистр (урезан) ; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!! ; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!! ;_____ ;таблица обьявленных имен - секция флагов пользователя ; .equ nota_grid_l = PORTB .equ nota_grid_h = PORTD .equ bit_C = 0 ; PORTB.0 .equ bit_CD = 1 ; PORTB.1 .equ bit_D = 2 ; PORTB.2 .equ bit_DE = 3 ; PORTB.3 .equ bit_E = 4 ; PORTB.4 .equ bit_F = 5 ; PORTB.5 .equ bit_FG = 6 ; PORTB.6 .equ bit_G = 7 ; PORTB.7 .equ bit_GA = 0 ; PORTD.0 .equ bit_A = 1 ; PORTD.1 .equ bit_AH = 2 ; PORTD.2 .equ bit_H = 3 ; PORTD.3 ;_____ ;таблица обьявленных имен - секция определенных данных (ОЗУ) ; .dseg nota_cnt_C: .byte 2 ; текущий счетчик ноты С nota_cnt_CD: .byte 2 ; текущий счетчик ноты C#/Db nota_cnt_D: .byte 2 ; текущий счетчик ноты D nota_cnt_DE: .byte 2 ; текущий счетчик ноты D#/Eb nota_cnt_E: .byte 2 ; текущий счетчик ноты E nota_cnt_F: .byte 2 ; текущий счетчик ноты F nota_cnt_FG: .byte 2 ; текущий счетчик ноты F#/Gb nota_cnt_G: .byte 2 ; текущий счетчик ноты G nota_cnt_GA: .byte 2 ; текущий счетчик ноты G#/Ab nota_cnt_A: .byte 2 ; текущий счетчик ноты A nota_cnt_AH: .byte 2 ; текущий счетчик ноты A#/Hb nota_cnt_H: .byte 2 ; текущий счетчик ноты H ;---------- ; hole: .byte 2 ; технологическая дырка ;---------- step_cnt_C: .byte 2 ; размещение константы досчета ноты С step_cnt_CD: .byte 2 ; размещение константы досчета ноты C#/Db step_cnt_D: .byte 2 ; размещение константы досчета ноты D step_cnt_DE: .byte 2 ; размещение константы досчета ноты D#/Eb step_cnt_E: .byte 2 ; размещение константы досчета ноты E step_cnt_F: .byte 2 ; размещение константы досчета ноты F step_cnt_FG: .byte 2 ; размещение константы досчета ноты F#/Gb step_cnt_G: .byte 2 ; размещение константы досчета ноты G step_cnt_GA: .byte 2 ; размещение константы досчета ноты G#/Ab step_cnt_A: .byte 2 ; размещение константы досчета ноты A step_cnt_AH: .byte 2 ; размещение константы досчета ноты A#/Hb step_cnt_H: .byte 2 ; размещение константы досчета ноты H ;_____ ;таблица обьявленных имен - секция определенных данных (EEPROM) ; .eseg ;_____ ; ; ;---------- ; ; ; "mac_ext_disp.txt" ; файл описания макросов ; .macro xchrr ; псевдокоманда "обмен регистра/акумулятора/ с регистром" eor @0,@1 ; вызывается как xchrr rd,rs eor @1,@0 eor @0,@1 .endmacro ; .macro ldiw ; псевдокоманда "загрузка слова в регистровую пару /X,Y,Z/" ldi @0l,low(@1) ; вызывается как ldwi rp,0xnnnn или ldwi rp,name (где name=0xnnnn, rp=x,y,z) ldi @0h,high(@1) .endmacro ; .macro ldpm ; псевдокоманда загрузка РСФ как ячейки памяти в регистр lds @0,(@1+0x20) ; вызывается как ldpm rd,NAME (где NAME - имя порта РСФ) .endmacro ; .macro stpm ; псевдокоманда загрузка регистра из РСФ как ячейки памяти sts (@0+0x20),@1, ; вызывается как stpm NAME,rs (где NAME - имя порта РСФ) .endmacro ; .macro cplb ; инверсия содержимого указанного бита в указанном регистре sbrs @0,@1 ; вызывается как cplb rd,name (где NAME - имя/номер бита) sbr @0,(1<<@1) ; действительно только для R16-R31 !!! sbrc @0,@1 cbr @0,(1<<@1) .endmacro ; ; ;---------- ; ; собственно блок обработки массива и вывода данных в порты вывода ; gen_grid: out nota_grid_l,outbuf_l out nota_grid_l,outbuf_l ; вывод предыдущего состояния буфера сетки частот ldiw x,nota_cnt_C movw yl,xl ; указатели на начало массива счетчиков ptn_C: ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_CD ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_C ;0 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_CD: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_D ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_CD ;1 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_D: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_DE ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_D ;2 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_DE: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_E ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_DE ;3 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_E: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_F ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_E ;4 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_F: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_FG ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_F ;5 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_FG: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_G ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_FG ;6 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_G: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_GA ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_l,bit_G ;7 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_GA: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_A ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_h,bit_GA ;0 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_A: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_AH ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_h,bit_A ;1 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_AH: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_H ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_h,bit_AH ;2 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh movw yl,xl ; восстановление указателя после перезагрузки счетчика ptn_H: movw xl,yl ; восстановление указателя для обеих случаев ld bl,y+ ld bh,y+ ; акумулятор загружен sbiw bl,1 ; dec bh:bl brbc SREG_Z,ptn_out ; если текущий счетчик не исчерпан переход к обработке следующего cplb outbuf_h,bit_H ;3 ldd bl,y+(11*2) adiw yl,1 ld bh,y st x+,bl st x+,bh ptn_out: ret ; reti восстановление указателя для обеих случаев не проводится ; ;---------- ;
можеть и чего попроще хто намыслить? Только воть усе количество команд приводит уже к весьма неприятному минимальному кванту... даже проверять симулятором не стал (на банальны очепятки/ошибки) - такая прожка оптимальна только при разумно-соизмеримом интервале вызывающего события, но никак не при вызывающем интервале даже в 0,000001 секунду (1 МГц). (хоша для иных применений с допустимым интервалом вызова обработчика раз в 0,000075-0,0001 секунду вполне сгодится)
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А вот многоуважаемый Дмитрий, да и некоторые другие, утверждают - на МК это ЛЕГКО! Правда ни один из этих пустобрехов, так и не показал, как решить эту задачу! Борис, обьсни им пожалуйста, что микрокогнтроллер может считать последовательно, но не может решать две и более задач параллельно, не мешая друг другу. я это вот давно понял, хоть и не специалист....
Просто как пример берется синтезатор, который в каждый момент времени генерирует заданное количество периодов определенной частоты. В случае с MIDI это также "командная" генерация в пределах определенной достоверности частот/звуков. Да, основанные на таком принципе музыкальные кристаллы играют вполне симпатичные и достаточно сложные мелодии, но количество выходов (голосов) и их разрешающая способность определены аппаратными таймерами, имеющимися "на борту". А воть чего посерьёзнее... там цены резко выходят за рамки разумного "для поиграмс" - программно-управляемые синтезаторы штука вкусная...
Самое интересное, что те же оппоненты абсолютно правильно "встают на дыбы" в темах, где обсуждается возможность создания генератора на МК с диапазоном от 100 Гц до 1 КГц при программно-управляемом шаге изменения частоты в 1 Гц. НО... там такой подход правильный даже в случае одиночного генератора, а тут и генерация одновременно от 8 до 12 частот и заданная точность минимум один знак после запятой для каждой выходной частоты и... "не совсем верно".
Воть такие симпатяшки вопрос с 8-ю нотками решить могут:
жаль только "однократные" (уже с какой-то прошивкой) достались, теперь только с внешним ПЗУ запускать можно...
А вот многоуважаемый Дмитрий, да и некоторые другие, утверждают - на МК это ЛЕГКО! Правда ни один из этих пустобрехов, так и не показал, как решить эту задачу! Борис, обьсни им пожалуйста, что микрокогнтроллер может считать последовательно, но не может решать две и более задач параллельно, не мешая друг другу. я это вот давно понял, хоть и не специалист....
Простите за оверквотинг, но можно! Для этого есть OSA например. Освобожусь, покажу как в железе это выглядит на бюджетном МК. Если интерес к тому времени не пропадет у ЭМИ строителей
я когда прикидывал, получалось следующее (я не спец., могу ошибаться) ограничился 8bit, регистры аппаратные условно - r1 -"счетчик", r2 - "константа", r3 - "буфер": INC R1 - инкримент "счетчика" CP R1 R2 - сравнение с "константой" BREN - если не равны - прыгаем на след."счетчик", иначе : EOR R3 01 -кувыркаем бит в "буфере" по маске (канал) EOR R1 R1 -обнуляем "сетчик" вообщем бум считать 5циклов (у bren может быть 2ц., но щас не важно), при 16МГц на 12 "счетчиков" = 1/16х5х12= 3.75мкс. полупериод от 7902.1Гц = 63.2743мкс, 63.3/3.75 = 16.8, а надо поболее 100, т.е. надо как минимум в 10 раз быстрее, а для 6-й октавы то и в 20 раз.
Вы пока рассуждайте про Мк, а ещё лучще, если у кого то получится выжать из одного чипа (в железе) все 12 частот, что были указаны выше в таблице (интересует 5 октава). Ради спортивного интереса. А я между тем только что закончил монтаж последней, двенадцатой платы. Как её назвать? Даже не знаю: она содержит октавный делитель (счетчик ИЕ10) и 5 штук ключей. (будут управляться от клавиатуры ЭМИ). Завтра начну разработку генератора опорных частот, предполагаю он будет иметь 6 микросхем ЛА7 и 2 микросхемы (буферы) - ЛН2. Размещу физически на двух платах. Это будет основа инструмента, где будут вырабатываться все 96 частот, управляемые клавиатурой.
Анатолий, мне кажется, Вы совершенно правы, что не стОит пытаться применять МК (именно здесь, конечно). И я думаю, что всё-таки можно чуток облегчить себе жизнь и использовать пару старых чипов - КР1012ГП1 и КР1012ГП2. Они в паре при подаче всего одного кварцованого сигнала 1,06295 МГц, дадут Вам все 12 нот 6 октавы. Эти микросхемы вроде как еще можно найти, и стоят они недорого.
Видел в прайсах C8051F330, C8051F350 и еще тройку "одноразовых(С8051Т6хх)" от Silicon Laboratories... при наличии платок-переходничков можно поиграться... Дорогеньки... И возможно только в прайсе... Имеють АЦП, по паре ЦАПов, четыре таймера и от трех каналов матрицы счетчиков... Частота до 50МГц 0,00000002 секунды/цикл при 1-3 циклах на команду...
Видел в прайсах C8051F330, C8051F350 и еще тройку "одноразовых(С8051Т6хх)" от Silicon Laboratories... при наличии платок-переходничков можно поиграться... Дорогеньки... И возможно только в прайсе... Имеють АЦП, по паре ЦАПов, четыре таймера и от трех каналов матрицы счетчиков... Частота до 50МГц 0,00000002 секунды/цикл при 1-3 циклах на команду...
Мндяаа...
Есть АТ89с51 - 24 Мгц тактовая частота. Многократно прошиваемые с Флеш ПЗУ в PLCC -44 корпусе (конкретно буковки уточню завтра). Если кому нужно, отсыплю пару горстей.
Сегодня нарисовал, насверлил, вытравил и облудил главную плату - материнская, Полностью собрать не успел..устал что то. Завтра доделаю и покажу. На очереди: блок питания, плата вибрато, клавиатура.....и уже можно будет попиликать. Но работы ещё много....
Добавлено after 9 hours 46 minutes 50 seconds:
BOB51 писал(а):
Относительно идеи "один генератор - несколько (12) базовых частот на выходе"...
Метод табличного формирования неприемлем по причинам недостаточного объема ОЗУ в "бюджетных" МК. Метод аппаратного синтеза - ограничен количеством аппаратных ресурсов один 16-разрядный таймер=одна нота (частота), а таймеров максимум 3 это ежли не брать за основу mcs5x (54/58) с программируемой матрицей счетчиков... Метод программного синтеза имеет ограничения по минимальному кванту равное максимальной длительности программы обработки всего массива плюс десяток машинных циклов... А это уже неприемлемо с точки зрения точности генерируемых интервалов... Вопчем... или ищем чего из mcs51(или иных) с Programmable Counter Array(PCA) на борту или ставим 4 штуки 580ВИ53/1810ВИ54 (I8254) что "бюджетным" уж никак не назовешшш... К вопросу "откуда рога" набросок обработчика массива двенадцати 16-разрядных счетчиков на АВР (загрузка начальных данных в массив пропущена) ...
можеть и чего попроще хто намыслить? Только воть усе количество команд приводит уже к весьма неприятному минимальному кванту... даже проверять симулятором не стал (:
Борис, Спасибо тебе за огромный труд, и время потраченное на простую в общем то задачу, которую я за это время выполнил более простым методом. Причем не напрягая особо мозг Схемы генераторов в общем то известны, логические микросхемы стоят копейки, оставалось только их навтыкать на печатную плату. (получилось две небольшие платы). Я к чему завел этот разговор: решение задач методом программирования хорошо там, где необходимо часто менять алгоритм работы устройства, или реализация его в "железо" слишком затратно. А вот более простую логику работы устройства намного проще выполнять по старому: на микросхемах логики. Мне тут утверждали ранее , что на МК сделать генератор на 12 частот ОЧЕНЬ ПРОСТО, Оказалось не очень и совсем не просто. Одну частоту = просто. Это я давно знал. Просто напиши в программе коэффициент деления (не надо подбирать конденсатор, резистор - просто напиши) и готово. Но позвольте и здесь без МК выгоднее сделать генератор на одной ЛА7, на двух транзисторах или на 155ЛА3 за 3 рубля, нежели применять самый простейший и дешевый МК, к которому придется ещё и писать программу. Попозже, когда аппарат мой будет собран и отстроен, я начну постепенно выкладывать КОНКРЕТНЫЕ схемы и рисунки печатных плат для тех, кому это интересно будет. Кривить нос не надо - старьё....Да старьё, но оно тем и интересно, что схемы логичны и понятны и здесь легко самому привнести свои изменения для улучшения и тембров и органов управления и всяких там эффектов, что совершенно невозможно сделать в процессорном аппарате для того, кто в программировании дуб. А профессиональному программисту тоже нелегко разобраться в огромной "портянке" (листинг) , созданной другим человеком и привнести свои изменения, не испортив окончательно работу аппарата.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения