liman324

Программирование микроконтроллеров, PHP. rcl-radio.ru | forum.rcl-radio.ru
Пикабушник
Дата рождения: 28 августа
2772 рейтинг 110 подписчиков 0 подписок 70 постов 22 в горячем
11

Частотомер на LGT8F328P (Arduino)

На базе микроконтроллера LGT8F328P можно сделать частотомер, с достаточно большой точностью и стабильностью измерений. Показания частоты выводятся на 8-и разрядный семисегментный индикатор на базе микросхемы max7219.

Микросхема MAX7219 – это компактный драйвер индикатора, который позволяет управлять 7-сегментными индикаторами разрядностью до 8 цифр или 64 отдельными светодиодами. Драйвер управляется по последовательному интерфейсу SPI.

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Микроконтроллер LGT8F328P содержит 4 таймера, два из которых 8-и разрядные и два 16-и разрядные. На основе двух 16-и битный таймеров будет осуществлено измерение частоты.

Схема частотомера очень простая:

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

На вход D5 подается сигнал уровня TTL, а на выходе D11 присутствует импульсный сигнала (меандр) для тестирования работы частотомера.

Частотомер работает следующим образом — на вход Т1 Timer_1 подается входной сигнал (TTL), Timer_1 сконфигурирован на работу с внешним тактовыми импульсами источником которого является измеряемый сигнал.

TCCR1A = 0;

TCCR1B = 0;

TCNT1=0;

TCCR1B = (1 << CS12) | (1 << CS11) | (1 << CS10);

TIMSK1 = (1 << TOIE1);

TCKCSR = (1 << F2XEN) | (1 << TC2XS1);

Биты CS12 CS11 CS10 регистра TCCR1B настроены на внешний режим тактирования:

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Бит TOIE1 регистра TIMSK1 переводит таймер в режим — сброс при переполнении (прерывание).

Биты F2XEN TC2XS1 регистра TCKCSR запускаю высокоскоростной режим синхронизации.

Если на вход Т1 таймера поступают тактовые импульсы, счетчик TCNT1 начинает отсчет импульсов до максимального значения 65535 (при условии что входной сигнал имеет частоту выше 65535 Гц) далее он обнуляется и происходит прерывание. В обработчике прерывания указан следующий код:

ISR(TIMER1_OVF_vect) {tic++;}

Этот код просто подсчитывает кол-во прерываний.

Timer_3 имеет разрешение 16 бит, его задача состоит в точном отсчете времени измерения в 1 секунду.

TCCR3B = (1 << CS32) | (1 << WGM32);

TIMSK3 = (1 << OCIE3A);

OCR3A = CAL;

Бит CS32 регистра TCCR3B устанавливает предделитель на 256, бит WGM32 активирует режим СТС (сброс при совпадении счетного регистра TCNT1 с регистром сравнения OCR3A).

Регистр OCR3A содержит значение CAL отмеряющее 1 секунду.

При совпадении счетного регистра TCNT1 с регистром сравнения OCR3A происходит прерывание:

ISR(TIMER3_vect) {

if (TIFR3 & (1 << OCF3A)){

TIFR3 = 1 << OCF3A;

freq = tic*0xFFFF + TCNT1;

tic=0;

TCNT1=0;

w=1;

} }

В обработчике прерывания Timer_3 происходит подсчет частоты:

freq = tic*0xFFFF + TCNT1;

то есть кол-во прерываний Timer_1 умножается на 65535, так как одно прерывание содержит 65535 отсчетов счетного регистра TCNT1 и далее к полученному значению прибавляется остаток счета в регистре TCNT1.

После чего кол-во прерываний Timer_1 и показания счетного регистра обнуляются, а в переменной freq содержится значение измеренной частоты, которые выводится на восьми разрядный семисегментный индикатор.

При наличии очень точного импульсного генератора можно откалибровать частотомер при помощи значения счетного регистра:

#define CAL 62502; //62499 = 1 sec

При прошивке микроконтроллера рекомендую ознакомится со следующей статьей —  LGT8F328P-LQFP32 MiniEVB в Arduino IDE , версия платы не ниже 2.0.0

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Так же при конфигурировании платы в Arduino IDE руководствуйтесь этим скриншотом:

Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост
Частотомер на LGT8F328P (Arduino) Arduino, Электроника, Программирование, Самоделки, Длиннопост

Скетч - http://rcl-radio.ru/?p=130049

Показать полностью 5
10

Работа с прерываниями PCINT0…39 для LGT8F328P

PCINT0…39 — это входы для внешнего прерывания которое срабатывает при изменении состояния на входах PCINT0..39.

Работа с прерываниями PCINT0…39 для LGT8F328P Arduino, Электроника, Программирование, Самоделки, Длиннопост

Следует отметить, что плата LGT8F328P-LQFP32 MiniEVB содержит не все входы PCINT, так в ней установлен микроконтроллер в корпусе LQFP32, полный набор входов PCINT содержит микроконтроллер выполненный в корпусе LQFP48.

За внешние прерывания отвечают несколько регистров:

Регистр PCICR — определяет какую группу входов использовать в качестве источника прерывания:

Работа с прерываниями PCINT0…39 для LGT8F328P Arduino, Электроника, Программирование, Самоделки, Длиннопост

Группа PCIE4 отвечает за входы PCINT[32:39], PCIE3 за  PCINT[24:31], PCIE2 за  PCINT[16:23], PCIE1 за  PCINT[8:15], PCIE0 за  PCINT[0:7].

Пример использования:

PCICR |= (1 << PCIE0); // определяет группу входов PCIE0 PCINT0…7

Далее используются при необходимости пять регистров PCMSKn, каждый регистр отвечает за вход PCINTn в своей группе:

Работа с прерываниями PCINT0…39 для LGT8F328P Arduino, Электроника, Программирование, Самоделки, Длиннопост

Установка какого-нибудь бита из PCINT0…39 разрешает соответствующему выводу работать в качестве источника прерывания.

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

Пример использования:

PCMSK0 |= (1 << PCINT0); // использовать PCINT0 в группе PCIE0

PCIFR — регистр флагов

Работа с прерываниями PCINT0…39 для LGT8F328P Arduino, Электроника, Программирование, Самоделки, Длиннопост

При смене логического уровня на любом из выводов PCINT0…39 происходит вызов прерывания, при этом устанавливается соответствующий флаг прерывания PCIF0…4 (на одну группу один флаг). Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания.

Обработчики прерывания PCINTx_vect, каждый для своей группы.

Пример использования:

ISR(PCINT0_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

ISR(PCINT1_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

ISR(PCINT2_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

ISR(PCINT3_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

ISR(PCINT4_vect){ // — код — //} — при возникновении прерывания исполняется // — код — //

Пример:

int i;

void setup() {  

DDRB |= (1 << PB5);// выход светодиода D13 (PB5) на плате Arduino  

DDRB &= ~(1 << 0);

PORTB |= (1 << 0); // выход PCINT0 (D8) как выход, подтягивающий резистор включить

PCICR |= (1 << PCIE0); // определяет группу входов PCIE0 PCINT0...7  

PCMSK0 |= (1 << PCINT0); // использовать PCINT0 в группе PCIE0

}

void loop() {  

PORTB |= (1 << PB5); // PB5 выход 1  

if (i == 1)delay(5000); i = 0; // как сработает прерывание подождать 5 секунд

}

ISR(PCINT0_vect) {  

PORTB &= ~(1 << PB5); // погасить светодиод на D13  

i = 1;

}

Светодиод на плате Arduino Uno который подключен к PB5 горит всегда, если кратковременно замкнуть вход PCINT0 на GND, светодиод погаснет на 5 секунд и загорится вновь.

Пояснение работы кода:

Команда PORTB |= (1 << PB5) в loop() всегда устанавливает на выходе PB5 высокий уровень. Если кратковременно замкнуть вход PCINT0 на GND, то сработает обработчик прерывания PCINT0_vect, в котом находится команда PORTB &= ~(1 << PB5) которая переводит выход PB5 в низкий уровень, тем самым Мы видим как гаснет светодиод демонстрирующий работы прерывания. Далее в  обработчике прерывания используется переменная i , которая становится равной 1. Эта переменная нужна чтобы сработало условие:

if (i == 1)delay(5000); i = 0;

После того как сработает условие следует пауза в 5 секунд, переменная i становится равной 0, тем самым запрещая выполнение условия. Пауза в 5 секунд необходима для демонстрации работы внешнего прерывания, так как без паузы после того как погаснет от прерывания светодиод, он тут же снова загорится, так как команда PORTB |= (1 << PB5) в loop() всегда устанавливает на выходе PB5 высокий уровень.

http://rcl-radio.ru/?p=130036

Показать полностью 3
15

Часы на адресной светодиодной ленте WS2812B (Arduino)(2)

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

Ранее в статье http://rcl-radio.ru/?p=110997 рассматривался пример создания часов на адресной ленте WS2812b с использованием часов реального времени DS3231. В этой статье будет рассмотрен пример аналогичных часов но с использованием GPS модуля NEO-6M — http://rcl-radio.ru/?p=129191.

GPS модуль необходим для получения точного времени со спутников GPS. Для поиска спутников модулю NEO-6M может понадобится время от 5 до 30 минут после подачи питания на модуль GPS.

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

Назначение контактов модуля NEO-6M:

  • GND —  заземляющий вывод питания

  • TxD — вывод для передачи данных

  • RxD — вывод для получения данных

  • VCC — вывод питания 3,3 В

В часах предусмотрена регулировка яркости адресной ленты и изменения цвета свечения.

Схема часов

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

Кнопки:

  • MODE — позволяет менять цвет свечения адресной ленты

  • UP —  кнопка позволяет увеличивать яркость свечения адресной ленты

  • DOWN — кнопка позволяет уменьшать яркость свечения адресной ленты

Сборка часов

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

Порядок наклеивания отрезков адресной ленты на основание показан на рисунках:

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост
Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

При установке большой яркости свечения адресной ленты, необходимо использовать отдельный от Arduino источник питания 5 В, так ток потребления адресной ленты может превысить 2 А.

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост
Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

Как ранее было написано, что GPS модулю после подачи на него питания необходимо некоторое время чтобы осуществить поиск спутников. Пока спутники не найдены, часы работать не будут, а в мониторе порта должна появится следующая информация:

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

Это значит что GPS модуль активен и передает информация на плату Arduino, но спутники еще не найдены.

Как только модуль GPS найдет спутники то информация в мониторе порта поменяется и часы начнут показывать время:

Часы на адресной светодиодной ленте WS2812B (Arduino)(2) Arduino, Электроника, Самоделки, Часы, Длиннопост

При настройке часов необходимо внести изменения в скетч:

#define time_offset 21600 // смещение от UTC 1 час = 3600 (зависит от часового пояса, для примера смещение времени для Омска 6 часов, то есть 21600 секунд )

#define BRIG_MAX 50 // настойка ограничения максимальной яркости. Напряжение 5 В подаваемое на адресную ленту может подаваться от платы Arduino, от маломощного источника питания,  но при этом яркость ленты не должна превышать 10 единиц.

Скетч - http://rcl-radio.ru/?p=130337

Показать полностью 8
13

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino)

S/PDIF (Sony/Philips Digital Interface) – распространенный и стандартизированный интерфейс, предназначенный для передачи цифрового звука между доступными компонентами, звуковыми картами, ресиверами и аудиоаппаратурой.

I2S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств. Применяется для передачи PCM-аудиоданных между интегральными схемами в электронном устройстве. Шина I2S передает по разным линиям сигналы синхронизации и сигналы данных, что приводит к снижению фазового дрожания, типичного для систем связи, восстанавливающих сигналы синхронизации из целого потока.

STA333BW — полнофункциональный цифровой аудио усилитель (класса D), включающий силовой каскад для системы стерео усилителей. В STA333BW интегрирована система цифровой обработки аудиосигнала (ЦАП), высокоточный цифровой ШИМ-модулятор и два мощных полномостовых каскада питания МОП-транзисторов.

STA333BW поддерживает формат передачи цифровых данных I2S (I²S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств) с частотой дискретизации от 8 кГц до 192 кГц, с разрешением до 24 бит.

Усилитель может работать в нескольких режимах подключения нагрузки:

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

В статье будет рассмотрен только первый вариант подключения нагрузки к усилителю (выход 2.0 — 2х20 Вт при напряжении питания 18 В).

Усилитель выдает 2 x 20 Вт, оснащен цифровым регулятором громкости, баланса, регуляторы тембра ВЧ и НЧ, регулятор полосы НЧ, de-emphasis, так же доступны функции MUTE и STANDBY.

Структурная схема усилителя

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Ресивер S/PDIF собран на ИМС DIR9001, так как вход DIR9001 имеет вход уровня TTL, сигнал S/PDIF подается через преобразователь интерфейса MAX485. DIR9001 поддерживает формат I2S, 24 бит, частота дискредитации 96 кГц.

Для вывода информации о настройках используется дисплей 0.96′ I2C 128X64 OLED. Управление OLED дисплеем в данном примере осуществляется при помощи шины I2C.

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Параметры дисплея SSD1306:

  • Технология дисплея: OLED

  • Разрешение дисплея: 128 на 64 точки

  • Диагональ дисплея: 0,96 дюйма

  • Угол обзора: 160°

  • Напряжение питания: 2.8 В ~ 5.5 В

  • Мощность: 0,08 Вт

  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Основные параметры усилителя STA333BW

  • Напряжение питания цифровое и аналоговое 3,3 В

  • Напряжение питания для выходного каскада усилителя от 4.5 В to 21.5 В

  • Режим работы 2.0 и 2.1 (в данном примере рассматривается режим работы 2.0)

  • Выходная мощность в режиме 2.0 … 2 x 20 Вт (8 Ом 18 В)

  • Выходная мощность в режиме 2.1 … 2 x 9 Вт + 1 х 20 Вт (8 Ом 18 В)

  • Динамический диапазон 100 дБ

  • Частота дискредитации от 32 до 192 кГц

  • Управление цифровое I2C

  • Регулировка громкости от -80 до 48 дБ с шагом 0,5 дБ

  • Регулировка тембра ВЧ НЧ ±12 дБ с шагом 2 дБ

  • Регулировка полосы НЧ от 80 до 340 Гц (14 шагов)

  • Коэффициент гармоник не более 0,2 % (Po = 1 W f = 1 kHz)

  • КПД 90% в режиме 2.0

  • Зашита от перегрева и токовая защита

Схема ресивера

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Схема усилителя

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Схема управления

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Схема источника питания

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Для управления работой усилителя используется плата Arduino Nano, две кнопки и энкодер (модуль KY-040), так же управление полностью продублировано ИК пультом, информация о текущих настройка отображается на дисплее 0.96′ OLED.

На дисплей выводится пять меню, переключение меню осуществляется при помощи кнопки энкодера.

Меню громкости

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Bass

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Treble

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Частота Bass

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Баланс

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Дополнительные функции

STANDBY (ток потребления усилителя в режиме STANDBY 0.3 мкА)

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

MUTE

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

De-emphasis

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

ИК пульт дублирует работу энкодера и кнопок. Для управления усилителем подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:

#define IR_1 0x2FDD02F // Кнопка menu up
#define IR_2 0x2FD32CD // Кнопка menu dw
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FDF00F // Кнопка MUTE
#define IR_6 0x2FD00FF // Кнопка STANDBY (POWER)
#define IR_7 0x2FD6A95 // DEMP

Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.

STA333BW + 0.96 OLED — цифровой усилитель 2х20 Вт (Arduino) Arduino, Электроника, Самоделки, Аудиотехника, Усилитель звука, Длиннопост

Скетч - http://rcl-radio.ru/?p=130127

Показать полностью 16
19

Вольтамперметр для источника питания на INA226

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Микросхема INA226 (модуль) предназначена для высокоточного измерения напряжения, тока и потребляемой мощности. В модуле установлен шунт на 0,1 Ом, при этом модуль может измерять ток до 800 мА, но если заменить шунт например на 0,01 Ом, то диапазон измерения тока может быть расширен до 8 А.

Основные характеристики модуля на INA226:

  • Диапазон измеряемого напряжения 0–36 вольт

  • Максимальный ток 800 миллиампер (2 шага усиления, на 400 и 800 мА)

  • Напряжение питания 3 – 5,5 вольт

  • Потребляемая мощность (определяется самостоятельно):

    • Непрерывный режим: 0,35 мА

    • Режим пониженного энергопотребления: 2,3 мкА

  • Режимы измерения: непрерывный или по требованию

  • Количество выборок, которое собирается и усредняется 1, 4, 64, 128, 256, 512 или 1024

  • Время преобразования для измерения напряжения на восьми уровнях: от 0,14 до 8,2 мс

  • Связь через I2C, 4 настраиваемых адреса (модуль):

    • 0x40: A0, A1 не замкнут с VCC

    • 0x41: A0 = VCC, A1 не замкнут с VCC

    • 0x44: A0 не замкнут с VCC, A1 = VCC

    • 0x45: A0, A1 = VCC

На платформе Arduino (плата LGT8F328P-LQFP32 MiniEVB) используя модуль INA226 можно сделать простой, но высокоточный вольтамперметр для регулируемого источника питания, вся информация будет выводится на дисплей LCD1602 c модулем I2C. Дополнительно модуль производит измерение мощности, а измеряя потребляемый ток и время на дисплей можно выводить ампер-часы, что удобно при зарядке аккумуляторов. Так как будет измеряться ампер-часы, то будет добавлена кнопка для обнуления результата измерения.

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост
Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Как использовать плату в Arduino IDE написано в статье — http://rcl-radio.ru/?p=129966

Настройки платы LGT8F328P-LQFP32 MiniEVB в Arduino IDE

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Помимо платы LGT8F328P-LQFP32 MiniEVB можно использовать плату Arduino Nano изменив значение регистра OCR1A на 15624.

Вывод монитора порта:

Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост
Вольтамперметр для источника питания на INA226 Электроника, Arduino, Самоделки, Длиннопост

Скетч - http://rcl-radio.ru/?p=130346

Показать полностью 5
18

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением

На этой странице показан пример создания источника питания с регулируемым выходным напряжением от 0 до 25 В и током нагрузки от 0 до 2 А. В источнике питания предусмотрена токовая стабилизация от 0,2 до 2 А. Регулирование напряжения и тока стабилизации цифровое, выполнено на микроконтроллере LGT8F328 (LGT8F328P-LQFP32 MiniEVB).

Источник питания состоит из двух основных блоков:

  • Силовая часть, содержит несколько транзисторов и ОУ, а так же шунт для измерения тока.

  • Цифровая часть состоит из микроконтроллера LGT8F328, дисплея 0.96′ I2C 128X64 OLED (SSD1306) и органов управления в виде энкодера и одной кнопки.

Схема источника питания

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Параметры дисплея SSD1306:

  • Технология дисплея: OLED

  • Разрешение дисплея: 128 на 64 точки

  • Диагональ дисплея: 0,96 дюйма

  • Угол обзора: 160°

  • Напряжение питания: 2.8 В ~ 5.5 В

  • Мощность: 0,08 Вт

  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Энкодер KY-040

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Регулировка тока стабилизации и выходного напряжения

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

На дисплей в верхней строке выводятся показания установленного напряжения (1), а так же измеренное напряжение на выходе (3). В нижней строке выводятся показания установленного тока стабилизации (2) и измеренный ток (4). Заначек «*»(5) показывает активный для регулировки параметр. Переключение регулировки тока/напряжения производится нажатием кнопки энкодера. Для включения/отключения выхода необходимо нажать кнопку OUT_ON_OFF.

Измерение напряжения и выходного тока производится с разрешением 12 бит. Все установленные параметры сохраняются в энергонезависимой памяти. Индикатор тока нагрузки начинает работать при токе выше 0,05 А.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Для прошивки платы LGT8F328P-LQFP32 MiniEVB используется платформа Arduino. Как добавить плату LGT8F328P-LQFP32 MiniEVB в Arduino IDE написано в LGT8F328P-LQFP32 MiniEVB в Arduino IDE.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Источник питания нуждается в регулировке, регулировка содержит 4 параметра (коэффициента):

#define U_OUT_K 508
#define I_OUT_K 1970
#define I_STAB_K 1210
#define U_OUT_IND 157

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

Настройка выходного напряжения

  • К выходу источника питания подключите вольтметр, установите при помощи энкодера выходное напряжение на дисплее (не на выходе ИП) 18 В.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Подберите коэффициент U_OUT_K таким образом чтобы на выходе источника питания было 18,0 В.

Настройка измерителя напряжения

  • Установите при помощи энкодера выходное напряжение на дисплее 18 В.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Подберите коэффициент U_OUT_IND таким образом чтобы на дисплее было 18,0 В.

Настройка измерителя тока

  • Установите при помощи энкодера выходное напряжение на выходе источника питания 18 В.

  • Подключите нагрузку 5-10 Ом, так чтобы выходной ток быть больше 1 А.

  • Измерьте амперметром полученный ток нагрузки.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Подберите коэффициент I_OUT_K таким образом чтобы на показания тока на дисплее и измеренное амперметром были равны.

Настройка токовой стабилизации

  • Установите при помощи энкодера выходное напряжение на выходе источника питания 18 В.

  • Подключите нагрузку 5-10 Ом, так чтобы выходной ток быть больше 1 А.

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
  • Установите значение тока стабилизации на 10-50% меньше тока нагрузки, например если выходной ток 1,45 А, то установите ток стабилизации на 1,00 А

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

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

Скетч - http://rcl-radio.ru/?p=130243

Версия №2

Замена дисплея на LCD1602 I2C

Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост
Источник питания 0-25В / 0-2А с токовой стабилизацией и цифровым управлением Электроника, Arduino, Самоделки, Длиннопост

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=7520#p7520

Показать полностью 12
147

LGT8F328 ADC (Arduino IDE)

Микроконтроллер LGT8F328p и является клоном популярной AVR ATmega328p (Arduino NANO). Микроконтроллер LGT8F328p практически полностью совместим с микроконтроллером ATmega328p и обладает рядом дополнительных функций и возможностей превышающих ATmega328p.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост
LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Основные характеристики LGT8F328P

  • FLASH (ПЗУ): 32 Кбайт

  • SRAM (ОЗУ): 2 Кбайт

  • E2PROM (EEPROM): 0K / 1K / 2K / 4K / 8K (эмуляция)

  • PWM (ШИМ): 8

  • Частота: 32 МГц

  • АЦП: 9 пинов, 12 бит

  • ЦАП: 1 пин, 8 бит

  • Силовые пины: 4 (до 80 мА)

  • Таймеры 2x 8bit, 2x 16bit

  • UART: 1

  • SPI: 1

  • I2C: 1

  • PLL: 1

  • Опорное напряжение: 1.024В / 2.048В / 4.09В ± 0,5%

  • Логический уровень: 5В

Особенность АЦП в LGT8F328P является наличие нескольких опорных напряжений (1,024 В,  2,048 B, 4,096 B, VCC), несколько множителей входного сигнала (1, 8, 16 , 32) и увеличенная по сравнению Atmega328 разрядность АЦП до 12 бит. Так же имеется возможность использования дифференциального входа.

В статье будет показано несколько примеров использования ЦАП в LGT8F328P.

Стандартный код для измерения напряжения в Arduino IDE

void setup(){  

Serial.begin(9600);  

pinMode(A0,INPUT);  

analogReadResolution(12);// АЦП 12 БИТ  

analogReference(DEFAULT);// DEFAULT(Uп)

}

void loop(){  

Serial.println(analogRead(A0));  

delay(1000);  

}

На вход А0 подается напряжение 3,3 В (с платы LGT8F328P-LQFP32 MiniEVB) и измеренное напряжение выводится в монитор порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Если использовать регистры, то можно получить аналогичный результат, но с возможностью изменить некоторые параметры, например изменить коэффициент деления системных тактов для генерации тактов
АЦП, тем самым уменьшить или увеличить длительность измерения.

void setup() {  

Serial.begin(9600);  

ADMUX |= 1 << REFS0 | 0b000;  

/*  REFS2 REFS1 REFS0  0 0 0 AREF  0 0 1 AVCC  0 1 0 2.048V  0 1 1 1.024V  1 0 0 4.096V  Бит REFS2 относится к регистру ADCSRD  */  

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

}

void loop() {  

while((ADCSRA & (1 << ADIF)) == 0); 

int u_data = (ADCL|ADCH << 8);  

Serial.println(5.00/4096*u_data,2);  

delay(1000);

}

Вывод монитора порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Рассмотрим подробнее выше показанный код:

ADMUX — регистр управления мультиплексора АЦП, позволяет выбрать источник опорного напряжения, выбрать источник входного сигнала и осуществить выравнивание по левому или по правому краю результата измерения.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Выбор источника опорного напряжения:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Обратите внимание, что бит REFS2 относится к регистру ADCSRD.

Выбор источника входного сигнала

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Как видно из кода:

ADMUX |= 1 << REFS0 | 0b0000;

выбрано опорно напряжение VCC (напряжение питания микроконтроллера), активен вход PC0 (A0).

ADCSRA — регистр A управления и состояния АЦП

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

ADEN — бит управления включением АЦП. Если бит ADEN установлен на 1,то АЦП включен.

ADSC — бит начала преобразование АЦП. Если бит ADSC установлен на 1, то активно непрерывное преобразование.

ADATE — бит запуска включением автоматически управления АЦП. Если бит ADATE установлен на 1, активируется функция автоматического запуска.

ADPS — бит выбора коэффициент деления предделителя ADC.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

В коде выбраны все выше описанные биты регистра ADCSRA:

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

После настройки конфигурации АЦП следует чтение регистров данных ADCH и ADCL. Следует отметить что первым необходимо считывать младший регистр данных ADCL.

Считывание данных возможно только после окончания преобразования, то есть как бит (флаг) ADIF станет равным 1.

while((ADCSRA & (1 << ADIF)) == 0);

После считываем данные:

int u_data = (ADCL|ADCH << 8);

и выводим результат в вольтах в монитор порта:

Serial.println(5.00/4096*u_data,2);

где:

5.00 — напряжение питания микроконтроллера, оно же и опорное

4096 — числовое значение равное максимальному числу 12 бит

Так как производится измерение напряжения 3,3 В, то целесообразней перейти на опорное напряжение 4,096 В для увеличения точности напряжения:

void setup() {  

Serial.begin(9600);

ADMUX = 0b000; ADCSRD |= 1 << REFS2;  

/*  REFS2 REFS1 REFS0  0 0 0 AREF  0 0 1 AVCC  0 1 0 2.048V  0 1 1 1.024V  1 0 0 4.096V  Бит REFS2 относится к регистру ADCSRD  */  

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

}

void loop() {  

while((ADCSRA & (1 << ADIF)) == 0); 

int u_data = (ADCL|ADCH << 8);  

Serial.println(u_data/1000.00,2);  

delay(1000);

}

Монитор порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Как видно по показаниям монитора порта, при использовании разных опорных напряжений результат меняется, но даже при опорном напряжении 4,096 В имеется погрешность.

В LGT8F328 имеется регистры калибровки VCAL1, VCAL2, VCAL3 для напряжения 1,024, 2,048 и 4,096. Регистр VCAL используется как общий для всех калибровочных значений. При включении по умолчанию выбрано опорное напряжение 1,024 В, калибровочное значение хранится в регистре VCAL1, которое записывается в регистр VCAL. Если выбрать например опорное напряжение 4,096 В , то значение регистра VCAL3 так же будет записано в регистр VCAL. Как видно по показаниям, значение VCAL3 не обеспечивает большую точность измерения. Для более точного изменения необходимо подобрать более точный коэффициент и записать его в регистр VCAL.

Для просмотра калибровочного коэффициента установленного производителем микроконтроллера можно воспользоваться командой:

Serial.println(VCAL3);  // 4,096 V

void setup() {  

Serial.begin(9600);

ADMUX = 0b000; ADCSRD |= 1 << REFS2;  

/*  REFS2 REFS1 REFS0  0 0 0 AREF  0 0 1 AVCC  0 1 0 2.048V  0 1 1 1.024V  1 0 0 4.096V  Бит REFS2 относится к регистру ADCSRD  */  

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;  

VCAL = 30;

}

void loop() {  

while((ADCSRA & (1 << ADIF)) == 0); 

int u_data = (ADCL|ADCH << 8);  

Serial.println(u_data/1000.00,2);  

delay(1000);

}

Монитор порта:

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Подобрав калибровочный коэффициент VCAL = 30, удалось значительно увеличить точность измерения.

Дифференциальный режим работы АЦП

Микроконтроллер LGT8F328 поддерживает дифференциальный режим работы аналогового входа. При этом на два аналоговых входа подается напряжение любой полярности не превышающее напряжение питания микроконтроллера.

Основные настройки дифференциального входа находятся в регистре DAPCR.

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Бит DAPEN разрешает работу дифференциального усилителя

Биты DNS[4:2] активируют работу инвертирующего входа дифференциальный усилителя

Биты DPS[1:0] активируют работу неинвертирующего входа дифференциальный усилителя

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Измерение напряжения поданного на дифференциальный вход происходит в два этапа. Сначала делаем первый вход как дифференциальный, а второй как аналоговая земля, проводим измерение, далее входы меняем местами, то есть первый вход делаем как аналоговая земля, а второй вход делаем дифференциальным. Далее снова проводим измерения. В итоге получается два измерения, для получения конечного результата надо из результата одного измерения вычесть результат второго измерения.

Перед измерением в регистре ADMUX указывает активный вход и при необходимости делаем выбор опорного напряжения.

Пример кода:

void setup() {

Serial.begin(9600);

ADCSRD |= 1 << REFS2;// REF 4.096

VCAL = 30;

ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;

}

void loop() {

ADMUX = 0b11;

DAPCR = 0;

DAPCR |= 1 << DAPEN | 0b11001;

while((ADCSRA & (1 << ADIF)) == 0);

int u_data0 = (ADCL|ADCH << 8);

// Serial.println(u_data0);

delay(500);

ADMUX = 0b00;

DAPCR = 0;

DAPCR |= 1 << DAPEN | 0b00111;

while((ADCSRA & (1 << ADIF)) == 0);

int u_data1 = (ADCL|ADCH << 8);

// Serial.println(u_data1);

Serial.println(float(u_data0-u_data1)/1000);

delay(500);

}

LGT8F328 ADC (Arduino IDE) Arduino, Электроника, Самоделки, Программирование, Длиннопост

Для примера были выбраны входы А0 и А3 (ADC3 и ADC0), на них с элемента питания подается напряжение 1,5 В. Выбран внутренний опорный источник 4,096 В.

Как видно на скриншоте дифференциальный вход при смене полярности вполне корректно измерил напряжение элемента питания.

При выборе входа один должен быть инвертирующий, другой неинвертирующим. Так же измеряемое напряжение не должно иметь общего провода с GND микроконтроллера.

http://rcl-radio.ru/?p=130272

Показать полностью 13
18

Кодовый замок (Arduino)

Кодовый замок построен на базе Arduino, содержит минимальный набор элементов, выполнен в основном из модулей, прост в сборке.

Кодовый замок выполнен из следующих компонентов:

  • Плата LGT8F328p (можно применить Arduino Nano)

  • Гибкая матричная клавиатура 4 на 3 кнопки

  • Модуль реле 5 В

  • Модуль активного зуммера для Arduino

  • Электромагнитный замок 12 В

  • 6-и разрядный семисегментный дисплей на базе драйвера TM1637

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост
Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост
Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Схема кодового замка

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Работа кодового замка достаточно проста, на клавиатуре необходимо ввести код и есть он верен сработает реле которое в свою очередь оправляет запирающим механизмом (электромагнитный замок 12 В).

Вводимый код отображается на дисплее, код может состоять от 1 до 6 цифр.

Режим ожидания

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Ввод кода

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

После введения кода необходимо нажать кнопку:

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Кнопка # позволяет сбросить код на ноль.

Код введен не верно

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Код введен верно, срабатывание запирающего механизма (электромагнитный замок 12 В)

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

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

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

#define MASTER 345623 // (необходимо изменить на свой код перед прошивкой микроконтроллера)

При вводе этого кода на дисплее появится следующая надпись:

Кодовый замок (Arduino) Arduino, Электроника, Самоделки, Длиннопост

Далее вводим код который Вы в дальнейшем будете использовать для открытия двери. Нажимаем * , происходит открывание запирающего механизма и занесение этого кода в EEPROM.

Скетч - http://rcl-radio.ru/?p=130919

Показать полностью 10
Отличная работа, все прочитано!