Обновить
10
0

Пользователь

Отправить сообщение

У кортекса аппаратный умножатор есть, а в конкретно этом 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. Я способа не нашёл. По блок-схемам счётчик там один, а вот ШИМ-контроллеров четыре и более. Но внутри ШИМ-контроллеров своих счётчиков нет, ну или я невнимательно смотрел. Я могу независимо управлять коэффициентом заполнения каждого канала, но частота у них будет общая.

Не один. Там будет довольно сложный обработчик, который будет очень часто вызываться, поскольку у меня большие требования к точности выдерживания частоты. В результате процессорное ядро будет тратить на это кучу времени.

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

Ну да. Я просто к тому, что таймер, опять же, молотит постоянно. А мой UART сам не крутится, его надо подпинывать постоянно, либо вручную, либо через DMA. В теории этого недостатка, кстати, можно избежать на тех микроконтроллерах, где у UART есть FIFO. Сделать прерывание по полупустому FIFO, например. UART из FIFO новое значение достаёт мгновенно (или же, по крайней мере, со строго определённой задержкой, на которую вышеописанные факторы не влияют). И всегда в FIFO есть запас, то есть пофиг, что проц немного потупит.

Таймеры как раз хороши тем, что выставили сигнал прерывания, сбросили счётчик в ноль и им до лампочки, что там микроконтроллер тупит, они пошли следующий интервал считать :) То есть интервалы у него постоянные (с точностью до постоянства тактовой частоты, разумеется) Причём тут ШИМ вообще не понял, ШИМ в простейшем случае это тупо компаратор, на входе которого две шины — состояние счётчика таймера и значение регистра управления коэффициентом заполнения, и его выход a > b (или a < b, или a <= b, или a >= b, это уже детали) подключён к ножке. Это если сильно упрощать. Он же никак на работу самого таймера не влияет (опять же, в простейшем случае. Не знаю, что там STM накрутили в advanced control таймерах)

1

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность