NeoPixel LED and PIC24

Просмотров: 419


Популярность однопроводной шины для управления светодиода типа 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 КБ 5 downloads

NeoPixel LED and PIC24 testing scheme ...
Login Required Message:
Значок

NeoPixel LED and PIC24 Tutorial Project 137 КБ 6 downloads

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

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


  • MPLAB® Code Configurator and EncoderMPLAB® Code Configurator and Encoder
    Просмотров: 1249 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …
  • Audio-bluetooth modules F-6188 (BK8000L)Audio-bluetooth modules F-6188 (BK8000L)
    Просмотров: 1780Следующий модуль на чипе BK8000L. Заводское обозначение F-6188 также основным производителем не выпускается и отдан на тиражирование. с нижней стороны имеет маркировку В этом варианте мне попалась вроде полноценная …
  • PIC32MZ – прерывания (заметки)PIC32MZ – прерывания (заметки)
    Просмотров: 375 Виды формирования запоминая контекста при входе в прерывания. Компилятор представляет три варианта AUTO – когда запоминания места возврата из подпрограммы возложено на программу, т.е все создается программно. Этот …
  • Тестирование модуля генератораТестирование модуля генератора
    Просмотров: 676  Тестирование модуля генератора Настройка, запуск и проверка рабочей частоты на примере PIC18F26K40. PIC18F26K40 Чтобы понять из-за чего зависит производительность микроконтроллера просто надо понять как работает его задающий тактовый …
  • MPLAB® Harmony – или как это просто! Часть 3.MPLAB® Harmony – или как это просто! Часть 3.
    Просмотров: 1889 Часть третья – копнём немного глубже. Вы наверное заметили, что во второй главе, вроде сначала все шло как по маслу, а потом, что бы заморгали светики, я вставил …
  • Униполярный шаговый двигательУниполярный шаговый двигатель
    Просмотров: 1987     В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
  • USB K-L-line адаптерUSB K-L-line адаптер
    Просмотров: 5683 USB K-L-line адаптер предназначен для связи персонального компьютера с диагностической шиной автомобиля – интерфейс ISO-9141. Этот проект предназначен для сборки недорого устройства с использованием специально для этой цели …
  • Ссылки на интересные источникиСсылки на интересные источники
    Просмотров: 655 Сбор 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 …
  • Цифровой спидометр для автомобиляЦифровой спидометр для автомобиля
    Просмотров: 9998  Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например,  для …
  • Светодиоды со встроенным драйвером WS2812BСветодиоды со встроенным драйвером WS2812B
    Просмотров: 805 Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery …



В записи нет меток.

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Комментарии

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

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