| Ваш IP: 44.197.197.23 | Online(30) - гости: 4, боты: 26 | Загрузка сервера: 0.52 ::::::::::::

Амперметр на ADS1110 (Arduino IDE | Atmega8L)

На АЦП ADS1110 можно собрать простой и точный амперметр постоянного тока. Диапазон измерения амперметра от 5 мА до 9.999 А с разрешением 1 мА. В качестве датчика тока используется манганиновая проволока диаметром не менее 2 мм с сопротивлением 0.01 Ом.

ADS1110 (более подробно) это прецизионный аналого-цифровой (A/D) преобразователь с дифференциальным входом и разрешением до 16 бит. Встроенный ИОН 2,048 В обеспечивает входной диапазон ±2,048 В. ADS1110 использует I2C интерфейс для связи с микроконтроллером. ADS1110  выполняет измерения со скоростью 15, 30, 60 или 240 выборок в секунду, содержит встроенный усилитель напряжения с коэффициентом 1, 2, 4, 8.

Падение напряжения на шунте при токе 10 А составляет 100 мВ, это напряжение подается на вход АЦП, диапазон измерения входа АЦП при множителе 8 от 0 до 256 мВ, поэтому теоретически амперметр может иметь предел измерения до 25 А.

Показания тока выводятся на четырех разрядный семисегментный индикатор TM1637.

В амперметре используется микроконтроллер Atmega8L с частотой кварцевого резонатора 4 МГц, но скетч программно совместим с Atmega168, Atmega328 (Arduino Nano).

Загрузка скетча в Atmega8L через Arduino IDE — https://rcl-radio.ru/?p=82486

#define ADDR    0x48
#define CPU_F   4000000 // Clock Speed // 16000000 >>> Arduino Nano
#define SCL_F   50000 // // I2C Speed
 
#define CLK 2// PD2
#define DIO 3// PD3
 
#define KALL_0 18
#define KALL_I 25887//(25600)
 
long dig_sum,dig,u;
 
 
void setup() {
   TWBR = (((CPU_F)/(SCL_F)-16 )/2) ;
   TWSR = 0;
}
 
void loop() {
 for(int i=0;i<10;i++){
   dig_sum = dig_sum+read_u(ADDR,0b10001111);delay(20);}
   dig = dig_sum/10;dig_sum=0;
   u = dig*KALL_I/0x7FFF-KALL_0;
   if(u<5){u=0;}
   print_time(u,3,7);
  }
 
int read_u(byte i2c_addr, byte i2c_reg){
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_addr << 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
   TWDR = i2c_reg;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
 
   TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);  // START
  while (!(TWCR & (1<<TWINT))); 
   TWDR = (i2c_addr << 1) | 1;
   TWCR = (1<<TWINT) | (1<<TWEN);
  while (!(TWCR & (1<<TWINT)));
 
  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA); 
  while(~TWCR&(1<<TWINT));
   int i2c_data0 = TWDR; 
 
   TWCR = (1<<TWINT) | (1<<TWEN);
   while(~TWCR&(1<<TWINT));
   int i2c_data1 = TWDR; 
 
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // СТОП
   int i2c_data = (i2c_data0<<8)+i2c_data1;
   return i2c_data;
  }  
 
void tm_dec(byte dig){
       for(int i = 0; i < 8; i++) {
         DDRD |= (1 << CLK);del();
       if (dig & 0x01)
         DDRD &= ~(1 << DIO);
       else
         DDRD |= (1 << DIO);del();
         DDRD &= ~(1 << CLK);del();
         dig = dig >> 1;
  }
         DDRD |= (1 << CLK);
         DDRD &= ~(1 << DIO);del();
         DDRD &= ~(1 << CLK);del();
 
       if (((PIND >> DIO) & 1) == 0)
         DDRD |= (1 << DIO);del();
         DDRD |= (1 << CLK);del();
  }  
 
void tm_stop(){
         DDRD |= (1 << DIO);del();
         DDRD &= ~(1 << CLK);del();
         DDRD &= ~(1 << DIO);del();
  }  
 
void tm_start(){
         DDRD |= (1 << DIO);del();
  }
 
void print_time(int t, byte pd_t, int br){
        tm_start();tm_dec(0b10001000 + br);//tm_stop();tm_start();
        tm_dec(0x40);tm_stop();tm_start();
 
        int data0 = t / 1000 % 10;
        int data1 = t / 100 % 10;
        int data2 = t / 10 % 10;
        int data3 = t % 10;
 
      for(byte n = 0; n < 4; n++){
        int data;
      switch(n){
        case 0: data = data0;break;
        case 1: data = data1;break;
        case 2: data = data2;break;
        case 3: data = data3;break;
        }
 
      switch(data){    // XGFEDCBA
        case 0:  data = 0b00111111;break;     // 0
        case 1:  data = 0b00000110;break;     // 1
        case 2:  data = 0b01011011;break;     // 2
        case 3:  data = 0b01001111;break;     // 3
        case 4:  data = 0b01100110;break;     // 4
        case 5:  data = 0b01101101;break;     // 5
        case 6:  data = 0b01111101;break;     // 6
        case 7:  data = 0b00000111;break;     // 7
        case 8:  data = 0b01111111;break;     // 8
        case 9:  data = 0b01101111;break;     // 9
        case 10: data = 0b00000000;break;     // пусто
        case 11: data = 0b01000000;break;     // -
        }
 
        if(n == 0){data0 = data;}
        if(n == 1){data1 = data;}
        if(n == 2){data2 = data;}
        if(n == 3){data3 = data;}
        }
      switch(pd_t){
        case 1 : data2 = data2+0b10000000;break;
        case 2 : data1 = data1+0b10000000;break;
        case 3 : data0 = data0+0b10000000;break;
        }
      tm_dec(0xC0);tm_dec(data0);tm_dec(data1);tm_dec(data2);tm_dec(data3);tm_stop();
}  
 
void del(){delayMicroseconds(200);}

Амперметр нуждается в калибровке:

#define KALL_0 18 — При токе 0, на дисплее будут показания погрешности нуля, укажите это значение в переменной KALL_0.

#define KALL_I 25887 — Калибровочный коэффициент для устранения погрешности измерения. Подайте на вход амперметра ток в от 8 до 9.5 А, оцените погрешность измерения, после чего уточните калибровочный коэффициент.

 

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

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

Случайные статьи

  • Реле времени для фотопечати

    Основные параметры: Диапазон выдержек I — 1…6с II — 5,5…33с III — 31…186с Стабильность выдержки 2% Потребляемая мощность 2,5Вт К сети реле времени подключают тумблером S1. Для смены кадров фотоувеличитель включают выключателем S4. При выключенном положении тумблера S1 его контакты S1.2 шунтирует симистор V16 и напряжение сети поступает непосредственно на …Подробнее...
  • Комбинированный биостимулятор

    На рисунке показана схема простого биостимулятора, он совмещает в себе 2-а уст-ва: прибор для электропунктуры и фотостимулятор биологически активных точек (БАТ) организма. Стимулятор может работать в режиме непрерывной генерации ( используем переключатель SA1). Режимы работы стимулятора можно менять переключателями SA1 SA2. Схема биостимулятора проста и после сборки в налаживании не …Подробнее...
  • Автогенераторы на элементах ТТЛ

    При помощи элементов ТТЛ можно изготовить автогенераторы у которых выходная частота превышает 30 МГц. Для того чтобы автогенератор быстро возбуждался и работал стабильно во всем диапазоне внешних воздействий, усилительная линейка должна быть не инвертирующей с большим коэффициентом усиления Ku, который по возможности следует стабилизировать. Схемы простых автогенераторов показаны на рисунках …Подробнее...
  • К1055ХВ7Р — ИС УПРАВЛЕНИЯ РЕЛЕ ВКЛЮЧЕНИЯ ЛАМП АВТОМОБИЛЯ

    К1055ХВ7Р — ИС УПРАВЛЕНИЯ РЕЛЕ ВКЛЮЧЕНИЯ ЛАМП АВТОМОБИЛЯ

    Микросхема К1055ХВ7Р является интегральной схемой управления реле включения ламп автомобиля. Она изготовлена по уникальной биполярной технологии, разработанной для класса ИС, ориентированных на применение в бортовой сети автомобилей. ИС предназначена для работы в качестве мощного счетного триггера в составе реле включения задних противотуманных огней, реле включения передних противотуманных огней, реле включения / переключения ближнего и дальнего света автомобиля с …Подробнее...
  • Домашняя метеостанция (Arduino)

    Домашняя метеостанция (Arduino)

    В домашней метеостанции будут использоваться следующие компоненты: Arduino Nano модуль DS3231 — часы реального времени модуль BMP280 — датчик атмосферного давления и температуры (измерение атмосферного давления в мм.рт.ст и  температуры в комнате) модуль 18B20 — цифровой датчик температуры (измерение температуры на улице) модуль DHT11 — датчик влажности LCD 1602  на базе …Подробнее...