
Arduino
66 постов
66 постов
На основе микроконтроллера ATmega8 используя среду программирования Arduino ШВУ можно собрать простые часы на газоразрядных индикаторах типа ИН-16 (ИН-14, ИН-18 и др.). ИН-16 представляет собой индикатор тлеющего разряда имеющий десять катодов выполненных в виде цифр и два катода для запятых. Ток индикации 2 мА, напряжение возникновения тлеющего разряда не более 170 В, яркость свечения 150 кд/м².
Назначение выводов:
1 — анод
2 — цифра 1
3 — цифра 7
4 — цифра 3
5 — знак «запятая»
6 — цифра 4
7 — цифра 5
8 — цифра 6
9 — цифра 2
10 — знак «запятая»
11 — цифра 8
12 — цифра 9
13 — цифра 0
Управление цифрами газоразрядных индикаторов осуществляется при помощи высоковольтного двоично-десятичного дешифратора К155ИД1 (динамическая индикация), управление анодами осуществляется при помощи высоковольтных транзисторных оптронов (TLP627) со схемой Дарлингтона на выходе. Плата Arduino коммутирует управление газоразрядных индикаторов и управляет работой высоковольтного DC-DC преобразователя. В схеме используются часы реального времени DS3231 (DS1307).
Как добавить микроконтроллер Atmega8 в среду программирования Arduino IDE и прошивать микроконтроллер можно узнать из статьи http://rcl-radio.ru/?p=82486
Транзистор IRF740 необходимо установить на небольшой радиатор, дроссель L1 состоит из ферритового сердечника (гантельный сердечник) на который до заполнения намотан провод диаметром 0,27…0,32 мм.
Высоковольтный преобразователь содержит индикатор наличия высокого напряжения на ИН-3 и R7. Для настройки выходного напряжения высоковольтного преобразователя необходимо изменить следующий параметр в скетче:
OCR1A = 255; // 255…505
При увеличении значения регистра OCR1A изменяется скважность ШИМ сигнала, чем выше значение регистра тем выше выходное напряжение преобразователя и тем выше ток потребления преобразователя (до 0,48 А при питании 5 В). OCR1A должен быть не больше 505. Частота ШИМ сигнала 23,5 кГц.
Кнопки SET UP и DW служат для корректировки времени часов реального времени.
В часах имеется функция антиотравления катодов, раз в час, ровно в 30 минут осуществляется перебор всех цифр индикаторов.
При корректировке минут яркость отображения часов снижается.
При корректировке часов яркость отображения минут снижается.
Скетч - http://rcl-radio.ru/?p=129726
AD7706 — это сигма-дельта 16 битные АЦП, гарантирующие отсутствие потери кодов. Выбранный входной сигнал поступает на усилитель с программируемым коэффициентом усиления, а с его выхода на аналоговый модулятор. Сигнал с выхода модулятора поступает на внутренний цифровой фильтр. Предыдущее значение фильтра может быть перенесено из внутреннего управляющего регистра, что позволяет регулировать порог отсечки фильтра и частоту обновления.
AD7706 работают от однополярного питания от 4.75 В до 5.25. AD7706 имеет три канала с псевдо дифференциальными входами. Диапазон биполярного входного сигнала при питании 5 В и опорном напряжении 2,5 В может изменяться от 0 … 20 мВ до 0 … 2.5 В. При измерении биполярного сигнала может изменяться в диапазоне от ± 20 мВ до ± 2,5 В.
Отличительные особенности:
AD7706: трехканальный АЦП с псевдо-дифференциальными входами
16 битное разрешение
Коэффициент нелинейности 0.003 %
Программируемый коэффициент усиления от 1 до 128
Трехпроводный последовательный SPI, QSPI, MICROWIRE и DSP совместимый интерфейс
Однополярное питание от 2.7 В до 3.3 В или от 4.75 В до 5.25 В
Рассеиваемая мощность при 3 В питании — менее 1 мВт
Ток потребления в дежурном режиме — не более 8 мкА
АЦП управляется при помощи нескольких регистров:
Регистр Communications
Communications Register 8 бит, содержит биты настройки выбора входа CH1 CH0, активация режима STANDBY STBY.
Так как это коммуникационный регистр, то он содержит адрес регистра который необходимо активировать RS0 RS1 RS2, то есть коммуникационном регистре указываем адрес регистра в который необходимо записать или прочитать данные (бит RW), так же указываем номер канала настойки которого необходимо поменять.
Например необходимо записать данные в регистр SETUP, то в коммуникационном регистре записываем адрес регистра SETUP, номер канала, бит записи или чтения:
Communications Register (пример записи в регистр SETUP)
RS0 RS1 RS2 = [001] — адрес регистра SETUP
RW = [0] — запись
CH1 CH0 = [01] — выбран канал №2
Регистр Setup
Регистр SETUP содержит биты настройки коэффициента усиления G2 G1 G0 (от 1 до 128), режимы калибровки MD1 MD0, тип входного сигнала B/U (униполярный\биполярный).
Биты G2 G1 G0
Режимы калибровки:
MD1 MD0 = [00] — рабочий режим, калибровка не проводится
MD1 MD0 = [01] — калибровка нуля и опорного напряжения
MD1 MD0 = [10] — калибровка нуля
MD1 MD0 = [11] — калибровка опорного напряжения
После процедуры калибровки биты MD1 MD0 возвращаются в рабочий режим [00].
Регистр Clock
Регистр Clock содержит делитель тактовых импульсов на 2 (бит CLKDIS), бит выбора частоты кварцевого резонатора (бит CLKDIV) и биты CLK FS1 FS0 определяющие скорость опроса АЦП (частота дискретизации).
*Бит CLK доступен при использовании кварцевого резонатора 4.9152 MHz
Регистр данных (Data Register)
16 — и бытный регистр, содержит результат измерения.
Ниже показаны эпюры сигналов в режиме чтения и записи регистров.
Запись
Чтение
При записи данных в регистр сигнал CS служит сигналом начала и конца записи данных, запись бита производится на возрастающем фронте сигнала синхронизации SCLK.
При чтении главным условием для начала чтения данных служит сигнал готовности АЦП к передаче данных DRDY, в данном примере сигнал готовности DRDY снимается в выхода АЦП, но можно и не использовать выход DRDY, а брать состояние готовности с бита DRDY коммуникационного регистра. Далее после сигнала CS, на каждом возрастающем фронте сигнала синхронизации SCLK происходит считывание 1 бита данных с выхода DOUT. Запись как и чтение начинается со старшего разряда.
Как ранее отмечалось AD7706 имеет 3 псевдо дифференциальных входа, поэтому общим входом для всех каналов служит вход COMMON. В зависимости от подключения входа COMMON АЦП может измерять биполярное или униполярное напряжение.
Схема включения при измерении униполярного напряжения
Тестовый скетч
// AD7706
#define SCLK 2
#define CS 3
#define DIN 4
#define DOUT 5
#define DRDY 6
#define REF 2.500
#define AIN1 0b00
#define AIN2 0b01
#define AIN3 0b11
#define GAIN_1 0b000000
#define GAIN_2 0b001000
#define GAIN_4 0b010000
#define GAIN_8 0b011000
#define GAIN_16 0b100000
#define GAIN_32 0b101000
#define GAIN_64 0b110000
#define GAIN_128 0b111000
#define F20 0b000 // 5.24 Hz
#define F25 0b001 // 6.55 Hz
#define F100 0b010 // 26.2 Hz
#define F200 0b011 // 52.4 Hz
unsigned long times;
void setup() {
Serial.begin(9600);
pinMode(SCLK,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(DIN,OUTPUT);
pinMode(DOUT,INPUT);
pinMode(DRDY,INPUT);
digitalWrite(SCLK,HIGH);
digitalWrite(CS,HIGH);
digitalWrite(DIN,HIGH);
reset();
write_byte(0x20|AIN2);
write_byte(0x00|F20); // Clock | 2.4576 MHz
delay(100);
}
void loop() {
times=millis();
write_byte(0x10|AIN2);
write_byte(0b01000100|GAIN_1); // Setup | Self-Calibration // Измеренное напряжение от 0 до +2,5 В
write_byte(0x38|AIN2);
unsigned int u_data = read_byte();
Serial.println(REF/65535 * (u_data),5 ); // Цифровое значение от 0(0,0В) до 65535(+2,5В)
Serial.println(u_data); /// Частота опроса
Serial.print("F = ");
Serial.print(1/ ((float(millis()-times))/1000));
Serial.println(" Hz");
Serial.println();
delay(1000);
}
void write_byte(byte data){
digitalWrite(CS,LOW);
for(int i = 7; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, (data >> i) & 1);
digitalWrite(SCLK,HIGH); }
digitalWrite(CS,HIGH);
}
unsigned int read_byte(){
unsigned int data_out=0;
unsigned int dat;
while(digitalRead(DRDY)!=LOW);
digitalWrite(CS,LOW);
for(int i = 15; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SCLK,HIGH);
dat = digitalRead(DOUT);
data_out |= (dat<<i); }
digitalWrite(CS,HIGH);
return data_out;
}
void reset(){
digitalWrite(CS,LOW);
for(int i = 31; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, HIGH);
digitalWrite(SCLK,HIGH); }
digitalWrite(CS,HIGH); }
На вход №2 подано напряжение в 1,8 В. В мониторе порта отображается частота опроса, измеренное напряжение и его цифровое значение которое может находится в пределах от 0 до 65535 (16 бит).
Схема включения при измерении биполярного напряжения
При измерении биполярного напряжения на вход COMMON подается опорное напряжение для создания средней точки, при этом источник входного сигнала не должен иметь соединения с GND АЦП.
Тестовый скетч
// AD7706
#define SCLK 2
#define CS 3
#define DIN 4
#define DOUT 5
#define DRDY 6
#define REF 2.500
#define AIN1 0b00
#define AIN2 0b01
#define AIN3 0b11
#define GAIN_1 0b000000
#define GAIN_2 0b001000
#define GAIN_4 0b010000
#define GAIN_8 0b011000
#define GAIN_16 0b100000
#define GAIN_32 0b101000
#define GAIN_64 0b110000
#define GAIN_128 0b111000
#define F20 0b000 // 5.24 Hz
#define F25 0b001 // 6.55 Hz
#define F100 0b010 // 26.2 Hz
#define F200 0b011 // 52.4 Hz
unsigned long times;
void setup() {
Serial.begin(9600);
pinMode(SCLK,OUTPUT);
pinMode(CS,OUTPUT);
pinMode(DIN,OUTPUT);
pinMode(DOUT,INPUT);
pinMode(DRDY,INPUT);
digitalWrite(SCLK,HIGH);
digitalWrite(CS,HIGH);
digitalWrite(DIN,HIGH);
reset();
write_byte(0x20|AIN2);
write_byte(0x00|F100); // Clock | 2.4576 MHz
delay(100);
}
void loop() {
times=millis();
write_byte(0x10|AIN2);
write_byte(0b01000000|GAIN_1); // Setup | Self-Calibration // Измеренное напряжение от 0 до +/-2,5 В
write_byte(0x38|AIN2);
unsigned int u_data = read_byte();
Serial.println(REF/32768 * (u_data-32768),5 ); // Цифровое значение от 0(-2,5В) до 65535(+2,5В), середина шкалы 32768(0,0В)
Serial.println(u_data); /// Частота опроса
Serial.print("F = ");
Serial.print(1/ ((float(millis()-times))/1000));
Serial.println(" Hz");
Serial.println();
delay(1000);
}
void write_byte(byte data){
digitalWrite(CS,LOW);
for(int i = 7; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, (data >> i) & 1);
digitalWrite(SCLK,HIGH);
}
digitalWrite(CS,HIGH);
}
unsigned int read_byte(){
unsigned int data_out=0;
unsigned int dat;
while(digitalRead(DRDY)!=LOW);
digitalWrite(CS,LOW);
for(int i = 15; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SCLK,HIGH);
dat = digitalRead(DOUT);
data_out |= (dat<<i); }
digitalWrite(CS,HIGH); r
eturn data_out;
}
void reset(){
digitalWrite(CS,LOW);
for(int i = 31; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, HIGH);
digitalWrite(SCLK,HIGH);
}
digitalWrite(CS,HIGH);
}
На вход №2 подано напряжение в +1,48 В. В мониторе порта отображается частота опроса, измеренное напряжение и его цифровое значение которое может находится в пределах от 32768 (0 В) до 65535 (+2,5 В) (15 бит).
На вход №2 подано напряжение в -1,48 В. В мониторе порта отображается частота опроса, измеренное напряжение и его цифровое значение которое может находится в пределах от 0 (-2,5 В) до 32768 (0 В) (15 бит).
Даташит — ad7706.pdf
ATtiny26/L низкопотребляющий 8 битный КМОП микроконтроллер с AVR RISC архитектурой. Выполняя команды за один цикл, ATtiny26/L достигает производительности 1 MIPS при частоте задающего генератора 1 МГц, что позволяет разработчику оптимизировать отношение потребления к производительности.
Характеристики:
Высокая производительность при малом потреблении
RISC архитектура
118- команд, большинство исполняемых за один машинный такт
328 рабочих регистра общего назначения
Полностью статический режим
16 MIPS производительность при 16 МГц
Память
2К байтов FLASH памяти программ с внутрисистемным программированием
1000 циклов записи- стирания
128 байтов EEPROM c внутрисистемным программированием
100 000 циклов записи- стирания
128 байтов внутренней SRAM
Программируемый ключ доступа к программам и памяти данных
Периферия
8- битный таймер/счётчик с программируемым предделителем
8- битный скоростной делитель с программируемым предделителем
2 скоростных ШИМ выхода с отдельным выходным регистром сравнения не совмещённый выход инверсной ШИМ
Универсальный последовательный интерфейс с детектором старта
10- бит АЦП
11 простых униполярных входа
8 дифференциальных входа
7 дифференциальных входа с программируемым усилением ( 1, 10 )
Встроенный аналоговый компаратор
Внешние прерывания
11 прерываний по изменению потенциала вывода
Программируемый Watchdog с переключаемымим генераторами
Специальные функции контроллера
Режим экономии энергии, режим подавления шума, режим Выкл.
Сброс при включении и понижению напряжения питания
Внешние и внутренние источники прерывания
Внутрисистеммное программирование через SPI порт
Внутренний калиброванный RC генератор
20- выводной корпус PDIP или SOIC
16 программируемых входа-выхода
Рабочее напряжение питания:
2.7 В до 5.5 В ATtiny26L
4.5 В до 5.5 В ATtiny26
Рабочая тактовая частота:
0- 8 МГц ATtiny26L
0-16 МГЦ ATtiny26
Микроконтроллер ATtiny26 отлично подходит для маленьких и дешевых проектов, а поддержка средой программирования Arduino IDE заметно упрощает работу с микроконтроллером.
Для поддержки ATtiny26 в Arduino IDE необходимо выполнить несколько простых операций:
Добавление поддержки платы
Откройте в Arduino IDE вкладку Файл > Настройки и добавьте ссылку для менеджера плат
Далее перейдите во вкладку Инструменты > Плата > Менеджер плат
Далее в Инструменты > Плата выберите плату ATtiny26.
Установите параметры платы как показано на скриншоте:
Для прошивки скетча Вам понадобится программатор USBAsp
Схемы подключения
Распиновка программатора USBAsp
Далее необходимо выставить нужные фьюзы для микроконтроллера, чтобы он всегда работал на выбранной Вами частоте. Для этого в настройках Arduino IDE выберите программатор USBasb и нажмите Инструменты > Записать загрузчик. Эту операцию необходимо проводить всего один и снова повторить если Вы будете менять частоту работы микроконтроллера.
Для загрузки скетча в настройках Arduino IDE выберите программатор USBasb и во вкладке Скетч нажмите на Загрузить через программатор.
Для примера, можно загрузить простой скетч мигания светодиода, к выводу 13(PB5) контроллера подключите светодиод через резистор 200 Ом.
#include <avr/io.h>
#include <util/delay.h>
int main(){ DDRB |=(1<<PB5);
while(1){ PORTB |=(1<<PB5);
_delay_ms(1000);
PORTB &=~(1<<PB5);
_delay_ms(1000);
}}
Для нормальной работы микроконтроллера необходимо подать напряжение VCC через резистор 10 кОм на вход RST микроконтроллера.
Ошибка компиляции (проверялось в Linux Ununtu 20.04 | Arduino IDE 1.8.15)
chmod: невозможно получить доступ к ‘/root/.arduino15/packages/ATtiny26/hardware/avr/1.1.0/scripts/create_disassembler_listing.sh’: Нет такого файла или каталога
exit status 1
Ошибка компиляции для платы ATtiny26.
Загрузить файл — create_disassembler_listing.sh
Разместить файл по указанному пути: packages/ATtiny26/hardware/avr/1.1.0/scripts/create_disassembler_listing.sh
Ошибка компиляции (проверялось в Linux Ununtu 20.04 | Arduino IDE 1.8.15)
***failed;
avrdude: WARNING: invalid value for unused bits in fuse «hfuse», should be set to 1 according to datasheet
This behaviour is deprecated and will result in an error in future version
You probably want to use 0x12 instead of 0xf2 (double check with your datasheet first).
Открыть файл — packages/ATtiny26/hardware/avr/1.1.0/boards.txt
Найти строки:
t26.menu.bod.2V7=2.7V
t26.menu.bod.2V7.bootloader.high_fuses=0b11110{bootloader.eesave_bit}10
t26.menu.bod.4V=4.0V
t26.menu.bod.4V.bootloader.high_fuses=0b11110{bootloader.eesave_bit}00
t26.menu.bod.OFF=Disable
t26.menu.bod.OFF.bootloader.high_fuses=0b11110{bootloader.eesave_bit}01
заменить на:
t26.menu.bod.2V7=2.7V
t26.menu.bod.2V7.bootloader.high_fuses=0b00010{bootloader.eesave_bit}10
t26.menu.bod.4V=4.0V
t26.menu.bod.4V.bootloader.high_fuses=0b00010{bootloader.eesave_bit}00
t26.menu.bod.OFF=Disable
t26.menu.bod.OFF.bootloader.high_fuses=0b00010{bootloader.eesave_bit}01
Перезапустить Arduino IDE.
Исходник — https://github.com/Nich1con/ATtiny26-Core
Плата LGT8F328P-LQFP32 MiniEVB основана на китайском микроконтроллер LGT8F328p и является клоном популярной AVR ATmega328p (Arduino NANO). Микроконтроллер LGT8F328p практически полностью совместим с микроконтроллером ATmega328p и обладает рядом дополнительных функций и возможностей превышающих ATmega328p.
Плата LGT8F328P-LQFP32 MiniEVB прошивается через USB кабель, так как на плате установлен контроллер СОМ порта и прошит загрузчик.
Основные характеристики 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-LQFP32 MiniEVB необходимо поэтапно выполнить несколько простых действий:
Добавим поддержку платы LGT8F328P-LQFP32 MiniEVB в Arduino IDE, для этого добавим ссылку в менеджер плат
Далее в менеджере плат находим плату lgt8fx выбрав версию платы 2.0.0 (и выше) и устанавливаем ее:
Далее во вкладке инструменты находим нужную нам плату:
Установите настройки показанные на скриншоте:
После установки настроек платы можно для примера загрузить скетч BLINK. На плате LGT8F328P-LQFP32 MiniEVB установлен светодиод подключенные к выходу D13, после загрузки скетча светодиод должен начать мигать.
Для загрузки скетча
void setup() {
pinMode(LED_BUILTIN, 13); }
void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
Распиновка платы
Микроконтроллер LGT8F328P содержит 4-е таймера, Timer_1 и Timer_3 16 бит, а Timer_0 и Timer_2 8 бит.
Использование таймеров позволяет вызывать прерывание микроконтроллера для выполнения определенного фрагмента кода через заранее установленное время. Например необходимо мигать светодиодом каждую секунду, таймер будет запускать каждую секунду фрагмент кода отвечающего за мигание светодиода, в независимости от действия основной программы.
Все таймеры содержат счетный регистр TCNT который считает тактовые импульсы до определенной величины (зависит от размера), при достижении предельного числа счетчик переполняется и сбрасывается обратно в ноль. Таймер устанавливает бит флага, давая знать, что переполнение произошло, при этом вызывается прерывание.
Источником тактового сигнала для таймера/счетчика может быть как тактовый сигнал используемый для всего микроконтроллера с использованием предделителя, так и сигнал, поступающий с внешнего входа.
Для того чтобы использовать эти таймеры нужно использовать регистры настроек. Каждый таймер содержат несколько таких регистров, как именно использовать эти регистры и режимы работы таймеров будет описано в этой статье.
Режим работы таймера CTC (сброс при совпадении) это когда в регистр OCR микроконтроллера загружается число, а счетный регистр TCNT сравнивает свое значение с числом регистра OCR и при совпадении происходит прерывание и сброс счетного регистра TCNT. При этом в обработчик прерывания исполняет помещенный в него код.
Для примера использования таймера выберем 16 битный таймер Timer_1.
Для настройки таймера в данном примере используется 3 регистра:
TCCR1B — Регистр управления B
OCR1A — Регистр сравнения А выходных данных
TIMSK1 — Регистр маски прерываний счетчика/таймера
Пример скетча:
void setup() {
pinMode(12, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 5;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1B = (1 << WGM12) | n;
OCR1A = 9999;// 0-65535
TIMSK1 |= (1 << OCIE1A); //
_ctc = f_sys / (2 * n * (1 + OCR1A)) // 32 000 000 / (2 * 1024 * (1 + 9999)) = 1.5625 Hz interrupts();
}
void loop() {}
ISR(TIMER1_COMPA_vect){digitalWrite(12, !digitalRead(12));}
Подключите светодиод (через резистор 200 Ом) к выходу D12. После загрузки скетча светодиод начнет мигать с частотой 1,5625 Гц.
TCCR1B
В регистре управления используем бит WGW12 и биты CS10:CS12.
WGW12 активирует режим СТС
CS10:CS12 предделитель который делит тактовую частоту микроконтроллера
OCR1A
16-и битный регистр сравнения, содержит два 8-и битных регистра: OCR1AL и OCR1AH объединены для
формирования 16-разрядного OCR1A.
TIMSK1
Бит регистра TIMSK1 OCIE1A разрешают прерывания при совпадении с A (OCR1A).
ISR(TIMER1_COMPA_vect) — функция обработчика прерывания, в нее помещается код который необходимо исполнять в режиме прерывания.
Если имеется необходимость использовать таймер для генерации импульсов (меандр), в микроконтроллере имеются выходы таймера. Для Timer_1 это выходы D9 и D10.
При совпадении регистра сравнения OCIE1A и счетного регистра состояние выхода таймера меняется на противоположное, а счетный регистр TCNT1 сбрасывается.
Ниже показан пример скетча генерации меандра, таймер работает в режиме CTC
void setup() {
pinMode(9, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 5;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1B = (1 << WGM12) | n;
OCR1A = 9999;// 0-65535
TCCR1A |= (1 << COM1A0);
// f_ctc = f_sys / (2 * n * (1 + OCR1A)) // 32 000 000 / (2 * 1024 * (1 + 9999)) = 1.5625 Hz interrupts();
}
void loop() {}
Бит COM1A0 регистра TCCR1A определяет режим работы таймера. Если установлен бит COM1A0 то состояние на выходе OC1A меняется на противоположное при совпадении.
В этом примере если подключить светодиод (через резистор 200 Ом) к выходу D9, то после загрузки скетча он начнет мигать с частотой 1,5625 Гц.
В нормальном режиме работы таймера можно использовать регистр сравнения OCR1A, при равенстве счетного регистра TCNT1 и регистра сравнения OCR1A происходит прерывание, но в отличии от режима СТС счетный регистр TCNT1 не сбрасывается, а увеличивает свое значение до максимального 65535 и только после этого происходит его сброс и новое прерывание.
Для нормальной работы этого режима в регистре масок прерывания TIMSK1 используются биты OCIE1A и TOIE1.
Бит OCIE1A разрешает прерывание по совпадению, а бит TOIE1 разрешает прерывание по переполнению.
При этом прерывания происходят два раза за один цикл заполнения счетного регистра TCNT1.
Пример скетча
void setup() {
pinMode(12, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 5;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1B = n;
OCR1A = 9999;// 0-65535
TIMSK1 |= (1 << OCIE1A) | (1 << TOIE1);
interrupts();
}
void loop() {}
ISR(TIMER1_COMPA_vect){ digitalWrite(12, !digitalRead(12)); }
При обнулении счетного регистра светодиод подключенный к D12 (через резистор 200 Ом) загорается, как только значение счетного регистра станет равным значению регистра сравнения, светодиод погаснет и не будет светится пока значение счетного регистра не достигнет максимального значения.
Период работы прерывания при переполнении счетного регистра равен:
Tпереполнения = 1/(f sys / (2 * N * 65536))
Период работы прерывания при совпадении равен:
Tсовпадения = 1/(f_sys / (2 * n * (1 + OCR1A)))
В скетче установлен предделитель на 1024, значит:
Tпереполнения = 1/(32 000 000 / (2 * 1024 * 65536)) = 4,19424 с
Период работы прерывания при совпадении при OCR1A = 9999:
Tсовпадения = 1/(32 000 000 / (2 * 1024 * (1 + 9999))) = 0,64 с
Если например не использовать режим работы таймера прерывание и сбор при переполнении, то подключенный светодиод к D12 (через резистор 200 Ом), будет загораться при совпадении значений счетного регистра и регистра сравнения, а после переполнения счетного регистра и новом совпадении значений счетного регистра и регистра сравнения гаснуть.
void setup() {
pinMode(12, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 5;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1B = n;
OCR1A = 20000;// 0-65535
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
void loop() {}
ISR(TIMER1_COMPA_vect){ digitalWrite(12, !digitalRead(12)); }
Если например не использовать режим работы таймера при совпадении значений счетного регистра и регистра сравнения, то подключенный светодиод к D12 (через резистор 200 Ом), будет загораться при переполнении счетного регистра, а после гаснуть при новом переполнении счетного регистра.
void setup() {
pinMode(12, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 5;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1B = n;
TIMSK1 |= (1 << TOIE1);
interrupts();
}
void loop() {}
ISR(TIMER1_OVF_vect){ digitalWrite(12, !digitalRead(12)); }
В нормальном режиме работы таймера можно использовать выход таймера, например если к D9 (через резистор 200 Ом) подключить светодиод, то при совпадении значений счетного регистра и регистра сравнения подключенный светодиод будет загораться и гаснуть при новом при совпадении значений счетного регистра и регистра сравнения.
Если установлен бит COM1A0 то состояние на выходе OC1A (D9) меняется на противоположное при совпадении.
void setup() {
pinMode(D9, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 5;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1A = (1 << COM1A0);
TCCR1B = n;
OCR1A = 9999;
interrupts();
}
void loop() {}
Широтно-импульсная модуляция (PWM) — процесс управления мощностью методом пульсирующего включения и выключения потребителя энергии.
Основной причиной применения ШИМ является стремление к повышению КПД при построении вторичных источников питания электронной аппаратуры и в других узлах, например, ШИМ используется для регулировки яркости подсветки LED-мониторов и дисплеев в телефонах, КПК и т. п.
По сути выходной PWM сигнал в LGT8F328P это импульсный сигнал с изменяемой длительностью импульсов. Если взять период следования импульсов за 100 %, то длительность импульсов может меняться от 0 до 100%, а так как Timer_1 16 бит, то заполнение длительности импульса периода следования импульса может меняться от 0 до 65535 значений, то есть от 0 до 100%.
Режим FPWM
Режим работы FPWM определяется несколькими регистрами, а в частности регистром захвата ICR1 и регистром сравнения OCR1A.
В регистр ICR1 записывается значение которое сравнивается с счетным регистром TCNT1 и при равенстве происходит изменение состояния на выводе OC1A (D9), в данном случае появляется лог. 1, в регистре ICR1 указываем максимальное значение (зависит от разрядности).
В регистр OCR1A записывается значение которое сравнивается с счетным регистром TCNT1 и при равенстве происходит изменение состояния на выводе OC1A (D9), в данном случае появляется лог. 0.
void setup() {
pinMode(D9, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 1;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1A = (1 << COM1A1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | n;
ICR1 = 65535;
OCR1A = 5000;
interrupts();
}
void loop() {}
Бит COM1A1 делает активным выход OC1A (D9), а биты WGM11 WGM12 WGM13 активируют режим FPWM.
Частота PWM в этом режиме определяется:
Fpwm = f sys / (N * (1 + ICR1))
Если предделитель установлен на 1, а регистр ICR1 имеет значение 65535, то:
Fpwm = 32 000 000 / (1 * (1 + 65535)) = 488,28125 Hz
Аналогично можно использовать выход Timer_1 OC1B (D10), использование которого определяет бит COM1B1, при этом используется регистр сравнения OCR1B.
void setup() {
pinMode(D10, OUTPUT);
noInterrupts();
TCNT1 = 0;
TCCR1A = 0;
TCCR1C = 0;
byte n = 1;
// clksys / 1 = 1
// clksys / 8 = 2
// clksys / 64 = 3
// clksys / 256 = 4
// clksys / 1024 = 5
// [CS12:CS10]
TCCR1A = (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | n;
ICR1 = 65535;
OCR1B = 1000;
interrupts();
}
void loop() {}
Так же в этом режиме PWM имеется возможность инверсии выходного сигнала. Биты COM1A1 COM1A0 определяют режим работы выходного сигнала.
S/PDIF (Sony/Philips Digital Interface) – распространенный и стандартизированный интерфейс, предназначенный для передачи цифрового звука между доступными компонентами, звуковыми картами, ресиверами и аудиоаппаратурой.
I2S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств. Применяется для передачи PCM-аудиоданных между интегральными схемами в электронном устройстве. Шина I2S передает по разным линиям сигналы синхронизации и сигналы данных, что приводит к снижению фазового дрожания, типичного для систем связи, восстанавливающих сигналы синхронизации из целого потока.
NTP8212 — полнофункциональный цифровой аудио усилитель (класса D), включающий силовой каскад для
системы стерео усилителей. В NTP8212G интегрирована система цифровой обработки аудиосигнала (ЦАП), высокоточный цифровой ШИМ-модулятор и два мощных полномостовых каскада питания МОП-транзисторов.
NTP8212G поддерживает формат передачи цифровых данных I2S (I²S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств) с частотой дискретизации от 8 кГц до 192 кГц, с разрешением до 24 бит.
Усилитель выдает 2 x 20 Вт (при питании 24 В на нагрузке 8 Ом), оснащен цифровым регулятором громкости, баланса, имеет 5-и полосный эквалайзер, так же доступны функции MUTE и STANDBY.
Структурная схема усилителя
Основные параметры усилителя NTP8212:
Напряжение питания цифровое от 3,0 до 3,6 В (3,3 В рекомендуемое)
Аналоговое питание от 4,5 до 28 В
Отношение сигнал/шум 95 дБ
Коэффициент гармоник (THD+N 1W, 1kHz) не более 0,1 %
КПД усилителя 90 %
Частота PWM 384 кГц
Управление цифровое I2C
Ток потребления в режиме STANDBY не более 0.2 мкА
5-и полосный эквалайзер 100 Гц, 300 Гц, 1 кГц, 3 кГц, 10 кГц с диапазоном регулировки от -12 до +12 дБ
Для правильной работы цифрового усилителя NTP8212, необходимо использовать ресивер, который преобразует сигнал S/PDIF в формат I2S. В данном примере использован ресивер CS8416.
Параметры ресивера CS8416:
Напряжение питания:
+3.3 V Analog Supply (VA)
+3.3 V Digital Supply (VD)
+3.3 V or +5.0 V Digital Interface Supply (VL)
Входной формат данных: S/PDIF
Выходной формат данных:
Left-Justified
Right-Justified
I2S (аппаратно настроен)
Разрядность 16 — 24 бит (аппаратно настроен на 24 бит)
Частота дискредитации 32 — 192 кГц (аппаратно настроен на 192 кГц)
Фильтр De-emphasis:
No De-emphasis (аппаратно настроен)
32 kHz
48 kHz
44.1 kHz
Кол-во входов: 8 (аппаратно поддерживает 4)
Ресивер CS8416 имеет цифровой интерфейс управления, но может быть сконфигурирован аппаратно. В данном примере ресивер сконфигурирован аппаратно и имеет выходной формат I2S 24 бит с частотой дискредитации 192 кГц. При аппаратной настройке в ресивере доступно 4 входа S/PDIF (8 входов при программном управлении).
Коммутация входами осуществляется при помощи пинов RSEL1 и RSEL0 микросхемы ресивера , при этом лог. 1 подается с питания VL (+5 В), а логический ноль с DGND.
INPUT RSEL0 RSEL1
RXP0 00 RXP1 10
RXP2 01 RXP3 11
Ресивер работает независимо от Arduino, в схеме присутствует индикатор режима работы светодиод D1, при подключении коаксиального кабеля с источником цифрового сигнала светодиод гаснет, при отключении кабеля загорается.
Для управления работой усилителя и ресивера используется плата Arduino Nano, три кнопки и энкодер (модуль KY-040), так же управление полностью продублировано ИК пультом, информация о текущих настройка отображается на дисплее LCD1602 с платой I2C.
Схема ресивера
Схема усилителя
Схема управления
На дисплей выводится три меню, переключение меню осуществляется при помощи кнопки энкодера.
Меню индикаторов громкости (от 0 до 99) и коммутатора входов
Регулировка громкости осуществляется при помощи энкодера.
Меню эквалайзера, регулировка уровня усиления или ослабления выбранной полосы осуществляется при помощи энкодера, выбор полосы происходит при нажатии на кнопку INPUT/EQ_F. Меню эквалайзера содержит графический индикатор регулировки полос.
Меню регулировки баланса
Режим MUTE
Режим STANDBY
Так как предусмотрена управляемая яркость подсветки дисплея, то можно установить яркость подсветки в основном режиме и в режиме STANDBY (как правило с пониженной яркостью подсветки), регулировка яркости подсветки осуществляется через скетч:
#define BRIG_H 200 // Яркость 0…255 POWER ON
#define BRIG_L 50 // Яркость 0…255 POWER OFF
Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).
Максимальный выходной ток одного выхода Arduino Nano не должен превышать 40 мА (рекомендуется не более 20 мА).
ИК пульт дублирует работу энкодера и кнопок. Для управления усилителем подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:
#define IR_1 0x2FDD02F // Кнопка вверх #define IR_2 0x2FD32CD // Кнопка вниз #define IR_3 0x2FD906F // Кнопка > #define IR_4 0x2FDF20D // Кнопка < #define IR_5 0x2FD6A95 // Кнопка IN #define IR_6 0x2FDEA15 // Кнопка MUTE #define IR_7 0x2FD00FF // Кнопка STANDBY (POWER)
Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.
Скетч - http://rcl-radio.ru/?p=129927
OLED 1.3″ I2C 128х64 дисплей обладает высокой контрастностью, высоким разрешением и низким энергопотреблением. В OLED дисплее отсутствует дополнительный слой подсветки всей поверхности экрана. Каждый пиксел, формирующий изображение, испускает самостоятельное свечение.
Чип драйвера — SH1106, который обеспечивает связь I2C.
Параметры дисплея SH1106:
Технология дисплея: OLED
Разрешение дисплея: 128 на 64 точки
Диагональ дисплея: 1,3 дюйма
Угол обзора > 170°
Напряжение питания: 3,3 В ~ 5.0 В
Мощность: 0,08 Вт
Габариты: 35.7 х 30.9 х 4.0 мм
Вес: 7 грамм
Подключение OLDE дисплея к плате Arduino Nano (Uno):
VCC > 5V
GND > GND
SCL > A5 (I2C)
SDA > A4 (I2C)
Ниже показан тестовый скетч который содержит пример вывода текста и цифр. В тестовом скетче используется библиотека U8glib которая доступна для установки через менеджер библиотек Arduino IDE , библиотека так же содержит большое количество примеров.
#include <Wire.h>
#include <U8glib.h> // https://github.com/olikraus/u8glib/
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);
int i;
char s[6];
void setup() {
Wire.begin();
// u8g.setRot180();
}
void loop(void) {
u8g.firstPage();
do {
u8g.setFont(u8g_font_profont15r);
u8g.drawStr( 0, 12, "OLED 1.3 128x64");
u8g.setFont(u8g_font_profont11r);
u8g.drawStr( 0, 25, "SH1106 U8glib");
u8g.drawStr( 0, 37, "RCL-RADIO.RU");
u8g.setFont(u8g_font_profont22r);
u8g.drawLine(0, 45, 128, 45);
u8g.setPrintPos(0, 64);
u8g.print(-3.14);
// u8g.print(2023);
}
while( u8g.nextPage() );
delay(500);
}
S/PDIF (Sony/Philips Digital Interface) – распространенный и стандартизированный интерфейс, предназначенный для передачи цифрового звука между доступными компонентами, звуковыми картами, ресиверами и аудиоаппаратурой.
I2S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств. Применяется для передачи PCM-аудиоданных между интегральными схемами в электронном устройстве. Шина I2S передает по разным линиям сигналы синхронизации и сигналы данных, что приводит к снижению фазового дрожания, типичного для систем связи, восстанавливающих сигналы синхронизации из целого потока.
NTP3000(А) — полнофункциональный цифровой аудио усилитель (класса D), включающий силовой каскад для
системы стерео усилителей. В NTP3000(А) интегрирована система цифровой обработки аудиосигнала (ЦАП), высокоточный цифровой ШИМ-модулятор и два мощных полномостовых каскада питания МОП-транзисторов.
NTP3000(А) поддерживает формат передачи цифровых данных I2S (I²S — стандарт интерфейса электрической последовательной шины, использующийся для соединения цифровых аудиоустройств) с частотой дискретизации от 8 кГц до 192 кГц, с разрешением до 24 бит.
Усилитель выдает 2 x 30 Вт, оснащен цифровым регулятором громкости, баланса, имеет 7-и полосный эквалайзер, так же доступны функции MUTE и STANDBY.
Структурная схема усилителя
Параметры ресивера CS8416:
Напряжение питания:
+3.3 V Analog Supply (VA)
+3.3 V Digital Supply (VD)
+3.3 V or +5.0 V Digital Interface Supply (VL)
Входной формат данных: S/PDIF
Выходной формат данных:
Left-Justified
Right-Justified
I2S (аппаратно настроен)
Разрядность 16 — 24 бит (аппаратно настроен на 24 бит)
Частота дискредитации 32 — 192 кГц (аппаратно настроен на 192 кГц)
Фильтр De-emphasis:
No De-emphasis (аппаратно настроен)
32 kHz
48 kHz
44.1 kHz
Кол-во входов: 8 (аппаратно поддерживает 4)
Основные параметры усилителя NTP3000(A):
Напряжение питания основной логики 1,8 В
Напряжение питания аналоговое 1,8 В
Напряжение питания цифровое 1,8 В
Напряжение питания для каскадов ввода/вывода 3,3 В
Напряжение питания для силового каскада 7… 30 В (6 А)
Выходная мощность для выхода 2.0 2х30 Вт
Выходная мощность для выхода 2.1 1х30 Вт + 2х15 Вт
Входной сигнал I2S 24 бит 192 кГц
7 полосный эквалайзер
Динамический диапазон 100 дБ
Частота дискретизации от 8 до 192 кГц
Коэффициент гармоник (THD+N / 1W, 1kHz) 0,01%
Управление цифровое I2C
Ресивер CS8416 имеет цифровой интерфейс управления, но может быть сконфигурирован аппаратно. В данном примере ресивер сконфигурирован аппаратно и имеет выходной формат I2S 24 бит с частотой дискредитации 192 кГц. При аппаратной настройке в ресивере доступно 4 входа S/PDIF (8 входов при программном управлении).
Коммутация входами осуществляется при помощи пинов RSEL1 и RSEL0 микросхемы ресивера , при этом лог. 1 подается с питания VL (+5 В), а логический ноль с DGND.
Ресивер работает независимо от Arduino, в схеме присутствует индикатор режима работы светодиод D1, при подключении коаксиального кабеля с источником цифрового сигнала светодиод гаснет, при отключении кабеля загорается.
Усилитель NTP3000(А) имеет цифровое управление I2C, может определятся по двум I2C адресам. Для выбора адреса необходимо на вход AD микросхемы подать лог 0 или 1.
Интерфейс последовательной шины I2S в данной схеме состоит из трех сигналов — BCK, WCK, SDATA.
WCK — выбор ПК / ЛК
BCK — синхроимпульсы
SDATA — данные
Схема ресивера
Схема усилителя
Схема управления
Схема источника питания
Для каждого источника питания рекомендуется использовать отдельный стабилизатор, например усилитель имеет три источника питания 1,8 В, для каждого необходим отдельный стабилизатор.
Для управления работой усилителя и ресивера используется плата Arduino Nano, три кнопки и энкодер (модуль KY-040), так же управление полностью продублировано ИК пультом, информация о текущих настройка отображается на дисплее LCD1602 с платой I2C.
На дисплей выводится три меню, переключение меню осуществляется при помощи кнопки энкодера.
Меню индикаторов громкости (от 0 до 92) и коммутатора входов
Регулировка громкости осуществляется при помощи энкодера.
Меню эквалайзера, регулировка уровня усиления или ослабления выбранной полосы осуществляется при помощи энкодера, выбор полосы происходит при нажатии на кнопку INPUT/EQ_F. Меню эквалайзера содержит графический индикатор регулировки полос.
Меню регулировки баланса
Режим MUTE
Режим STANDBY
Так как предусмотрена управляемая яркость подсветки дисплея, то можно установить яркость подсветки в основном режиме и в режиме STANDBY (как правило с пониженной яркостью подсветки), регулировка яркости подсветки осуществляется через скетч:
#define BRIG_H 200 // Яркость 0…255 POWER ON
#define BRIG_L 50 // Яркость 0…255 POWER OFF
Подсветка — убрать перемычку с модуля I2C PCF8574 и подключить вывод модуля к цифровому выходу Arduino D6. Перед подключением замерить ток подсветки который не должен превышать 20 мА (у моего модуля ток не более 15 мА, замер производить между контактами перемычки).
ИК пульт дублирует работу энкодера и кнопок. Для управления усилителем подойдет практически любой пульт ИК, для поддержки Вашего пульта необходимо прописать коды кнопок в скетч:
#define IR_1 0x2FDD02F // Кнопка вверх
#define IR_2 0x2FD32CD // Кнопка вниз
#define IR_3 0x2FD906F // Кнопка >
#define IR_4 0x2FDF20D // Кнопка <
#define IR_5 0x2FD6A95 // Кнопка IN
#define IR_6 0x2FDEA15 // Кнопка MUTE
#define IR_7 0x2FD00FF // Кнопка STANDBY (POWER)
Для получения кодов кнопок Вашего пульта загрузите скетч и откройте монитор порта, при нажатии кнопки пульта его код будет отображен в мониторе порта.
Усилитель в настройке не нуждается, помимо занесения в скетч кодов кнопок пульта и параметров подсветки дисплея можно подкорректировать в скетче общее усиление усилителя:
#define GAIN 80 // 10 — 126 КОЭФФИЦИЕНТ УСИЛЕНИЯ УСИЛИТЕЛЯ
Скетч - http://rcl-radio.ru/?p=130078