NeoPixel LED and PIC24

Views: 649


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

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

NeoPixel LED and PIC24 Tutorial Project 137 КБ 25 downloads

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

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


  • PIC18 – System ArbitrationPIC18 – System Arbitration
    Views: 563 Системный арбитр. Разрешает доступ к памяти между выборами уровнями системы (т.е. Main, Interrupt Service Routine) и выбором периферийных устройств (т.е. DMA и Scanner) на основе назначенных пользователем приоритетов. Каждый …
  • Четырех канальный терморегулятор ch-4000Четырех канальный терморегулятор ch-4000
    Views: 3181  Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
  • Светодиоды со встроенным драйвером WS2812BСветодиоды со встроенным драйвером WS2812B
    Views: 937 Производитель 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 …
  • Moving average – скользящее среднееMoving average – скользящее среднее
    Views: 2253 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
  • Универсальный терморегулятор ch-c3000Универсальный терморегулятор ch-c3000
    Views: 2989 Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в …
  • Емкостной сенсорЕмкостной сенсор
    Views: 3017 Изучаем изготовление емкостных сенсоров на PIC-микроконтроллере. Конструкция емкостных сенсоров имеет вид: Емкостные сенсоры строятся по схеме высокочастотного генератора, сам принцип основан на измерение частоты этого генератора. Частота зависит …
  • Проект с использованием MCC часть 13Проект с использованием MCC часть 13
    Views: 1075 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …
  • OLED RET012864E/REX012864JOLED RET012864E/REX012864J
    Views: 1464 RET012864E/REX012864J ОЛЕД индикатор производитель Raystar-Optronics приобретался в http://www.microchip.ua/ к сожалению никакой информации на сайте поставщика нет. Поэтому решил работу с этой версией индикатора на драйвере SSD1305 предоставить на своем сайте. Так как …
  • Проект с использованием MCC часть 16Проект с использованием MCC часть 16
    Views: 1092 Продолжим изучение EUSART. На этом этапе отработает передачи данных с ПК и получения эха. Для этого в основной цикл программы добавим код if(EUSART_DataReady) // проверим флаг готовности данных …
  • Проблемы классической светомузыкиПроблемы классической светомузыки
    Views: 2066 Светомузыка – что это такое? Определение: Светомузыка  (жаргонное: цветомузыка)  — вид искусства, основанный на способности человека ассоциировать звуковые ощущения со световыми восприятиями. Такое явление в неврологии получило название …



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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

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

НазадДалее

Комментарии

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

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