Часы на ИВЛ1-7/5 + PT6312 VFD (Arduino)

ИВЛ1-7/ 5 представляет собой цифровой многоразрядный вакуумный люминесцентный индикатор предназначенный для отображения информации в виде цифр от 0 до 9 в 1, 2, 4 и 5-м цифровых разрядах и двух точек в 3-м разряде в средствах отображения информации индивидуального и группового пользования.

Основные данные индикатора ИВЛ1–7/5:

  • Цвет свечения: Зеленый
  • Номинальная яркость индикатора 500 кд/м2, минимальная – 300 кд/м2.
  • Напряжение накала: 5 В
  • Ток накала: 120 ± 12 мА
  • Напряжение анода–сегмента импульсное: 27 В
  • Ток анодов–сегментов импульсный одного разряда: 12 мА
  • Напряжение сетки импульсное: 27 В
  • Ток сетки импульсный одного разряда: 12 мА
  • Скважность: 5 ± 0,5
  • Минимальная наработка: 10 000 ч
  • Яркость индикатора, изменяющаяся в течение минимальной наработки, не менее: 100 кд/м2
  • Срок хранения не менее: 4 лет

Предельно допустимый электрический режим индикатора ИВЛ1–7/5:

  • Напряжение накала строго в пределах: 4,5–5,8 В
  • Наибольшее напряжение анодов–сегментов: 50 В
  • Наибольшее напряжение сетки импульсное: 50 В

Не рекомендуется эксплуатировать индикатор ИВЛ1–7/5 при питании цепи накала постоянным током. Предпочтительно питать цепь накала переменным током от обмотки трансформатора с отводом от середины, служащим общей точкой вывода катода.

Видимое свечение анода-сегмента при поданном напряжении на сетку наступает при положительном потенциале анода-сегмента 2,5 — 3,0 В. Чтобы избежать возможной подсветки потенциал на аноде-сегменте не должен превышать 1,5 — 2,0 В.
В исключительном ряде случаев допускается эксплуатация индикатора ИВЛ1–7/5  при напряжении накала 6,0 В; общее время работы при данном режиме не должно превышать 10 % от всего времени минимальной наработки.

На платформе Arduino (LGT8F328) с использованием ИВЛ1–7/5 можно собрать достаточно простые часы. В часах применяются часы реального времени DS3231. Напряжения питания часов 9 В. Для упрощения схемы в часах используется ИМС PT6312 который представляет собой контроллер вакуумного люминесцентного дисплея (VFD). Более подробно об ИМС PT6312 описано в — http://rcl-radio.ru/?p=131596.

Часы состоят всего из нескольких компонентов:

  • Индикатор ИВЛ1-7/5
  • ИМС PT6312
  • Часы реального времени (модуль) DS3231
  • Плата разработчика Arduino на базе контроллера Atmega328 или LGT8F328
  • Преобразователь напряжения

Схема часов

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

Преобразователь имеет трансформатор выполненный из ферритового сердечника (гантельный сердечник) на который намотано 3 обмотки проводом диаметром 0,3 мм.

Первая обмотка содержит 20 витков, вторая 20 витков с отводом от середины, третья содержит 130 витков.

Если напряжение накала будет намного меньше 5 В, то поменяйте местами выводы обмотки II.

Скетч

#define STB 4
#define DIN 2
#define CLK 3

#define SET 5
#define UP  6
#define DW  7

#include <Wire.h>
#include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
DS3231 clock;RTCDateTime DateTime;

int a[5];
int hour,minut,set;
long times,times0;
bool d,mig;

void setup(){
  Serial.begin(9600);clock.begin();
  ///clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
  pinMode(STB,OUTPUT);
  pinMode(DIN,OUTPUT);
  pinMode(CLK,OUTPUT);
  pinMode(SET,INPUT_PULLUP);  
  pinMode(UP,INPUT_PULLUP);
  pinMode(DW,INPUT_PULLUP);  
  delay(100);
  digitalWrite(STB,HIGH);delay(200);
  // PWM OUTPUT D9 TIMER 1 
  TCCR1A = 0;TCCR1B = 0;
  TCCR1A = (1 << COM1A1)|(1 << WGM11);
  TCCR1B = (1 << WGM13)|(1 << WGM12)|(1 << CS10);
  DDRB =  1 << DDB1; // OUTPUT PWM (OCR1A)
  OCR1A = 15;
  ICR1 = 40;
  write_byte1_PT6312(0b01000100);// command 2
  write_byte1_PT6312(0b00000100);// command 1 8dig/14seg
  write_byte1_PT6312(0b10001111);// command 4 display on
  }

void loop(){
  DateTime = clock.getDateTime();
  hour = DateTime.hour;
  minut = DateTime.minute; 

  if(digitalRead(SET)==LOW){set++;if(set>2){set=0;} delay(300);} 
  if(digitalRead(UP)==LOW&&set==1){hour++;if(hour>23){hour=23;} clock.setDateTime(2024, 2, 22, hour, minut, 0);delay(100);} 
  if(digitalRead(DW)==LOW&&set==1){hour--;if(hour<0){hour=0;} clock.setDateTime(2024, 2, 22, hour, minut, 0);delay(100);} 
  if(digitalRead(UP)==LOW&&set==2){minut++;if(minut>59){minut=59;} clock.setDateTime(2024, 2, 22, hour, minut, 0);delay(100);} 
  if(digitalRead(DW)==LOW&&set==2){minut--;if(minut<0){minut=0;} clock.setDateTime(2024, 2, 22, hour, minut, 0);delay(100);} 
  
  if(millis()-times0<200){mig=1;}
  if(millis()-times0>200){mig=0;}
  if(millis()-times0>400){times0=millis();}

  if(millis()-times<500){d=1;}
  if(millis()-times>500){d=0;}
  if(millis()-times>1000){times=millis();}
  
  if(set==0){
  a[0]=minut%10;
  a[1]=minut/10%10;
  a[2]=hour%10;
  a[3]=hour/10%10;}

  if(set!=2){a[0]=minut%10;}
  if(set!=2){a[1]=minut/10%10;}
  if(set==2&&mig==0){a[0]=minut%10;}
  if(set==2&&mig==0){a[1]=minut/10%10;}
  if(set==2&&mig==1){a[0]=10;}
  if(set==2&&mig==1){a[1]=10;}

  if(set!=1){a[2]=hour%10;}
  if(set!=1){a[3]=hour/10%10;}
  if(set==1&&mig==0){a[2]=hour%10;}
  if(set==1&&mig==0){a[3]=hour/10%10;}
  if(set==1&&mig==1){a[2]=10;}
  if(set==1&&mig==1){a[3]=10;}
  
 
             //dp g f e d c b a 
  write_byte2_PT6312(0b11000000,seg(a[0],0));//GR1
  write_byte2_PT6312(0b11000010,seg(a[1],0));//GR2
  write_byte2_PT6312(0b11000100,seg(a[2],0));//GR3
  write_byte2_PT6312(0b11000110,seg(a[3],0));//GR4
  write_byte2_PT6312(0b11001000,seg(0,d));//GR5
  delay(100);
}

byte seg(int a, bool dp){
  byte segm;
  switch(a){
    case 0: segm=0b00111111+(dp<<7);break;
    case 1: segm=0b00000110+(dp<<7);break;
    case 2: segm=0b01011011+(dp<<7);break;
    case 3: segm=0b01001111+(dp<<7);break;
    case 4: segm=0b01100110+(dp<<7);break;
    case 5: segm=0b01101101+(dp<<7);break;
    case 6: segm=0b01111101+(dp<<7);break;
    case 7: segm=0b00000111+(dp<<7);break;
    case 8: segm=0b01111111+(dp<<7);break;
    case 9: segm=0b01101111+(dp<<7);break;
    case 10:segm=0b00000000;break;// пусто
    case 11:segm=0b01000000;break;// -
    case 12:segm=0b01100011;break;// градус
    case 13:segm=0b00111001;break;// С
    }
    return segm;
  }

void write_byte1_PT6312(byte data){
     digitalWrite(STB,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(CLK,HIGH);
     }  
     digitalWrite(STB,HIGH);delay(1);
  }  

void write_byte2_PT6312(byte reg, byte data){
     digitalWrite(STB,LOW);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(CLK,HIGH);
     }  
     delay(1);
   for(int i = 0; i <= 7; i++){
     digitalWrite(CLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(CLK,HIGH);
     }    
     digitalWrite(STB,HIGH);delay(1);
  }    

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

Установите значение регистра равным 10 и замерьте анодное напряжение, оно должно находиться в пределах от -24 до -36 В (при напряжении накала ~5 В). При необходимости измените значение регистра. В моем случает в OCR1A установлено значение 15 (20 = ШИМ 50%), анодное напряжение -35 В (под нагрузкой).

OCR1A = 10;

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=9549#p9549

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

Войти с помощью: