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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Измерение емкости и константы времени 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 }

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

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

См.также

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