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:...

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


  • Самый простой диммер для светодиодного освещенияСамый простой диммер для светодиодного освещения
    Views: 3201 Светодиоды все больше входят в нашу жизнь как источники освещения и как само собой разумеющееся, это вопрос регулировки яркости. Существует множество схемных решений, но в нашем варианте мы …
  • Применение typedef, struct и unionПрименение typedef, struct и union
    Views: 8913 Полезные описания переменных Часто необходимо в памяти расположить последовательно разные виды данных, что бы потом можно было их использовать. Полезные ссылки Взято и переработано с сайта http://www.butovo.com/~zss/cpp/struct.htm http://cppstudio.com/post/9172/ …
  • WiFi ESP8266 ESP-202 (ESP-12F)WiFi ESP8266 ESP-202 (ESP-12F)
    Views: 7960 Первое знакомство, сначала надо его купить… http://voron.ua/catalog/024404 Схема для подключения и тестирования По схеме ставим две кнопки, сброс и кнопку BT2, для перевода в режим обновления прошивки. Если надо сделать …
  • WiFi ESP8266 – AT команды связанные с функцией Wi-FiWiFi ESP8266 – AT команды связанные с функцией Wi-Fi
    Views: 5770 AT команды связанные с функцией Wi-Fi Функции Wi-Fi подключения, запускаться из командной строки Команда Описание  1 AT+CWMODE Проверка, настройка режима работы Wi-Fi (sta/AP/sta+AP), (не рекомендуется для новых проектов). 2 …
  • CLUBBEST – reasoning on the visualization of music.CLUBBEST – reasoning on the visualization of music.
    Views: 325 ВІД ЗАХОДУ ДО СВІТАНКУ АБО ПОБАЧИТИ МУЗИКУ.     Час доби, коли почуття людини загострюються, – це час від заходу до світанку. В цей час людина відкрита для …
  • Инфракрасный датчик движения, PIR-sensorИнфракрасный датчик движения, PIR-sensor
    Views: 3311 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …
  • LED модуль P10C4V12LED модуль P10C4V12
    Views: 3316 LED панели на обычных регистрах типа 74HC595. Они выпускаются как монохромные так двух и полно цветные, особенность, что они предназначены для текстовой информации и имеют один уровень яркости. Общую яркость …
  • Индикатор кода – RC-5 Protocol PhilipsИндикатор кода – RC-5 Protocol Philips
    Views: 1142 Индикатор кода – RC-5 Protocol Philips При конструировании дистанционного управления на инфракрасных лучах для контроля удобно иметь индикатор кодов передаваемых пультом. Плата ch-c3000 позволяет изготавливать устройства с возможностью …
  • Development board based on MCU PIC18F47Q84Development board based on MCU PIC18F47Q84
    Views: 2769 PIC18F47Q84 Microcontroller Family with CAN Flexible Data Status: In Production.
  • Проект с использованием MCC часть 06Проект с использованием MCC часть 06
    Views: 1463 Изменим схему следующим образом добавим две тактовые кнопки BT1 и BT2. Теперь переключимся на конфигурацию выводов, для этого сделаем двойной клик в окне Ресурсы проекта на Pin Module. …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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