Измерьте малые емкости с помощью ATtiny85 (плата Digispark)

Я успешно запустил представленный код на Arduino Nano. Если ничего не подключено, то на выходе будет очень маленькая емкость (~1 пФ).

Затем я попытался перенести код на ATtiny85 (используя USB-плату разработки Digispark), но мне не удалось получить из кода ничего разумного. Первый analogRead всегда будет выдавать 1023, тогда как в Nano он выдает очень маленькое значение (опять же, из-за того, что ничего не связано с входными контактами).

На ATtiny85 это немного сложнее, потому что номера контактов для цифровых и аналоговых устройств разные, но я думал, что все правильно понял, так что же пошло не так при миграции?

const int OUT_PIN = 2; // цифровой вывод PB2 равен 2, положительный вывод C
const int IN_PIN  = 5; // цифровой вывод PB5 равен 5, отрицательный вывод C
const int OUT_ANA = 1; // аналоговое чтение PB2 равно 1
const int IN_ANA  = 0; // аналоговое чтение PB5 равно 0

const float IN_STRAY_CAP_TO_GND = 24.48;
const float IN_CAP_TO_GND  = IN_STRAY_CAP_TO_GND;
const float R_PULLUP = 34.8;  
const int MAX_ADC_VALUE = 1023;

#include "DigiKeyboard.h"

void setup() {
  pinMode(1, OUTPUT);
  pinMode(OUT_PIN, OUTPUT);
  pinMode(IN_PIN, OUTPUT);
  digitalWrite(OUT_PIN, LOW);
  digitalWrite(IN_PIN, LOW);  
  DigiKeyboard.update();
}

void loop() {

    pinMode(IN_PIN, INPUT);
    digitalWrite(OUT_PIN, HIGH);
    int val = analogRead(IN_ANA); // IN_PIN в версии Nano
    digitalWrite(OUT_PIN, LOW);

    DigiKeyboard.println(val);
    if (val < 1000) {
      pinMode(IN_PIN, OUTPUT);
      float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val);
      DigiKeyboard.print(capacitance);
      DigiKeyboard.println(" pF");
    } else {
      pinMode(IN_PIN, OUTPUT);
      delay(1);
      pinMode(OUT_PIN, INPUT_PULLUP);
      unsigned long u1 = micros();
      unsigned long t;
      int digVal;

      do {
        digVal = digitalRead(OUT_PIN);
        unsigned long u2 = micros();
        t = u2 > u1 ? u2 - u1 : u1 - u2;
      } while ((digVal < 1) && (t < 400000L));

      pinMode(OUT_PIN, INPUT);  
      val = analogRead(OUT_ANA); // OUT_PIN в версии Nano
      digitalWrite(IN_PIN, HIGH);
      int dischargeTime = (int)(t / 1000L) * 5;
      delay(dischargeTime);   
      pinMode(OUT_PIN, OUTPUT);  
      digitalWrite(OUT_PIN, LOW);
      digitalWrite(IN_PIN, LOW);

      float capacitance = -(float)t / R_PULLUP / log(1.0 - (float)val / (float)MAX_ADC_VALUE);

      if (capacitance > 1000.0) {
        DigiKeyboard.print(capacitance / 1000.0);
        DigiKeyboard.println(" uF");
      } else {
        DigiKeyboard.print(capacitance);
        DigiKeyboard.println(" nF");
      }
      DigiKeyboard.println(val); // обычно ~ 520 (потому что мы ждем, пока digVal == 1?)
      DigiKeyboard.println(t); // зависит от C: ~26000 для 1 мкФ, ~2600 для 100 нФ, ~250000 для 10 мкФ
  }

  digitalWrite(1, 1);
  delay(10);
  while (micros() % 1000 != 0);
  digitalWrite(1, 0);

}

, 👍0


1 ответ


1

Причина, по которой это не работает, заключается в том, что на PB5 установлен высокий уровень (поскольку он используется как вывод -RESET на плате). Однако код можно переписать, чтобы использовать только один вывод АЦП.

,