NeoPixel LED and PIC24

Views: 756


Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными.

Построение дисплеев для анимации требуют все большей производительности вычислительных систем, но интерфейс в программном исполнении довольно громоздок, поэтому аппаратная его реализация более интересна. Этот вариант был решён в PIC18 (в 8 битной серии), но производительности в 5MIPS не всегда достаточно, когда необходима дополнительная серьёзная обработка данных МК. По этому хочу в это примере показать возможность создание апаратного модуля для PIC24. У меня правда под рукой был PIC24FJ256GA702 и его производительность всего 16MIPS (хотя есть в 16 битных и с производительностью от 70  до 100MIPS).

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

С чего всегда я начинаю, это подключение контроллера для тестирования. PIC24FJ256GA702  питается от 3,3 вольта, а светодиоды типа WS2812 рассчитаны на питание 5 вольт. Передача напрямую данных не всегда будет корректна, т.к. не все светодиоды поддерживают уровни ТТЛ логики, по этому я не заморачиваюсь ставлю в таких случаях преобразователь уровня SN74LVC1T45DBVR.

Схему в PDF можно скачать внизу страницы.

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

Далее запускаем MPLAB и создаем проект

Выберем МК:

Выберем компилятор:

Придумаем название проекта и выберем папку его хранения:

Обратите внимание кодировка UTF-8 я перешёл на неё так как во многих проектах требуется поддержка не только латиницы и кириллицы.

Жмем ок. и после этого запускаем MCC, без него уже ни как, как без рук, можно сказать деградация.

После загрузки конфигуратора, начинаем с настройки системного генератора:

Первое – внутренний генератор 8 MHz, включаем умножитель, выбираем предделитель 1:2. Получаем основные частоты 32 и 16 MHz. На этом не успокаиваемся и включаем сторожевой таймер. ВСЕГДА ВКЛЮЧАЙТЕ СТОРОЖЕВОЙ ТАЙМЕР! И всегда включаете его в начале проекта, это вам упростит жизнь.

Изменить стоить период сторожевого таймера и установить его 4 секунды. Что это значит (это для тех кто в первые читает об этом) это значит, что не позже чем 1 раз в 4 секунду в вашей программе контроллер должен выполнить сброс сторожевого таймера. Если это условие не будет выполнено, то МК посчитает, что программа зависла и необходимо будет выполнить перезапуск МК.

Первый и самый важный этап настройки выполнен.

Описание интерфейса WS2812 можно прочитать в https://catcatcat.d-lan.dp.ua/neopixel-led-i-pic18/

Следующее для управления WS2812 нам необходимо сформировать два импульса для формирования логической единицы и логического нуля для нашего интерфейса:

Эти длительности, что приведённые на картинках находяться в допустимых пределах для интерфейса WS2812 и это из реально работающего уже проекта.

Для начала подключим SPI1 модуль – в него мы будем загружать наши данные и именно он будет заниматься загрузкой в интерфейс WS2812 через CLC модуль. Я покажу только итог настройки:

Вариант конфигурации для модуля:

Настройки: режим SPI 3, тактовая 800 кГц, установить делитель на 9.

Далее нам потребуется вывести SCK1OUT так как это единственный вариант, чтобы передать данные на модуль OC который мы будем использовать для формирования логического нуля и для передачи данных в CLC модуль. Я для этого выбрал вывод RB5.

Для этого в панели менеджера выводов – установим:

 

Для модуля – должно выглядеть так:

Теперь настроим модуль OUTPUT COMPARE:

Первое это режим работы Dual Compare Mode – Continuous Output Pulse это значит, режим генерации непрерывных импульсов. Инверсия выхода необходима для работы логики (это поверьте так надо). Выбираем тактовую частоту FOSC/2 (FCY) для этого МК мы будем иметь 16 MHz. DCB оставим по умолчанию start of the instruction cycle.

Запуск модуля должен происходить синхронно с тактовыми импульсами SPI интерфейса для этого мы и вывели тактовые импульсы на вывод МК. Используем вход OCTRIG1 для синхронизации обратите внимание на картинку “синхронизация и вход”.

Далее OCxR или Primary Compare Count настраиваем на 0, это значит, что начинать будет формироваться импульс сразу после синхронизации, а длительность его будет в OCxRS Secondary Compare Count и величина 5.  Пять – это 1600000/5 = 3 200 000 или 312 мкС, что равно длительности импульса “нуль” для шины WS2812.

Еще остался вход OCTRIG1 его необходимо соединить с выходом тактовых импульсов SPI интерфейса:

Такая конфигурация вызовет предупреждение в MCC, но это не значит, что это не правильно. МСС вам сообщает, что так как этот вывод настроен на выход, то вы на него не можете подавать данные из вне, а вход OCTRIG1 требует, что бы это был вход. Но дело в том, что внутренняя логика выполнит подключение и данные с SPI интерфейса будут доступны модулю ОС.

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

В пин модуле это должно теперь выглядеть так:

Теперь подключим CLC модуль:

После чего ресурсы проекта должны быть выглядеть так:

Конфигурирование модуля должно быть выглядеть так:

Но это еще не все, необходимо сконфигурировать входы и выходы модуля

Мы получим еще один конфликт в МСС но это тоже не ошибка, так можно делать. После такой конфигурации мы получим?

А  теперь для тех кто реально хочет понять почему такое извращение и реально научиться в будущем самостоятельно конфигурировать модуль опишу на пальцах как это работает:

Нам необходимо получить формирование импульсов логического нуля и логической единицы для передачи с использованием SPI интерфейса. Для этого мы настроили SPI модуль в режим 3. вот как выглядит передача кода 0х55:

 

Обратите внимание, что длительность положительного импульса SPI равна длительности логической единицы. Т.е. если нам удастся сделать (а нам удастся) чтобы во время логической единицы на шине SDO1 передавался в шину светодиодов импульс от SCK1. А при логическом нуле на шине SDO нам нужен импульс логического нуля, его будет формировать модуль CO запуск которого будет синхронизироваться от шины SCK1OUT.

Почему пришлось импульсы логического нуля инвертировать? Это связано с логикой и возможностью синхронизации для OC модуля (или я не разобрался до конца) но это не важно. Главное что у нас теперь есть два импульса нужной длительности.

Теперь как получается формирование для начала логической единицы?

Всем управляет шина данных SPI интерфейса, нам необходимо взять сигнал модуля OC про инвертируем его и сложить по ИЛИ с инверсией сигнала данных SPI, и надо заблокировать когда уровень на SCK1OUT низкий

 

 

Как выглядит механизм формирование логической единицы, четвёртый канал это выход:

Теперь на пальцах, как формируется логический ноль, отключим механизм формирования 1 и включим только для нуля.

И это будет выглядеть вот так:

Надеюсь в элементарной логике разобраться будет не сложно.

Теперь все вместе:

 

Вот и всё работает:

Теперь стоит только проверить на реальном выводе информации на светодиоды, возьмём пример из проекта NeoPixel LED и PIC18

#include "mcc_generated_files/system.h"
#include "mcc_generated_files/spi1.h"
//------------------------------------------------------------------------------
// для функции delay_
#define  FCY    (_XTAL_FREQ/2)  // определение тактовой частоты для макросов __delay_ms() и __delay_us()
#include <libpic30.h>           // библиотека функций delay_
//------------------------------------------------------------------------------

/*
                         Main application
 */

void transfer_WS2812(uint8_t red, uint8_t green, uint8_t blue)
{
    SPI1_Exchange8bit(green);
    SPI1_Exchange8bit(red);
    SPI1_Exchange8bit(blue);
}



int main(void)
{
    // initialize the device
    SYSTEM_Initialize();
    ClrWdt(); //reset watchdog timer +++++++++++++++++++++----------------

    while (1)
    {
        ClrWdt(); //reset watchdog timer +++++++++++++++++++++----------------
        // Add your application code
        __delay_ms(100);                 // синхронизация
        transfer_WS2812(125,0,0);   // Красный
        transfer_WS2812(0,10,0);   // Зеленый
        transfer_WS2812(0,0,125);   // Синий
        transfer_WS2812(50,50,0); // Желтый
        transfer_WS2812(0,10,0);   // Зеленый
        transfer_WS2812(0,0,125);   // Синий
        transfer_WS2812(50,50,0); // Желтый
        
    }

    return 1;
}
/**
 End of File
*/

Вот как так, всё просто.


Значок

NeoPixel LED and PIC24 testing scheme 59 КБ 24 downloads

NeoPixel LED and PIC24 testing scheme ...
Значок

NeoPixel LED and PIC24 Tutorial Project 137 КБ 28 downloads

* < Catcatcat Electronic 2021. * https://catcatcat.d-lan.dp.ua/?p=10065 * email:...

Это может быть интересно


  • TDA7294 part 2TDA7294 part 2
    Views: 709 Це друга частина проекту TDA7294, початок дивись тут. Тут ви знайдете повністю проект високоякісного підсилювача на TDA7294, схема, 3D моделі, гербер файли для виготовлення друкованої плати. І звичайно …
  • MCC – K42 – настройка модуля DMAMCC – K42 – настройка модуля DMA
    Views: 986 MCC – в версии v.3.95.0 и начиная ядра 4.85.0 конфигуратор предоставляет графический интерфейс для настройки модуля DMA. Для начала: Посмотреть какая версия МСС можно в закладке версии, если …
  • Audio-bluetooth modules F-6188 (BK8000L)Audio-bluetooth modules F-6188 (BK8000L)
    Views: 2469Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная …
  • MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
    Views: 1409 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на  Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.
  • Проект с использованием MCC часть 12-1Проект с использованием MCC часть 12-1
    Views: 1101 В настоящее время без визуализации информации уже не интересно. Поэтому научимся выводить информацию на дисплей. Для это возьмет простенький OLED RET012864E/REX012864J я такой приобретал в фирме “Гамма-Украина”, описание можно …
  • Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)Система отопления на солнечных коллекторах от Дмитрия (rv3dpi)
    Views: 3464 Солнечные коллекторы для отопления в Европе используют в более 50% от общего количества установленных гелиосистем. Однако следует понимать, что гелиосистемы предназначены лишь для поддержки отопления и экономии затрат на основную …
  • Стабилизатор тока на SN3350, часть 2Стабилизатор тока на SN3350, часть 2
    Views: 1316 Если вам необходимо разработать устройство с применением мощных светодиодов, то никак не обойтись без применения стабилизатора тока. На настоящий момент стабилизаторы тока являются самым эффективным механизмом, для питания светодиода в течение всего …
  • Ссылки на интересные источникиСсылки на интересные источники
    Views: 981 Сбор 3D моделей от André L’Hérault конденсаторы, резисторы, индуктивности dropbox IPC-SM-782 Surface Mount Design and Land Pattern Standard Видео уроки по Altium designer Alexey Sabunin https://www.youtube.com/channel/UCG7N5CqXpyK8nQjr1EmMgng Сергей Булавинов https://www.youtube.com/channel/UCISAMXRnN_Qw9UTjUwZI1Jw Robert Feranec https://www.youtube.com/user/matarofe …
  • CLUBBEST-50-LightCLUBBEST-50-Light
    Views: 464 CLUBBEST-50-LIGHT   Зміст Короткий опис проекту. 1 Опис схемотехніки візуалізатора музики. 2 Аудіо вхід. 3 MCU. 4 Цифровий вихід. 5 Схема живлення MCU. 6 Складання пристрою. 7 Список …
  • Ultrasonic Level Meters – ULM –53LUltrasonic Level Meters – ULM –53L
    Views: 789 Измерение расстояния при помощи ультра звукового датчика ULM–53L–10. Диапазон измерения от 0,5 м до 10 м, полностью пластмассовый излучатель PVDF, механическое соединение фланцем из полиэтилена HDPE (исполнение “N”) Характеристики …



Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее

Комментарии

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.