Измерьте малые емкости с помощью 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);
}
@fuenfundachtzig, 👍0
1 ответ
Причина, по которой это не работает, заключается в том, что на PB5 установлен высокий уровень (поскольку он используется как вывод -RESET на плате). Однако код можно переписать, чтобы использовать только один вывод АЦП.
- Связь последовательного порта Digispark
- Библиотеки I2C для ATTiny85?
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
- Digispark Atinny85 не распознан (проблема с загрузчиком)
- Mac для последовательной связи с Digispark ATtiny85
- Digispark Micro (ATTINY85) не работает на Macbook Pro 2016 г.
- Digispark ATtiny 85 стирает флэш после отключения питания