Arduino:Основы/Измерение емкости и константы времени RC

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 3377 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Измерение емкости и константы времени RC[1]

RC schematic.jpg

Краткое описание: резистор будет заряжать конденсатор в течение TC секунд.

  • TC – R x C; это константа времени (исчисляется в секундах)
  • R – сопротивление в омах
  • C – емкость в фарадах; 1 микрофарад (мкФ) = 0,0000001 фарад

Напряжение за одну TC равно 63,2% от напряжения заряда.

  • Пример 1: 1 мегаом х 1 микрофарад = 1 секунда
  • Пример 2: 10 килоом х 100 микрофарад = 1 секунда
RCTimeConstant.jpg

Этот скетч работает, потому что контакты Arduino могут быть в одном из 2 состояний, которые электрически очень сильно отличаются друг от друга.

Состояние «input» (режим ввода данных)

Задается при помощи pinMode(pin, INPUT).

  • Высокий импеданс (сопротивление); благодаря этому требования к питанию от цепи, с которой считываются данные, значительно снижаются
  • Хорошо подходит для считывания данных с датчиков, но не для управления светодиодами

Состояние «output» (режим вывода данных)

Задается при помощи pinMode(pin; OUTPUT).

  • Низкий импеданс; можно отдавать ток в 40 мА (положительное напряжение) или тянуть его
  • Хорошо подходит для управления светодиодами или другими цепями; бесполезно для считывания данных с датчиков

Кроме того, контактам можно задать состояние HIGH (+ 5 вольт), для зарядки конденсатора, или LOW («земля»), для разрядки конденсатора.

Capacitance Meter Scheme.jpg

Схема построения скетча для измерителя емкости:

  • Выставляем разрядный контакт в режим INPUT (чтобы он не мог разрядить конденсатор)
  • Записываем начальное время при помощи millis()
  • Выставляем зарядный контакт в режим OUTPUT и задаем ему значение HIGH
  • Начинаем циклически проверять напряжение, пока оно не достигнет отметки 63,2%
  • Когда конденсатор будет заряжен, вычитаем текущее время из стартового времени, чтобы узнать, сколько времени заняла зарядка конденсатора
  • Находим емкость; для этого делим время (в секундах) на сопротивление (в омах)
  • Печатаем значение при помощи Serial.print()
  • Разряжаем конденсатор; для этого, во-первых, выставляем зарядный контакт в режим INPUT, во-вторых, выставляем разрядный контакт в режим OUTPUT и задаем ему значение LOW, и в-третьих, считываем напряжение, чтобы убедиться, что конденсатор заряжен полностью
  • Запускаем цикл снова

Сам скетч представлен ниже:

  1. /*  Измеритель емкости
  2.  *  Пол Бэджер (Paul Badger), 2008 год
  3.  *  Демонстрирует использование константы времени TC
  4.  *  для измерения заряда конденсатора
  5.  *
  6.  *  Теория
  7.  *
  8.  *  Конденсатор заряжается через резистор в течение
  9.  *  одной константы времени, именуемой здесь TC
  10.  *
  11.  *  TC = R x C; константа времени (в секундах)
  12.  *  R = сопротивление (в омах)
  13.  *  C = емкость (в фарадах); 1 микрофарад (мкФ) = 0,0000001 фарад
  14.  *
  15.  *  Напряжение конденсатора за одну константу времени
  16.  *  определяется как 63,2% от зарядного напряжения.
  17.  *
  18.  *  Построение цепи:
  19.  *  
  20.  *  Тестовый конденсатор между узловой точкой и «землей»;
  21.  *  положительная сторона электролитического конденсатора
  22.  *  должна быть подключена к узловой точке.
  23.  *  Тестовый резистор между chargePin и узловой точкой.
  24.  *  Резистор на 220 ом между dischargePin и узловой точкой.
  25.  *  Провод между общей точкой и analogPin
  26.  *  (это входной контакт для аналогово-цифровых данных).
  27.  */
  28.  
  29. #define analogPin      0         // аналоговый контакт для измерения
  30.                                  // напряжения в конденсаторе
  31. #define chargePin      13        // контакт для зарядки конденсатора
  32.                                  // (нужно подключить к одному концу
  33.                                  // зарядного резистора)
  34. #define dischargePin   11        // контакт для разрядки конденсатора
  35. #define resistorValue  10000.0F  // поставьте здесь емкость
  36.                                  // своего конденсатора;      
  37.                                  // буква «F» говорит компилятору,
  38.                                  // что это число с плавающей точкой
  39.  
  40. unsigned long startTime;
  41. unsigned long elapsedTime;
  42. float microFarads;              // переменная типа «число
  43.                                 // с плавающей точкой», чтобы
  44.                                 // сохранить точность при вычислениях
  45. float nanoFarads;
  46.  
  47. void setup(){
  48.   pinMode(chargePin, OUTPUT);   // делаем chargePin
  49.                                 // выходным контактом
  50.   digitalWrite(chargePin, LOW);  
  51.  
  52.   Serial.begin(9600);           // инициализируем последовательную
  53.                                 // коммуникацию (для отладки)
  54. }
  55.  
  56. void loop(){
  57.   digitalWrite(chargePin, HIGH);  // задаем контакту chargePin
  58.                                   // значение HIGH, и конденсатор
  59.                                   // начинает заряжаться
  60.   startTime = millis();
  61.  
  62.   while(analogRead(analogPin) < 648){   // 647 это 63.2% от 1023,
  63.                                         // и это заряд, полученный
  64.                                         // в течение одной TC
  65.   }
  66.  
  67.   elapsedTime= millis() - startTime;
  68.  // конвертируем миллисекунды в секунды ( 10^-3 ),
  69.  // а фарады – в микрофарады ( 10^6 )  
  70.  // (10^3 – это 1000):
  71.   microFarads = ((float)elapsedTime / resistorValue) * 1000;  
  72.   Serial.print(elapsedTime);       // печатаем значение
  73.                                    // в мониторе порта
  74.   Serial.print(" mS    ");         // печатаем единицы измерения
  75.                                    // и ставим символ
  76.                                    // возврата каретки
  77.  
  78.   if (microFarads > 1){
  79.     Serial.print((long)microFarads);    // печатаем значение
  80.                                         // в мониторе порта
  81.  
  82.     Serial.println(" microFarads");     // печатаем единицы измерения
  83.                                         // и ставим символ
  84.                                         // возврата каретки
  85.  
  86.   }
  87.   else
  88.   {
  89.     // если значение меньше одного микрофарада,
  90.     // конвертируем в нанофарады (0,0000000001 фарада);
  91.     // это потребует обходного маневра, потому что Serial.print()
  92.     // не печатает символы с плавающей точкой:
  93.  
  94.     nanoFarads = microFarads * 1000.0;  // умножаем на 1000,
  95.                                         // чтобы преобразовать
  96.                                         // в нанофарады
  97.     Serial.print((long)nanoFarads);     // печатаем значение
  98.                                         // в мониторе порта
  99.     Serial.println(" nanoFarads");      // печатаем единицы измерения
  100.                                         // и символ возврата каретки
  101.   }
  102.  
  103.   /* разрядка конденсатора  */
  104.   digitalWrite(chargePin, LOW);         // задаем зарядному контакту
  105.                                         // значение LOW
  106.   pinMode(dischargePin, OUTPUT);        // задаем разрядному контакту
  107.                                         // режим OUTPUT
  108.   digitalWrite(dischargePin, LOW);      // задаем разрядному контакту
  109.                                         // значение LOW
  110.   while(analogRead(analogPin) > 0){     // ждем, пока конденсатор
  111.                                         // не разрядится полностью
  112.   }
  113.  
  114.   pinMode(dischargePin, INPUT);         // снова задаем разрядному
  115.                                         // контакту режим INTPUT
  116. }

Что еще можно попробовать

  • Если зарядка выполняется слишком быстро, поставьте резисторы побольше, а если слишком долго – поменьше
  • Измерьте значения конденсаторов, подключив их и параллельно, и последовательно. Сверьте полученный результат с теоретическими расчетами
  • Для большей точности рассчитайте среднее число на основе нескольких считанных данных
  • Чтобы добавить функцию автовыбора диапазона измеряемых данных, подключите к разным контактам разные зарядные резисторы
  • Модифицируйте скетч, чтобы зарядный резистор также разряжал конденсатор. Обратите внимание, что новое значение, сообщающее процент заряда, не будет в два раза превышать прошлое значение. Почему – объясняется в графике выше (на том, где изображена кривая).

См.также

Внешние ссылки

  1. www.arduino.cc - Capacitance Meter and RC Time Constants