Анализатор свиста на cortex-m4 или включение нагрузки по свистку

Анализатор свиста на Cortex-M4 или включение нагрузки по свистку

Как говорится, лучше один раз увидеть, чем сто раз услышать:

Почему этот проект и именно сейчас?

Обычно, я всегда обдумываю проект перед поиском компонентов. Для проекта the whistled (анализатор свиста), все пошло по-другому. Несколько месяцев назад, когда был приобретен микроконтроллер Cortex M4 с 32-выводами, у меня было множество идей, и проект анализатора свиста был одной из них.
Как упоминалось в видеоролике, данный небольшой микроконтроллер Kinetis K10 может выполнять около 80 [q15 2048 балов] быстрых преобразований Фурье (FFT) в секунду и еще оставляет пользователю дополнительное процессорное время для запуска собственных алгоритмов.

Это объясняется тем, что микроконтроллер Cortex M4 имеет набор инструкций для цифровой обработки сигналов (DSP), который особенно пригоден для обработки данных, а также потому, что библиотека ARM CMSIS предоставляет нам уже оптимизированный код для выполнения более сложных функций, таких как быстрое преобразование Фурье.
Поскольку все подготовительные работы выполнены, я смог сфокусироваться на расчете фильтра и алгоритмов по распознаванию свиста.
На это ушло много времени и потребовалось множество тестовых процедур.

Спецификация и схемные решения

Итак, принципиальная схема:

Как видите, схемы состоят из довольно простых и компактных компонентов.
На них показаны:
— Несколько ферритовых катушек (L1/L2/L3) для фильтрации паразитных помех, которые могут присутствовать в системе или появляться при срабатывании транзистора Q2
— Р-канальный МОП-транзистор (Q1) для защиты соединений от обратной полярности (с каждым может случиться)
— Стандартный линейный преобразователь LDO ( U1 ) на 3.3 В
— Основной микроконтроллер Cortex M4 ( U3 )
— Mosfet драйвер ( U4 ) вместе с N-канальным МОП-транзистором ( Q2 ) позволяют выполнить правильное диммирование (изменение уровня яркости) при больших нагрузках
— Микрофонный усилитель с автоматической регулировкой усиления ( AGC) ( U2 ), параметры которого довольно трудно установить.

Все дорожки на печатной плате, к которым можно прикоснуться, имеют защиту от электростатического разряда, а именно: источник электропитания и сток N-канального МОП-транзистора, поскольку все остальные части печатной платы покрыты прозрачной термоусадочной трубкой. Для своего проекта я хотел иметь защиту от дурака (без обид).
Наибольшее преимущество микроконтроллера Kinetis K10 заключается в том, что он имеет 16-битный таймер с ШИМ-выходами, что в результате приводит к широкому диапазону диммирования.
Платформа позволяет использовать напряжение в диапазоне от 4.5 В до 18 В, с максимальным током 5 A на входах.

Вы также можете управлять нагрузкой мощностью до 90 Ватт с помощью данного устройства размером всего лишь 55 x13 мм !
И конечно, на плате размещаются контактные площадки для последовательного отладочного порта SWD, который используется для загрузки вашей программы.

Перечень компонентов

Таблица используемых компонентов и их стоимость показана ниже.

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

Печатная плата

Как видите, все компоненты умещаются на данной компактной плате.
Первые прототипы было трудно спаять, поскольку выводы MAX9814 имеют шаг 0.4 мм.
Для защиты от электростатического разряда используется термоусадочная трубка, однако она не перекрывает микрофон. На нижнем слое я установил замыкающие цепи через землю между микроконтроллером/аналоговыми компонентами и силовыми цепями схемы, чтобы при усилении звука не происходило возбуждения из-за наведенных помех при переключении.

Конечная толщина медного покрытия составляет 60 мкм, что приводит к повышению температуры на 7 градусов при токе 5 А для дорожек, по которым протекает высокий ток.

Удобство использования

Как уже упоминалось, плата имеет незакрытые аппаратные компоненты и 4 контактные площадки для подключения отладочного порта SWD (3.3 В / 0 В / clock (синхроимпульс) / data (данные)):

Так что, если у вас есть некоторые необычные идеи для данной платформы, дайте волю своей фантазии.
Мощные вычислительные возможности микроконтроллера Cortex M4 дадут возможность сделать намного больше, а не просто распознать свист. Я просто уверен, что множество таких применений могут даже «подсветить» вечеринку.

Вы также сможете использовать «последовательность секретных звуков» для открытия дверей или сейфов.

Файлы

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

Схемы довольно простые, поэтому вы легко сможете разработать печатную плату с помощью CAD программного обеспечения.
Когда вы будете работать над программным кодом, то все что вам нужно, так это запустить ваши алгоритмы с переменной working_buffer в функции run_recognition_algo в конце кода main.c

Алгоритм

Благодаря большому количеству полученных комментариев, я бы хотел немного разъяснить общую структуру текущего применяемого алгоритма.
Я создал рабочий алгоритм, но убежден, что кто-нибудь сможет сделать его намного лучше. Созданный алгоритм пригоден только для данной платформы, и что немало важно, для текущей реализации (два последовательных свиста для включения/выключения). Поэтому я не уверен, что алгоритм будет полезен для тех, кто хочет собрать платформу на скорую руку.
Если вы на самом деле хотите создать алгоритм таким же способом как и я, тогда прочтите следующие рекомендации:
— Определите два последовательных пиковых значения в быстром преобразовании Фурье при различных частотах.
— Проверьте ширину данных пиковых значений.
— В зависимости от того, как вы свистите, проконтролируйте отклонение частоты первого пикового значения.
— Проверьте выделение сигнала между высотой пикового значения и близлежащих пиковых значений.
— Выполните одно или два быстрых преобразований Фурье без учета пиковых значений, предположив, что ваш свист непрерывный, хотя фактически таким не является.
— Разрешите только один частотный диапазон свиста (с 8 по 46 в текущем алгоритме).
Созданный алгоритм основывается на ложном распознавании сигналов (ложное распознавание) и ложном не распознавании сигналов (без распознавания, когда вы свистите), поскольку люди свистят по-разному.
Поэтому для вас будет легче написать свой собственный код для свиста, чем быть таким же терпеливым, как я.

Заключение

Я полностью уверен в данном проекте. Поэтому я предпринял попытку и решил задачу самостоятельно.
Данное решение было одобрено со стороны многих знакомых и коллег, которые нашли проект анализатора свиста очень удобным в использовании для автоматизации их домов. Если данный проект будет успешным, я планирую создать новую линейку продуктов, которые будут использовать данный принцип работы.
Поэтому если вы заинтересовались данным проектом, я буду рад, если вы загляните на мою страничку tindie page.

Миландр

Текущее время: 2021-июл-29 22:04

Часовой пояс: UTC+03:00

Обсуждение FT микроконтроллера (ядро ARM Cortex-M4F)

Ого! а подробности можно (для тех, кто на семенаре не был)? =)

Высокопроизводительный процессор цифровой обработки сигнала — это отечественный блекфин?)

Читайте также  Защита светодиода от обратного напряжения

Кортекс-М4F? Божественно. только двух таймеров (32-х битных надеемся?) кому-то может быть маловато) Ещё и 5 Вольт от рождения понимает? чудееесно) (а то 2килорубля не всеггда есть за стабилизатор) Детекторы тактовой? Замечательно)

Планируте замахнуться и на R-семейство?

ЗЫ. А разрешите узнать любопытства ради: каждое ядро у АРМ лицензируется отдельно или вы их оптом понабрали со скидкой? (М0, М3, М4Ф) Или даже покристальные отчисления требуют?

prostoRoman писал(а):

Ого! а подробности можно (для тех, кто на семенаре не был)? =)

Высокопроизводительный процессор цифровой обработки сигнала — это отечественный блекфин?)

Кортекс-М4F? Божественно. только двух таймеров (32-х битных надеемся?) кому-то может быть маловато) Ещё и 5 Вольт от рождения понимает? чудееесно) (а то 2килорубля не всеггда есть за стабилизатор) Детекторы тактовой? Замечательно)

Планируте замахнуться и на R-семейство?

ЗЫ. А разрешите узнать любопытства ради: каждое ядро у АРМ лицензируется отдельно или вы их оптом понабрали со скидкой? (М0, М3, М4Ф) Или даже покристальные отчисления требуют?

Yura писал(а):
prostoRoman писал(а):

Ого! а подробности можно (для тех, кто на семенаре не был)? =)

Высокопроизводительный процессор цифровой обработки сигнала — это отечественный блекфин?)

Кортекс-М4F? Божественно. только двух таймеров (32-х битных надеемся?) кому-то может быть маловато) Ещё и 5 Вольт от рождения понимает? чудееесно) (а то 2килорубля не всеггда есть за стабилизатор) Детекторы тактовой? Замечательно)

Планируте замахнуться и на R-семейство?

ЗЫ. А разрешите узнать любопытства ради: каждое ядро у АРМ лицензируется отдельно или вы их оптом понабрали со скидкой? (М0, М3, М4Ф) Или даже покристальные отчисления требуют?

Yura писал(а):
goussack писал(а):
Yura писал(а):

Все гораздо сложнее.

Выбор стоит в том какую концепцию применить:
Концепция 1. Одно ядро, максимум некий простенький аппаратный детектор сбоев
Плюсы: Нам как разработчикам кристалла все легко, можно реализовать «жирное» ядро.
Минусы: FT будет реализовано, только за счет технологии. Аппаратного исправления сбоев в ядре нет. Все ложится на софт. Обнаружение ошибок затруднено. Троирование на верхнем уровне в системе.

Предполагаемый уровень стойкости некий условный «К».

Концепция 2. Два ядра, Второе ядро чекает состояние первого,
Плюсы: Как то еще можно реализовать два «жирных» ядра. Практически 100% обнаружение сбоев, но без исправления. Если не нужен контроль на уровне второго ядра, то можно запускать разные программы на ядрах. Увеличение производительности.
Минусы: FT будет реализовано, только за счет технологии и аппаратное обнаруджение сбоев. Аппаратного исправления сбоев все равно нет. Все ложится опять таки на софт. Троирование на верхнем уровне в системе.

Предполагаемый уровень стойкости все тот же «К». Возможно даже будет меньше.
В этой концепции более интересно R4, так как уже на уровне самого ядра заложены механизмы синхроннного запуска двух ядер.

Концепция 3. Три ядра, мажоритарный контроль
Плюсы: Обнаружение и исправление одиночных ошибок, но ТРИ ядра, по 0.18 — это даже с M3 многовато, а очень хочется M4F как минимум. FT будет во весь рост.
Минусы: Очень большой кристалл. Практически бесполезный=дорогой для «некосмических применений»

Предполагаемый уровень стойкости максимум «2*К».

Из идей. Плюнуть на многоядерность, а все направить на мажоритарный контроль который будет реализовываться наверхнем уровне системы.

Вообщем, все сумбурно, так как пока еще в голове собственного решения нет.

Свист из воздуховодов при включении кондиционера

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Вот только приехал. Перетёрлась трубка, проходящая вдоль моторного щита. Случай признали гарантийным, заказали трубку. Когда приедет — поменяют.

На первом фото подставили бумажку для визуализации подтекание.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Вот только приехал. Перетёрлась трубка, проходящая вдоль моторного щита. Случай признали гарантийным, заказали трубку. Когда приедет — поменяют.

На втором фото подставили бумажку для визуализации подтекание.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

Т.к. вы неавторизованы на сайте. Войти.

Т.к. тема является архивной.

было так же, ездил по гарантии(популярная проблема рапида)
чуть накладку двери ниже приспустили и пропал свист
чтобы проверить то же это самое или нет, ты попробуй дверь чуть приоткрыть когда свист будет
если пропал свист — езжай к дилеру

сперва пишу потом читаю ответы)
видимо это не мой вариант)

1. Обзор ядра!

STM 32 F 4 – Cortex M 4

2. ARM Cortex – M4

Бинарная совместимость ядер Cortex- M

Сравнение ядер Cortex – M

Instruction set architecture

Thumb, Thumb-2 System Instructions

Thumb + Thumb-2, DSP, SIMD, FP

Memory Protection Unit (MPU)

Integrated trace option (ETM)

Fault Robust Interface

Single Cycle Multiply

Bit banding support

Single cycle DSP/SIMD

Floating point hardware

3. DSP-параметры

3.1. Характеристики ядра Cortex-M4

· Полная совместимость с Cortex – M 3

· Модуль MAC (Single-cycle multiply-accumulate)

· Оптимизированные инструкции SIMD (single instruction multiple data )

· Инструкции насыщения (Saturating)

· Модуль Floating – Point Unit одинарной точности ( FPU ), опционально

· Аппаратное деление (2-12 цикла), также как в Cortex – M 3

Читайте также  Разводка автомагнитолы "ямаха"

4. 16-бит DSP-инструкции в Cortex-M4

· Использование DSP инструкций в задачах с 16-бит данными

· Cortex – M 4 имеет преимущество от 30% до 70%

5. 32-бит DSP-инструкции в Cortex-M4

· Использование DSP инструкций в задачах с 32-бит данными

· Cortex – M 4 имеет преимущество от 25% до 60%

6. Проигрывание

Необходимая частота в МГц для декодирования MP3

7. Модуль MAC

· Модуль умножения позволяет выполнить за 1 цикл инструкции MUL или MAC :

o Signed/Unsigned Multiply

o Signed/Unsigned Multiply-Accumulate

o Signed/Unsigned Multiply-Accumulate Long (64- бит )

o 2 операции 32-бит MAC

o До 7 операции 8-бит MAC

o 4 операции 16-бит MAC (двойной 16-бит MAC)

8. 1-цикловой MAC в Cortex-M4

SMULBB, SMULBT, SMULTB, SMULTT

16 x 16 + 32 = 32

SMLABB, SMLABT, SMLATB, SMLATT

16 x 16 + 64 = 64

SMLALBB, SMLALBT, SMLALTB, SMLALTT

(16 x 32) + 32 = 32

(16 x 16) ± (16 x 16) = 32

SMUAD, SMUADX, SMUSD, SMUSDX

(16 x 16) ± (16 x 16) + 32 = 32

SMLAD, SMLADX, SMLSD, SMLSDX

(16 x 16) ± (16 x 16) + 64 = 64

SMLALD, SMLALDX, SMLSLD, SMLSLDX

32 ± (32 x 32) = 32

(32 x 32) + 64 = 64

(32 x 32) + 32 + 32 = 64

32 ± (32 x 32) = 32 (upper)

SMMLA, SMMLAR, SMMLS, SMMLSR

(32 x 32) = 32 (upper)

Все вышеперечисленный операции выполняются за 1 цикл на Cortex – M 4

9. Арифметика насыщения (saturated)

· Предотвращение переполнения переменных отсечением мин/макс границ и снижение нагрузки на ядро

10. Инструкции SIMD

· Single Instruction Multiple Data

· Оперирование пакетированными данными ( packed data )

· Параллельная работа с несколькими операндами 8-бит или 16-бит данных

o двойной 16-бит MAC (Результат = 16 x 16 + 16 x 16 + 32)

o Параллельность операций

o Минимизация количества инструкций загрузки/хранения для обмена между памятью и банком регистров, 2 или 4 транзакции данных за 1 цикл, если нет необходимости в 32-бит данных

11. Пакетирование данных

· Байт или 2 байта пакетируются в слова

· Более эффективный доступ к структурам данных

· Инструкции капсуляции и инкапсуляции данных

12. Бесплатная DSP lib от ARM

· DSP библиотека для Cortex-M4

o Быстрое освоение

o Абстракция от низкоуровневого программирования

· Анализ конкурентных режимов при одинаковых условиях

· Ускорение использования наработок сторонних производителей

· Простота использования для полшьзователя

o Минимальный барьер – простота освоения и использования

· Одна стандартная библиотека – во всех проектах

o ARValueM библиотека DSP + ваше приложение

o Использование совместно с другими средствами проектирования – матлаб и т.д.

13. Функции DSP lib

· Базовая математика – векторная математика

· Быстрые тригоном. функции sin , cos , sqrt и т.д.

· Интерполяция – линейная, билинейная

· Статистика – макс, мин, и т.д.

· Фильтрация – IIR , FIR , LMS и т.д.

· Преобразования – БПФ и т.д.

· Функции для работы с матрицами

· Поддержка функций – копия/заполнение массивов, конвертирование типов данных

14. Инструменты

o Генрация готового кода

o В разработке (возможно в конце года)

o Aimagin (Rapidstm32)

o Очень много продуктов, большинство платные:

15. Floating Point Unit

FPU : Floating Point Unit

o Количество форматов

o Арифметические операции

o Количество преобразований

o Определение значений

o режима округления

ARM Cortex-M FPU ISA

o Add , subtract , multiply , divide

o Умножение и аккумулирование Вычисление квадратного корня

16. Использование FPU

17. Пример кода на C

18. Производительность

Сравнение времени выполнения КИХ – фильтра по 29 коэффициентам(32 бита) с и без FPU (Библиотека CMSIS)

19. Программные средства

· Доступны с www . st . com / mcu

· C source code for easy implementation of all STM32 peripherals in any application

· Стандартная библиотека – открытые исходники для всей периферии STM 32

· Библиотека Motor Control – векторный контроль на основе датчиков для 3х фазных бесщеточных двигателей

· DSP библиотека – PID , IIR , FFT , FIR (бесплатно)

· Аудио библиотека – MP 3/ WMA декодер, контроль громкости, эквалайзер

· (бесплатно с лицензиоонными ограничениями).

Midway777 › Блог › Свистит ремень генератора — причины и способы их устранения. Почему при нагрузке появляется свист ремня генератора?

Каждый из вас, наверное, не раз замечал такое явление, когда проезжающий мимо автомобиль помимо привычного автомобильного шума, издавал противный свист, визг или скрип, кто как это называет… Замечали? Или возможно, у вас самих машина свистит как «соловей-разбойник», а вы не знаете в чем дело и, что с этим делать? Причина этого противного свиста чаще всего находится где-то в области генератора, а где конкретно вы сейчас и узнаете.

Свист ремня генератора — возможные причины

Как правило, свистит ремень генератора. Обычно это происходит «на холодную» или в сырую погоду, когда вы только завели мотор и включили одновременно много источников потребления питания (печка, кондиционер, фары, магнитолу, подогрев сидений или заднего стекла).

1.Причина первая — ремень генератора. Свист ремня генератора может возникнуть из-за ремня, который требует замены. Поликлиновый ремень, он же ручейковый ремень, или ремень генератора плотно входит в борозды, имеющиеся на шкивах, однако со временем из-за естественного износа и тяжелых условий эксплуатации, этот ремень приходит в негодность. Также свист ремня генератора может появиться по причине песчинок, которые попали на поверхность этого ремня и въелись в борозды. Во время нагрузки на этих песчинках ремень проскальзывает, в результате чего возникает неприятный громкий свист. Проверьте состояние ремня, если на его поверхности есть трещины, видны застрявшие песчинки или вовсе торчат нитки — немедленно замените ремень генератора.

2. Вторая причина почему свистит ремень генератора — плохое натяжение. Нередко, после замены ремня генератора, его плохо натягивают, в результате чего во время нагрузок, а также в сырую погоду, ремень генератора свистит. Лечится это простым подтягиванием ремня, здесь важно не переусердствовать.

3. Третий «подозреваемый» — шкив или шкивы. Если на шкивах есть выработка или они менялись (установка неоригинальных шкивов чревата свистом и прочими проблемами), появление свиста вполне объяснимо. Неплотное прилегание поликлинового ремня к бороздам на шкиве ухудшает сцепление, в результате ремень генератора начинает проскальзывать и свистеть. Чтобы не допустить подобного, покупайте только оригинальные автозапчасти и следите за состоянием ремня генератора и шкивов.

4. На ремень попала жидкость. Нередко ремень генератора свистит из-за того, что на его рабочую поверхность попала жидкость (антифриз, масло, топливо и т. д.). Моторное и трансмиссионное масло, а также жидкость ГУРа довольно часто становятся причиной проскальзывания ремня на шкивах. Как эти жидкости туда попадают? Все очень просто, это может быть банальная утечка масла через прокладку или сальник, а также неосторожная замена вышеописанных жидкостей. Проверьте, нет ли утечек масла и ОЖ в вашем двигателе, и обратите внимание на ремень и шкивы, они должны быть сухими. Иногда случается, что свист ремня появляется в сырую погоду, например, в дождь. В данном случае причина может быть очень банальной, во время проезда глубокой лужи в моторный отсек (на ремень) попала вода, в результате чего и возник неприятный свист.

5. Нагрузка на генератор может вызвать свист генератора. Как я уже говорил, ремень чаще всего свистит «на холодную», когда вы включаете множество энергопотребителей. Происходит следующее: из-за большого потребления электрического тока, возрастает нагрузка на генератор, следовательно, увеличивается сопротивление магнитного поля вращению статора. В результате генератор как бы «тормозит» ремень, в результате чего возникает трение поверхностей, которое выражается в виде неприятного свиста.

Читайте также  Мощные свч-транзисторы philips semiconductors

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

После того как вы услышите свист ремня генератора, не стоит отчаиваться, это, как говорится, не смертельно, однако и затягивать с этим нельзя. Во-первых, это раздражает как вас, так и окружающих, а во-вторых свист ремня — это «звоночек», который нередко может сигнализировать о более серьезных неисправностях.

ARM Cortex-M4: внешняя шина, smc #5

Параллельный интерфейс микроконтроллеров, известный как EBI , используется почти во всех проектах с TFT дисплеями, внешней памятью и т.п. Он обладает высокой скоростью передачи и большим адресуемым объемом.

Теория

Про параллельный интерфейс я писал ранее и затронул конкретное семейство контроллеров SAM3X . Он ничуть не изменился: шина данных, шина адреса и пара управляющих сигналов.

Все задержки, как правило, настраиваются под конкретное устройство. Максимальная ширина шины данных: 16бит, а ширина адреса: 24бит — это позволяет адресовать 32МБайта. Кстати, многие считают этот интерфейс асинхронным, однако нам ничего не мешает использовать PCK для генерации тактовой частоты в порт.

Устройство

Внешняя шина управляется контроллером SMC, который фактически выводит наружу внутренние линии связи между ЦП и периферией.

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

  • NRD — сигнал чтения. [выход]
  • NWE — сигнал записи. [выход]
  • NCS[3:0] — четыре линии выборки устройства, привязанных к каналам. [выход]
  • NWAIT — сигнал ожидания от устройства. [вход]

Первое, с чего нужно начать: включить систему тактирования:

Одним из основных регистров SMC является SMC_MODE , задающий следующие параметры.

Параметр Описание
SMC_MODE_DBW_8_BIT Инициализация шины данных 8бит
SMC_MODE_DBW_16_BIT Инициализация шины данных 16бит
SMC_MODE_WRITE_MODE Использовать сигнал NWE
SMC_MODE_READ_MODE Использовать сигнал NRD
SMC_MODE_EXNW_MODE_FROZEN Сигнал WAIT будет останавливать передачу
SMC_MODE_EXNW_MODE_READY Сигнал WAIT будет завершать передачу

Для стандартной инициализации интерфейса с шириной шины данных 8бит на канале CS0 код будет следующий:

SMC0->SMC_WPMR = 0x534D43; //Очень черная магия SMC0->SMC_CS_NUMBER[0].SMC_MODE = SMC_MODE_DBW_8_BIT | SMC_MODE_WRITE_MODE | SMC_MODE_READ_MODE;

Вы можете использовать всю шину 16бит, но это не увеличит скорость передачи точно в два раза. Возникает проблема выравнивая данных.

Сигнал WAIT , в частности его режим FROZEN , может очень помочь, если ваше устройство не может постоянно работать на шине. Достаточно установить 0 на линии, и передача приостановится.

Следующим регистром настройки будет SMC_CYCLE , который устанавливает количество тактов MCLK для записи или чтения 1-ед. данных.

Параметр (Atmel Studio) Описание
SMC_CYCLE_NRD_CYCLE(x) x — циклы чтения
SMC_CYCLE_NWE_CYCLE(x) x — циклы записи

Если ваше устройство — SRAM, то необходимо смотреть параметр taa на чтение и запись, а затем разделить его на период тактовой частоты. Почти для всех 10ns SRAM и частоте контролера > 100MHz подойдет следующая конфигурация:

SMC0->SMC_CS_NUMBER[0].SMC_CYCLE = SMC_CYCLE_NRD_CYCLE(4) | SMC_CYCLE_NWE_CYCLE(2);

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

Регистры SMC_SETUP и SMC_PULSE задают длительности и задержки управляющих сигналов.

SMC_SETUP (Atmel Studio) Значение
SMC_SETUP_NRD_SETUP(x) x — циклы до установки NRD
SMC_SETUP_NCS_RD_SETUP(x) x — циклы до установки CS и NRD
SMC_SETUP_NWE_SETUP(x) x — циклы до установки NWE
SMC_SETUP_NCS_WE_SETUP(x) x — циклы до установки CS и NWE
SMC_PULSE (Atmel Studio) Значение
SMC_PULSE_NRD_PULSE(x) x — длина импульса NRD
SMC_PULSE_NCS_RD_PULSE(x) x — длина импульса NCS и NRD
SMC_PULSE_NWE_PULSE(x) x — длина импульса NWE
SMC_PULSE_NCS_WE_PULSE(x) x — длина импульса NCS и NWE

Здесь вам необходимо внимательно просмотреть документацию на SRAM или что-то другое. Диаграмма сигналов для чтения выглядит точно так же.

Заметьте, что всегда должно выполнятся условие: xcycle = 1 + xpulse + xsetup И в основном, 10-12ns SRAM не требуют ожидания перед установкой сигналов:

SMC0->SMC_CS_NUMBER[0].SMC_SETUP = SMC_SETUP_NCS_RD_SETUP(0) | SMC_SETUP_NCS_WR_SETUP(0) | SMC_SETUP_NRD_SETUP(0) | SMC_SETUP_NWE_SETUP(0); SMC0->SMC_CS_NUMBER[0].SMC_PULSE = SMC_PULSE_NCS_RD_PULSE(3) | SMC_PULSE_NCS_WR_PULSE(1) | SMC_PULSE_NRD_PULSE(3) | SMC_PULSE_NWE_PULSE(1);

Кстати, если вам необходимо только передавать данные во внешнее устройство или только принимать, можете не устанавливать биты WRITE_MODE или READ_MODE , тогда всеми операциями будет руководить CS сигнал.

Подключение

Внешним устройством может быть как и SRAM, так вообще все, что угодно. (ПЛИС, например) От выбранной ширины шины данных зависит способ подключения:

Заметьте, что при использовании 16бит интерфейса добавляется еще один сигнал: NBS1 . Благодаря ему и A0 у нас будет возможность по-байтово работать с данными и не выравнивать их. Сигналы: WE , RD , CS , WAIT — инверсные.

Настройка портов

Как и для всей периферии, в ARM нужно настроить PIO для каждого канала, а линий там куча. Я вывел все необходимое на отладочной плате:

Инициализация портов довольно трудоемкое дело. Я приложил файл здесь.

Использование

Нам остается просто объявить указатель на тот или иной канал:

uint8_t* ptr = (uint8_t*)EBI_CS0_ADDR;

За константой скрывается адрес 0x60000000 — это наше внешнее устройство. Пользуемся как хотим 🙂 .

Проверка

Хочу заметить, что параллельный интерфейс находится в адресном пространстве МК также на правах памяти, поэтому с ним можно работать как с массивом/переменной, использовать функции memcpy и даже исполнять оттуда код.

Но я возьму довольно простой пример: подключить к нему Delta-Sigma ЦАП, созданный на ПЛИС. Задача проста: нам нужно отправлять сэмплы PCM файла ЦАП-у с заданной частотой дискретизации.
Здесь нам даже не понадобиться тактовый сигнал и вся шина адреса. Со стороны МК требуется отправлять сэмплы по прерыванию таймера.

#include #include «snd.h» #include uint8_t *au = (uint8_t*)EBI_CS1_ADDR; //ЦАП висит на CS1 uint32_t i = 0; //. //. initPIO(); PMC->PMC_PCER0 = PMC_PCER0_PID10 | PMC_PCER0_PID23; //Включаем SMC и TC0 SMC0->SMC_WPMR = 0x534D43; //Настраиваем SMC SMC0->SMC_CS_NUMBER[1].SMC_CYCLE = SMC_CYCLE_NRD_CYCLE(4) | SMC_CYCLE_NWE_CYCLE(2); SMC0->SMC_CS_NUMBER[1].SMC_PULSE = SMC_PULSE_NCS_RD_PULSE(3) | SMC_PULSE_NCS_WR_PULSE(1) | SMC_PULSE_NRD_PULSE(3) | SMC_PULSE_NWE_PULSE(1); SMC0->SMC_CS_NUMBER[1].SMC_SETUP = SMC_SETUP_NCS_RD_SETUP(0) | SMC_SETUP_NCS_WR_SETUP(0) | SMC_SETUP_NRD_SETUP(0) | SMC_SETUP_NWE_SETUP(0); SMC0->SMC_CS_NUMBER[1].SMC_MODE = SMC_MODE_DBW_8_BIT | SMC_MODE_WRITE_MODE | SMC_MODE_READ_MODE; TC0->TC_WPMR = 0x54494D; //Настраиваем таймер на частоту 22.5кГц TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKDIS; TC0->TC_CHANNEL[0].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_CPCTRG; TC0->TC_CHANNEL[0].TC_RC = 2500; //? TC0->TC_CHANNEL[0].TC_RA = 0; TC0->TC_CHANNEL[0].TC_RB = 0; TC0->TC_CHANNEL[0].TC_IER = TC_IER_CPCS; TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_CLKEN; TC0->TC_CHANNEL[0].TC_CCR = TC_CCR_SWTRG; NVIC_EnableIRQ(TC0_IRQn);

На 120MHz вы должны услышать музыку. Обработчик:

void TC0_Handler(void) < au[0] = sound[i]; ++i; if (i>sizeof(sound)) i=0; register uint32_t dummy; dummy = TC0->TC_CHANNEL[0].TC_SR; (void) dummy ; >

Файл с PCM можно взять здесь. Работа системы продемонстрирована на видео ниже:

Это, пожалуй, не лучшее использование EBI интерфейса. 🙂 Его ниша — внешняя SRAM, процессоры-обработчики, TFT дисплеи. Я же пробовал подключать к нему одновременно видеопроцессор и FPGA, результатом я оказался доволен. Развитие системы может несомненно продолжаться!

ATSAM4 пересылает в видеопроцессор спрайты и т.п по кадровому синхроимпульсу. А в FPGA почти постоянно, в ней находится FIFO. Вся система работает без DMA, потому как у SAM4C его нет 🙂 Вместо него я использую модифицированную функцию memcpy.