1

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

Основная статья - http://rcl-radio.ru/?p=131737

http://forum.rcl-radio.ru/uploads/images/2024/03/a9784dff07dac101c5e835899dd90f23.png

http://forum.rcl-radio.ru/uploads/images/2024/03/e9176e1dca33a41cd53f6236ec94fc73.png



#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++;}

2

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

Привет. Какое изображение появляется при включении ?

3

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

Емкость входа без конденсатора

4

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

Чип и дисплей.

5

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

На тестовом примере из библиотеки , картинка есть.

6

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

Я не понимаю вопроса?

7

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

Скетч с этой страницы.

8 (2024-04-29 18:10:20 отредактировано nikizh)

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

Здравствуйте
Скетч компилируется и загружается, но код не работает.
На дисплее мусор - точки по всему экрану.
Скетч со статьи и с этой страницы одинаково на дисплее.

Дисплей и Плата LGT8F328P-LQFP32 рабочие.
Проверены на других Ваших схемах и скетчах:
- Измеритель индуктивности на LGT8F328
- VU meter SH1106 OLED 1.3″ + LGT8F328 (Arduino)
- Анализатор спектра на SH1106 OLED 1.3″ (Arduino)
- Индикатор уровня сигнала на дисплее 0,91′ I2C 128×32 OLED
  (здесь библиотека другая Adafruit_SSD1306)

9

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

Вы этот дисплей подключаете - 0,91′ I2C 128×32 OLED SSD1306

10

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

Да, дисплей 0,91″ I2C 128×32 OLED
В Измерители индуктивности на LGT8F328
дисплей показывает 0,00 uH - всё нормально,
а после загрузки скетча для Измерителя емкости на LGT8F328
на дисплее точки

11

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

Сейчас нет в наличии LGT8F328, поэтому проверить не смогу.
Проверить смогу только после праздников.

12

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

Спасибо, что ответили !
Подождем.
И еще вопрос. Какая функция светодиода на D13?
В скетче назначение этого вывода не увидел или не понял.
В статье тоже.
Тем более что он дублирует светодиод на плате LGT8F328

13

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

светодиод D13 индикатор измерения, просто дублирует светодиод установленный на плате.

14

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

Спасибо!
Тема: Измерить емкости на LGT8F328
поправить на:
Измеритель емкости на LGT8F328

15

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

Вы собирали схему из резисторов? Нужно собрать.

16

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

Собрал схему из резисторов и
конденсатора 220n на A0 и 3,3V - опорное напряжение.
В момент подачи питания на дисплее кратковременно "мусор"
светодиод L на плате LGT8F328P светит
потом на дисплее CALL_0  Х,Х pF  - это измерение емкости входа
светодиод L гаснет
затем на дисплее  0      pF - готовность к измерению.
При подключении измеряемого конденсатора
светодиод L мигает
на дисплее показания измеряемого конденсатора.

17

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

Никогда не встречал, что для выполнения кода важен "обвес" МК.
Обычно проверяешь скетч загрузив в микроконтроллер.
И как в данном случае подключаешь индикатор.
И индикатор что-то должен показывать.
Но как говорится: век живи - век учись.

18

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

В setup есть цикл измерения емкости нуля. Пока измерение не пройдет, цикл не завершится. Без резисторов не создавалось условие завершения измерения.

19

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

Измеритель работает, но показывает емкость в два раза меньше:
  56 pF - 22 pF     100 nF - 45,38 nF   
100 uF - 47,9 uF   220 uF - 104,3 uF

20

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

Скорей всего контроллер работает на частоте 16 МГц. Надо изменить настройки платы под 32 МГц

21 (2024-04-29 23:05:24 отредактировано nikizh)

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

Насколько точное сопротивление резисторов в 1 кОм и 1 МОм
Может, для точного измерения, нужны из ряда E48, E96
И чистота питающего напряжения, уровень пульсаций.
Питание подавал от USB компьютера и от импульсного БП.
Линейного источника сейчас рядом нет.

22

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

Резисторы китайские 1% достаточно. Высокая точность измерения емкости особо не нужна , погрешность 3-5 % вполне приемлема.

23

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

Мои настройки платы такие как Вы показали в статье
LGT8F328P-LQFP32 MiniEVB в Arduino IDE
настройки показанные на скриншоте

Плата: LGT8F328
Clock Source: External (assumes 32MHz crystal)
Clock: 32 MHz
Variant: 328P-LQFP32 (e.g. MiniEVB nano-style or WAVGAT)

Только в последней by dbuezas версия 2.0.7 настройки немного по-другому.
Ставил в в менеджере плат версию 2.0.0 , но это ничего не меняет.

24

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

Есть еще параметры, это выбор внешнего кварца 12/16 МГц.

Если не получится то можно просто коэффициенты в два раза уменьшить

#define CALL_UF   6.10
#define CALL_NF   6.58
>>>
#define CALL_UF   3.05
#define CALL_NF   3.27

25

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

Изменил на >
#define CALL_UF   3.05
#define CALL_NF   3.27
показания измеряемого конденсатора стали ближе к номиналу
Спасибо !