Автор, а почему Вы не захотели использовать PDM режим I2S? Это почти что полноценный ЦАП, частотно-импульсная модуляция. Можно было бы настоящий полифонический звук играть, ну, в меру убогости пищалки, конечно
А где именно это написано, если не секрет? Пошёл гуглить, хер найдёшь вообще официальный источник со списком. У опсосов одно, в новостях другое, плюс он постоянно меняется. Дебилизм.
А Сишного компилятора на эту штуку точно нет? Я бы поигрался, пусть и проц аппаратно под жабу, как тут пишут. Конечно, дум не сделаешь, но интересны конкретные ТТХ — набор инструкций ЦП, скорость их исполнения, тактовые частоты, объём ПЗУ/ОЗУ, наличие аппаратных ускорителей и прочей периферии... И карта областей памяти со всеми регистрами периферии :)
Те DDS-генераторы, которые я использовал, не умеют генерировать прямоугольную волну с изменяемым коэффициентом заполнения. Умеют только меандр. И поскольку я по опыту изучения MOS Technology SID знаю, как изменяемый коэффициент заполнения может разнообразить звучание, я каждый из четырёх каналов сделал через аналоговый мультиплексор. Мультиплексор подключает на вход управляемого аттенюатора либо сигнал с DDS (треугольная волна или синус), либо сигнал с вывода микроконтроллера (ШИМ). После аттенюаторов сигналы суммируются аналогово на операционнике и подаются на джек
Если честно, всегда хотел такую штуку сделать. А тут как раз случай подвернулся. Вообще хотелось бы сделать свой звуковой чип, но это, понятное дело, невозможно из-за цены, плюс в ПЛИС и прочих смежных с этим делом вещах только начал разбираться.
Да, смысл конкретно этой статьи был именно показать, как использовать. Вообще надо бы добавить, что лучший результат получится, если у UART есть FIFO, поскольку тогда период будет выдержан железобетонно (в статье и здесь же в комментариях описал, почему с обычным UARTом это может быть не так).
Про ШИМ не очень понял. В курсовом проекте ШИМ генерируется на звуковых частотах...
Какие разные частоты? Я просто сказал, что если генерировать сигнал при тактовой частоте таймера ниже определённого значения, то при плавном изменении коэффициента заполнения будут слышны артефакты. В моём проекте таймеры тактируются на достаточно высокой частоте, чтобы этого слышно не было.
У меня курсовой проект называется «Устройство программно-аппаратного синтеза звука», если я правильно помню. Изначально приписки «программно-» вообще не было, она появилась по причине того, что можно получить новые тембры, если быстро переключать настройки канала. Но сам синтез строго аппаратный. Я пробовал сделать программный синтез: https://github.com/LTVA1/flizzer_tracker и https://youtu.be/dLWK_Au_vbM, однако там были проблемы с невозможностью добавить оверсэмплинг по причине ограниченных вычислительных мощностей. Без оверсэмплинга и ферритовых фильтров в проводе с аудиоджеком звучит не очень хорошо. Плюс преподаватель настаивал на проектировании какой-то достаточно сложной обвязки для полученич оценки «отлично», и простой аудиоджек явно на требуемую сложность не тянул. Поэтому решил попробовать с внешними DDS-генераторами, генератором шума и прочими аппаратными делами.
Я не собираюсь никакие гармоники генерировать. Я говорил про восприятие ШИМ-сигнала на слух. Посмотрите верхние четыре канала здесь, чтобы понять, о чём я: https://youtu.be/L5HF_qdjZyU
Требования: настройка коэффициента заполнения от 0 до 100% с точностью не хуже 1%, диапазон частот от 10 Гц до пусть будет 4 кГц. При этом частота счёта счётчика, на базе которого ШИМ генерируется, не менее 500 кГц. Почему? Потому что послушайте сгенерированный на компьютере ШИМ сигнал 2 кГц с плавно меняющимся коэффициентом заполнения при сэмплрейте 44100 Гц. Услышите алиасинг. Для того, чтобы его уменьшить, нужно применить оверсэмплинг, желательно 16х. Так и приходим к вышеозвученной частоте. Таймеры микроконтроллера работают у меня на частоте 72 МГц, ну и остальным требованиям соответствуют. Единственный минус — на разных частотах разная сетка коэффициента заполнения (поскольку меняем значение в регистре ARR для смены частоты). Но на всех частотах она достаточно мелкая, чтобы выдерживалась точность в 1%.
Хорошо, возможно, требования слишком строгие. Можно уменьшить интервал частот, например до 100 Гц — 1 кГц. Если забить на реальную точность кварца, то всё равно получится, что прерывание-«диспетчер» придётся вызывать слишком часто. Я эту проблему решил путём использования аппаратных счётчиков, в том числе тех, которые не совсем для этого предназначены.
Покажите или расскажите, как сделать четыре ШИМ-сигнала с полностью независимыми частотами и коэффициентами заполнения на каком-нибудь таймере в STM32F303. Я способа не нашёл. По блок-схемам счётчик там один, а вот ШИМ-контроллеров четыре и более. Но внутри ШИМ-контроллеров своих счётчиков нет, ну или я невнимательно смотрел. Я могу независимо управлять коэффициентом заполнения каждого канала, но частота у них будет общая.
Не один. Там будет довольно сложный обработчик, который будет очень часто вызываться, поскольку у меня большие требования к точности выдерживания частоты. В результате процессорное ядро будет тратить на это кучу времени.
Выше другим уже пояснял. Слишком часто вызывалось бы прерывание, если бы было реализовано на одном таймере. А внутри самого кода крутить программные задержки нельзя, потому что там поток команд исполняется.
Автор, а почему Вы не захотели использовать PDM режим I2S? Это почти что полноценный ЦАП, частотно-импульсная модуляция. Можно было бы настоящий полифонический звук играть, ну, в меру убогости пищалки, конечно
А где именно это написано, если не секрет? Пошёл гуглить, хер найдёшь вообще официальный источник со списком. У опсосов одно, в новостях другое, плюс он постоянно меняется. Дебилизм.
У кортекса аппаратный умножатор есть, а в конкретно этом RISC-V ядре его нет.
Так точно. Предположу, что дипсик.
А Сишного компилятора на эту штуку точно нет? Я бы поигрался, пусть и проц аппаратно под жабу, как тут пишут. Конечно, дум не сделаешь, но интересны конкретные ТТХ — набор инструкций ЦП, скорость их исполнения, тактовые частоты, объём ПЗУ/ОЗУ, наличие аппаратных ускорителей и прочей периферии... И карта областей памяти со всеми регистрами периферии :)
Да, и я в других ответах расписал, почему не получилось использовать H743
Это уже будет не аппаратный синтез. Опять же, программный я уже делал. И я не понял, что за щелчки
Те DDS-генераторы, которые я использовал, не умеют генерировать прямоугольную волну с изменяемым коэффициентом заполнения. Умеют только меандр. И поскольку я по опыту изучения MOS Technology SID знаю, как изменяемый коэффициент заполнения может разнообразить звучание, я каждый из четырёх каналов сделал через аналоговый мультиплексор. Мультиплексор подключает на вход управляемого аттенюатора либо сигнал с DDS (треугольная волна или синус), либо сигнал с вывода микроконтроллера (ШИМ). После аттенюаторов сигналы суммируются аналогово на операционнике и подаются на джек
Если честно, всегда хотел такую штуку сделать. А тут как раз случай подвернулся. Вообще хотелось бы сделать свой звуковой чип, но это, понятное дело, невозможно из-за цены, плюс в ПЛИС и прочих смежных с этим делом вещах только начал разбираться.
Ну работает же :)
Здравствуйте, я выше уже пояснял, как я использовал все таймеры: https://habr.com/ru/articles/871564/comments/#comment_27744520. Также можете посмотреть исходники на гитхабе, ссылка на репозиторий в самом начале статьи.
Да, смысл конкретно этой статьи был именно показать, как использовать. Вообще надо бы добавить, что лучший результат получится, если у UART есть FIFO, поскольку тогда период будет выдержан железобетонно (в статье и здесь же в комментариях описал, почему с обычным UARTом это может быть не так).
Про ШИМ не очень понял. В курсовом проекте ШИМ генерируется на звуковых частотах...
Какие разные частоты? Я просто сказал, что если генерировать сигнал при тактовой частоте таймера ниже определённого значения, то при плавном изменении коэффициента заполнения будут слышны артефакты. В моём проекте таймеры тактируются на достаточно высокой частоте, чтобы этого слышно не было.
У меня курсовой проект называется «Устройство программно-аппаратного синтеза звука», если я правильно помню. Изначально приписки «программно-» вообще не было, она появилась по причине того, что можно получить новые тембры, если быстро переключать настройки канала. Но сам синтез строго аппаратный. Я пробовал сделать программный синтез: https://github.com/LTVA1/flizzer_tracker и https://youtu.be/dLWK_Au_vbM, однако там были проблемы с невозможностью добавить оверсэмплинг по причине ограниченных вычислительных мощностей. Без оверсэмплинга и ферритовых фильтров в проводе с аудиоджеком звучит не очень хорошо. Плюс преподаватель настаивал на проектировании какой-то достаточно сложной обвязки для полученич оценки «отлично», и простой аудиоджек явно на требуемую сложность не тянул. Поэтому решил попробовать с внешними DDS-генераторами, генератором шума и прочими аппаратными делами.
Вот для этого, внимание на четыре верхних канала: https://youtu.be/L5HF_qdjZyU
Я не собираюсь никакие гармоники генерировать. Я говорил про восприятие ШИМ-сигнала на слух. Посмотрите верхние четыре канала здесь, чтобы понять, о чём я: https://youtu.be/L5HF_qdjZyU
Требования: настройка коэффициента заполнения от 0 до 100% с точностью не хуже 1%, диапазон частот от 10 Гц до пусть будет 4 кГц. При этом частота счёта счётчика, на базе которого ШИМ генерируется, не менее 500 кГц. Почему? Потому что послушайте сгенерированный на компьютере ШИМ сигнал 2 кГц с плавно меняющимся коэффициентом заполнения при сэмплрейте 44100 Гц. Услышите алиасинг. Для того, чтобы его уменьшить, нужно применить оверсэмплинг, желательно 16х. Так и приходим к вышеозвученной частоте. Таймеры микроконтроллера работают у меня на частоте 72 МГц, ну и остальным требованиям соответствуют. Единственный минус — на разных частотах разная сетка коэффициента заполнения (поскольку меняем значение в регистре ARR для смены частоты). Но на всех частотах она достаточно мелкая, чтобы выдерживалась точность в 1%.
Хорошо, возможно, требования слишком строгие. Можно уменьшить интервал частот, например до 100 Гц — 1 кГц. Если забить на реальную точность кварца, то всё равно получится, что прерывание-«диспетчер» придётся вызывать слишком часто. Я эту проблему решил путём использования аппаратных счётчиков, в том числе тех, которые не совсем для этого предназначены.
Покажите или расскажите, как сделать четыре ШИМ-сигнала с полностью независимыми частотами и коэффициентами заполнения на каком-нибудь таймере в STM32F303. Я способа не нашёл. По блок-схемам счётчик там один, а вот ШИМ-контроллеров четыре и более. Но внутри ШИМ-контроллеров своих счётчиков нет, ну или я невнимательно смотрел. Я могу независимо управлять коэффициентом заполнения каждого канала, но частота у них будет общая.
Не один. Там будет довольно сложный обработчик, который будет очень часто вызываться, поскольку у меня большие требования к точности выдерживания частоты. В результате процессорное ядро будет тратить на это кучу времени.
Выше другим уже пояснял. Слишком часто вызывалось бы прерывание, если бы было реализовано на одном таймере. А внутри самого кода крутить программные задержки нельзя, потому что там поток команд исполняется.