NeoPixel LED and PIC24

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


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

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


  • PIC32MZ – Core Timer (библиотека)PIC32MZ – Core Timer (библиотека)
    Просмотров: 400 Переработанные файлы от Microchip, библиотека для работы с Core Timer. Метки:PIC32MZ
  • PIC18 – System ArbitrationPIC18 – System Arbitration
    Просмотров: 440 Системный арбитр. Разрешает доступ к памяти между выборами уровнями системы (т.е. Main, Interrupt Service Routine) и выбором периферийных устройств (т.е. DMA и Scanner) на основе назначенных пользователем приоритетов. Каждый …
  • Оптосимистор и его применениеОптосимистор и его применение
    Просмотров: 17930 Эрве Кадино “Цветомузыкальные установки” Ответ на вопрос – управление мощным тиристором или симистором, от терморегулятора. Статья в pdf[wpdm_file id=129 template=”link-template-calltoaction3.php”] Оптосимистор принадлежат к классу оптронов и обеспечивают очень хорошую …
  • AD9833 – Programmable Waveform Generator – part twoAD9833 – Programmable Waveform Generator – part two
    Просмотров: 1303 Прошло время и появилась тема, что-бы закончить проект AD9833 – Programmable Waveform Generator. Приехали печатные платы. В этот раз я печатные платы заказывал в https://jlcpcb.com/ делал это в …
  • Цифровой тахометр для автомобиля CH-С3300Цифровой тахометр для автомобиля CH-С3300
    Просмотров: 1635  Тахометр Ch-С3300 предназначен для индикации и контроля оборотов, времени работы и максимальных оборотов развиваемых двигателем во время поездки. Датчиком может использоваться как обычный контактный прерыватель или выход датчика …
  • Униполярный шаговый двигательУниполярный шаговый двигатель
    Просмотров: 1947     В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
  • Четырех канальный терморегулятор ch-4000Четырех канальный терморегулятор ch-4000
    Просмотров: 2834  Четыре независимых канала регулирования температуры, одновременно можно подключить 16 датчиков температуры DS18B20 с удалением до трехсот метров. Можно для регулировки выбрать любой датчик, подключенный к устройству. Каждый канал может работать …
  • Одноканальный емкостной сенсор – AT42QT1012Одноканальный емкостной сенсор – AT42QT1012
    Просмотров: 2169 Описание сенсора [wpdm_file id=242] Незаконченный проект, так-как сенсор не оправдал своего назначения, не рекомендую, просто выброшенные деньги. Особенности. • Количество сенсоров – один, режим переключения ( touch-on/touch-off ), а также программируемая …
  • LED драйвер TM1639LED драйвер TM1639
    Просмотров: 1898 TМ1639 позволяет работать на матрицу 8*8 или 8 семисегметных индикаторов. Может работать как на индикаторы с общим катодом, но и есть возможность подключать общим анодом. Для управления драйвером …
  • УКВ – радиоприем, часть 2УКВ – радиоприем, часть 2
    Просмотров: 5680 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …



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

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

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Комментарии

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

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