Измеритель емкости на LGT8F328

Пример создания измерителя емкости на LGT8F328 является продолжением статьи http://rcl-radio.ru/?p=131706 посвященной примерам работы компаратора в микроконтроллере LGT8F328.

Измеритель емкости в данном примере основан на времени заряда конденсатора. Напряжение на измеряемые конденсаторы подается через 2 резистора с сопротивлением в 1 кОм и 1 МОм, что соответственно позволяет получить два основных диапазона измерений. В первом диапазоне происходит измерение емкости от единиц до нескольких тысяч пФ, второй диапазон рассчитан для измерения емкости от нескольких тысяч пФ до 10000 мкФ.

Схема измерителя емкости

В измерителе емкости используется компаратор микроконтроллера LGT8F328, на один из входов которого подается опорное напряжение в 3,3 В, а на другой вход напряжение заряда конденсатора.

Измерение емкости происходит циклично, сначала происходит разряд конденсатора, а далее зарядка. Как только начинается заряд конденсатора запускается таймер_1, для отсчета времени заряда (в данном примере таймер_1 работает всегда, происходит только обнуление счетного регистра и кол-во прерываний).  Во время зарядки конденсатора напряжение на нем возрастает, как только это напряжение достигнет 3,3 В, выход компаратора (в данном случае считывается состояние бита C0O регистра C0SR) меняет свое состояние и происходит фиксация времени заряда при помощи таймера_1. Далее при помощи простых вычислений получаем измеренное значение емкости конденсатора.

В измерите емкости для вывода показаний используется дисплей OLED 0.91.

0,91″ I2C 128×32 OLED — это компактный дисплей, который использует технологию OLED (Organic Light Emitting Diode) для отображения изображений. Дисплей имеет интерфейс I2C, который обеспечивает простое подключение к микроконтроллерам и другим устройствам.

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

— Разрешение 128×32 пикселей.
— Размер дисплея 0,91 дюйма (около 2,3 см).
— Яркость до 150 кд/м².
— Контрастность 2000:1.
— Угол обзора 160 градусов.
— Поддержка интерфейса I2C с адресом 0x3C.

Дисплей 0,91″ I2C 128×32 OLED обеспечивает четкое и яркое отображение информации, которое может быть использовано в широком спектре приложений. Он легко подключается к различным устройствам, таким как Arduino, Raspberry Pi и другим микроконтроллерам.

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

В целом, дисплей 0,91″ I2C 128×32 OLED является отличным выбором для тех, кто ищет компактный и яркий OLED-дисплей с простым подключением по интерфейсу I2C.

В измерителе используется плата разработчика LGT8F328P-LQFP32 MiniEVB, как использовать плату в среде программирования Arduino IDE рассказано в — http://rcl-radio.ru/?p=129966

LGT8F328P-LQFP32 MiniEVB — это плата разработки, основанная на микроконтроллере LGT8F328P с 32 выводами в корпусе LQFP32. Это мощный микроконтроллер, который обеспечивает высокую производительность и широкие возможности для разработки.

Основные характеристики платы LGT8F328P-LQFP32 MiniEVB:

— Микроконтроллер LGT8F328P с тактовой частотой до 32 МГц и 32 Кбайт памяти Flash.
— Поддержка интерфейсов SPI, I2C, UART, ADC и PWM.
— Встроенный USB-интерфейс для программирования и отладки.
— Низкое энергопотребление и поддержка режима сна.
— Поддержка работы от внешнего источника питания 5 В или от USB-порта.

LGT8F328P-LQFP32 MiniEVB — это отличная плата разработки для начинающих и опытных разработчиков, которые хотят создавать проекты на основе микроконтроллера LGT8F328P. Она обеспечивает легкую разработку и отладку приложений, поддерживает широкий спектр интерфейсов и имеет удобный USB-интерфейс для программирования и отладки.

Кроме того, плата LGT8F328P-LQFP32 MiniEVB имеет компактный размер и низкое энергопотребление, что позволяет использовать ее в различных приложениях, включая портативные устройства и системы автоматизации.

Скетч

#define CALL_UF   6.10
#define CALL_NF   6.58

#include <Wire.h> 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
U8GLIB_SSD1306_128X32 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI 

volatile  int x;
float null_c;
bool mk;
unsigned long c_f,times0,times1;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  PORTB |=(1<<PB5);
// TIMER_1 /////////////////////////  
  TCNT1 = 0;TCCR1A = 0;TCCR1C = 0;TCCR1B = 2;TIMSK1 |= (1 << TOIE1);
// COMPARATOR_0 ////////////////////  
  C0SR = 0;C0XR=0;ADMUX=0;ADCSRB=0;
  ADCSRB = 0b01000000;// ADMUX
  ADMUX = 0b00000000; // A0 A1 A2
  C0SR &=~(1<<C0BG);C0XR |=(1<<C0PS0);// ACXP
// ADC //////////////////////////// 
  ADCSRD |= (1<<REFS2); // 4.096 ИОН
  ADCSRA |= 1 << ADEN | 1 << ADSC | 1 << ADATE | 0b111;
  delay(200);
  PORTB |=(1<<PB0);DDRB &=~ (1<<PB0);
  DDRD |=(1<<PD6);PORTD &=~ (1<<PD6);delay(300);
  DDRB &=~ (1<<PB0);PORTB &=~(1<<PB0);
  times1=millis();
  while(analogRead(A0)>10);
  delay(100); 
  TCNT1=0;x=0;PORTD |= (1<<PD6);
  while(((C0SR >> 5) & 1)==1);null_c = (x * 65535 + TCNT1)/CALL_NF;
  u8g.firstPage(); do {u8g.setFont(u8g_font_profont17r);u8g.drawStr(20,11,"CALL_0");
  u8g.setPrintPos(20,28);u8g.print(null_c,1);u8g.drawStr(80,28,"pF");
  } while( u8g.nextPage() );
  delay(2000);
}

void loop() {
///// uF ////////////////////////////////////////////////  
  PORTD &=~(1<<PD6);DDRD &=~(1<<PD6);
  DDRB |= (1<<PB0);PORTB &=~ (1<<PB0);delay(10);
  while(analogRead(A0)>10);
  TCNT1=0;x=0;PORTB |= (1<<PB0);
  while(((C0SR >> 5) & 1)==1){c_f = x * 65535 + TCNT1;PORTB|=(1<<PB5);}
  PORTB&=~(1<<PB5);
/////////////////////////////////////////////////////////
  if((c_f/CALL_UF)/1000.0<0.3){mk=1;}else{mk=0;}  
///// nF //////////////////////////////////////////////// 
if(mk==1){  
  PORTB |=(1<<PB0);DDRB &=~ (1<<PB0);
  DDRD |=(1<<PD6);PORTD &=~ (1<<PD6);delay(300);
  DDRB &=~ (1<<PB0);PORTB &=~(1<<PB0);
  times1=millis();
  while(analogRead(A0)>10){if(millis()-times1>2000){mk=0;break;}};
  delay(100); 
  TCNT1=0;x=0;PORTD |= (1<<PD6);
  while(((C0SR >> 5) & 1)==1){PORTB|=(1<<PB5);if(x>50){mk=0;break;}}
  PORTB&=~(1<<PB5);c_f = x * 65535 + TCNT1;
}

/////////////////////////////////////////////////////////
  u8g.firstPage(); do {
  u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(0,25);
  if(mk==1){
    if((c_f/CALL_NF-null_c)<9999){
      u8g.print(abs(c_f/CALL_NF-null_c),0);u8g.drawStr(100,25,"pF");
      }else{
    u8g.print((c_f/CALL_NF-null_c)/1000.0,2);u8g.drawStr(100,25,"nF");}
  }
  if(mk==0){
    if((c_f/CALL_UF)/1000.0<9.99){
      u8g.print((c_f/CALL_UF)/1000.0,2);u8g.drawStr(100,25,"uF");
      }else{
    u8g.print((c_f/CALL_UF)/1000.0,1);u8g.drawStr(100,25,"uF");
      }
    }
    } while( u8g.nextPage() );
Serial.println((c_f/CALL_UF)/1000.0);
}

ISR(TIMER1_OVF_vect){x++;}

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

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

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

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