Arduino용 정확한 전압 측정기. 아두이노 기반 블루투스 전압계

다기능 Arduino 어셈블리는 흥미로운 아이디어를 실현할 수 있도록 해주는 전자 프로그래밍 가능 장치 팬의 큰 관심을 끌고 있습니다.

기성 Arduino 회로의 가장 큰 장점은 고유한 블록 모듈식 원리입니다. 각 보드에 추가 인터페이스를 추가하여 다양한 프로젝트를 만들 수 있는 가능성을 끝없이 확장할 수 있습니다.

Arduino 모듈자체 부트로더가 있는 범용 마이크로 컨트롤러를 기반으로 구축되어 추가 장치를 사용하지 않고도 필요한 프로그램 코드로 쉽게 플래시할 수 있습니다. 프로그래밍은 표준 C++ 언어로 수행됩니다.

Arduino를 사용하는 가장 간단한 예 중 하나는 이 어셈블리를 기반으로 측정 범위가 0~30V인 고정밀 DC 전압계를 구현하는 것입니다.

Arduino 아날로그 입력은 5V 이하의 정전압을 위해 설계되었으므로 전압 분배기를 사용하여 이 값을 초과하는 전압에서 사용할 수 있습니다.


전압 분배기를 통한 Areduino의 연결 다이어그램

전압 분배기는 직렬로 연결된 두 개의 저항으로 구성됩니다. 다음 공식을 사용하여 계산됩니다.

자동차 라디오의 외부 USB 커넥터

Arduino를 실험해보고 싶은 사람들을 위해 유용한 다이어그램이 제공됩니다. 이것은 0~30V 범위의 DC 전압을 안정적으로 측정할 수 있는 간단한 디지털 전압계입니다. Arduino 보드는 평소와 같이 9V 배터리로 전원을 공급받을 수 있습니다.

아시다시피 Arduino의 아날로그 입력을 사용하여 0~5V 범위의 DC 전압을 측정할 수 있으며 이 범위를 늘릴 수 있습니다.
두 개의 저항을 전압 분배기로 사용합니다. 분배기는 측정된 전압을 Arduino 아날로그 입력 수준으로 줄입니다. 그런 다음 프로그램은 실제 전압 값을 계산합니다.

Arduino 보드의 아날로그 센서는 아날로그 입력에서 전압의 존재를 감지하고 이를 마이크로컨트롤러의 추가 처리를 위해 디지털 형식으로 변환합니다. 그림에서 전압은 저항 R1(100kOhm)과 R2(10kOhm)로 구성된 간단한 전압 분배기를 통해 아날로그 입력(A0)에 공급됩니다.

이러한 분배기 값을 사용하면 Arduino 보드에 0에서 0까지의 전압을 공급할 수 있습니다.
55V. 입력 A0에서 측정된 전압을 11로 나눈 값, 즉 55V / 11=5V가 있습니다. 즉, Arduino 입력에서 55V를 측정할 때 최대 허용값은 5V입니다. 실제로는 이 전압계에 "0 - ​​30V"범위를 기록하여 유지하는 것이 좋습니다
안전마진!

노트

디스플레이 판독값이 산업용(실험실) 전압계의 판독값과 일치하지 않는 경우 정확한 기기로 저항 R1 및 R2 값을 측정하고 R1=100000.0 및 R2=10000.0 대신 이 값을 삽입해야 합니다. 프로그램 코드에서. 그런 다음 실험실 전압계를 사용하여 Arduino 보드의 5V와 "접지" 핀 사이의 실제 전압을 측정해야 합니다. 결과는 5V 미만의 값이 됩니다. 예를 들어 4.95V가 됩니다. 이 실제 값은 코드 줄에 삽입되어야 합니다.
vout = (값 * 5.0) / 5.0 대신 1024.0.
또한 허용 오차가 1%인 정밀 저항기를 사용해 보십시오.

저항 R1 및 R2는 증가된 입력 전압에 대해 어느 정도 보호 기능을 제공합니다. 그러나 55V를 초과하는 전압은 Arduino 보드를 손상시킬 수 있습니다. 또한 이 설계는 다른 유형의 보호(전압 서지, 극성 반전 또는 과전압 방지)를 제공하지 않습니다.

디지털 전압계 프로그램

/*
DC 전압계
전압 분배기 개념을 기반으로 한 Arduino DVM
T.K.하린드란
*/
#포함하다
LiquidCrystal LCD(7, 8, 9, 10, 11, 12);
int 아날로그 입력 = 0;
플로트 vout = 0.0;
플로트 빈 = 0.0;
부동 R1 = 100000.0; // R1의 저항(100K) -텍스트 참조!
부동 R2 = 10000.0; // R2의 저항(10K) - 텍스트 참조!
정수 값 = 0;
무효 설정())(
pinMode(analogInput, INPUT);
lcd.begin(16, 2);
lcd.print("DC 전압계");
}
무효 루프()
// 아날로그 입력에서 값을 읽습니다.
값 = 아날로그읽기(analogInput);
vout = (값 * 5.0) / 1024.0; //텍스트 보기
vin = vout / (R2/(R1+R2));
만약 (빈<0.09) {
vin=0.0;//원치 않는 읽기를 없애는 명령문!
}
lcd.setCursor(0, 1);
lcd.print("입력 V= ");
lcd.print(vin);
지연(500);
}

Arduino 전압계의 개략도

구성 요소 목록

아두이노 우노 보드
100kΩ 저항기
10kΩ 저항기
100옴 저항
10kΩ 트리머 저항기
LCD 디스플레이 16?2(Hitachi HD44780)

전압이나 회로의 특정 지점을 확인하고 싶은데 전압계나 멀티미터가 없는 경우가 있습니까? 구매하러 달려가시나요? 길고 비용이 많이 듭니다. 그 전에 전압계를 직접 만들어 보는 것은 어떨까요? 사실 간단한 재료만 있으면 직접 만들 수도 있어요.

  • 수업에서는 Arduino와 호환되는 보드인 SunFounder Uno / Mars(http://bit.ly/2tkaMba)를 사용했습니다.
  • USB 데이터 케이블
  • 전위차계 2개(50k)
  • LCD1602 - http://bit.ly/2ubNEfi
  • 개발 보드 - http://bit.ly/2slvfrB
  • 다중 점퍼

연결하기 전에 먼저 작동 방식을 이해해 보겠습니다.

전압계 데이터 처리의 주요 부분에는 SunFounder Uno 보드를 사용하고, LCD1602는 화면으로, 전위차계는 LCD 대비를 조정하고, 또 다른 보드는 전압을 분배하는 데 사용됩니다.

Uno 보드에 연결된 전위차계를 회전하면 전위차계 저항이 변경되어 그에 따른 전압이 변경됩니다. 전압 신호는 A0 핀을 통해 Uno 보드로 전송되고, Uno는 수신된 아날로그 신호를 디지털 형식으로 변환하여 LCD에 기록합니다. 이렇게 하면 전류 커패시턴스 저항의 전압 값을 볼 수 있습니다.

LCD1602에는 4비트와 8비트의 두 가지 작동 모드가 있습니다. MCU IO가 충분하지 않은 경우 D4~D7 핀만 사용하는 4비트 모드를 선택할 수 있습니다.

표를 따라 연결하세요.

4단계: 전위차계를 LCD1602에 연결합니다.

전위차계의 중간 핀을 LCD1602의 Vo 핀에 연결하고 다른 핀을 GND에 연결합니다.

전위차계의 중간 핀을 SunFounder Uno의 핀 A0에 연결하고 다른 핀 중 하나를 5V에 연결하고 다른 핀을 GND에 연결합니다.

6단계: 코드 업로드

이 코드는:

#포함하다 /*********************************************** ******* *****/ const int AnalogIn = A0;//A0에 전위차계 부착 LiquidCrystal lcd(4, 6, 10, 11, 12, 13);//lcd(RS,E,D4 ,D5,D6.D7) float val = 0;// 변수를 value=0으로 정의 /**************************** ******* *****************/ void setup() ( Serial.begin(9600);//직렬 lcd.begin(16, 2) 초기화 ;//LCD의 문자 위치를 Line 2, Column 16으로 설정 lcd.print("전압 값:");//print "전압 값:" ) /************* ******* **********************************/ void loop() ( val = AnalogRead (A0);//전위차계 값을 val로 읽습니다. val = val/1024*5.0;// 데이터를 수학적인 방법으로 해당 전압 값으로 변환합니다. Serial.print(val);//val 수를 인쇄합니다. 직렬 모니터에서 Serial.print ("V"); // 단위를 V로 인쇄합니다. 직렬 모니터의 전압을 줄인 것입니다. lcd.setCursor(6,1);//라인 1, 열 6에 커서를 놓습니다. 여기에 문자가 표시됩니다. lcd.print(val);//LCD에 val 수를 인쇄합니다. lcd.print("V");//그런 다음 단위를 V로 인쇄합니다. 이는 LCD의 전압을 의미합니다. 200); //200ms 동안 대기)

전위차계를 회전시켜 LCD1602의 전압을 실시간으로 확인하세요.

여기에 까다로운 것이 있습니다. 코드를 실행한 후 LCD에 문자가 표시되었습니다. 그런 다음 화면에 문자가 선명하게 표시될 때까지 전위차계를 시계 방향 또는 시계 반대 방향으로 돌려 화면 대비(검은색에서 흰색으로 점진적으로 변경)를 조정했습니다.

전압을 측정하려면 두 개의 배터리(1.5V 및 3.7V)를 사용하십시오. 두 번째 전위차계를 A0 및 GND 핀에 연결하면 회로에서 전위차계가 제거됩니다. 와이어 A0의 끝을 배터리 양극에 고정하고 GND 회로를 음극에 고정합니다. 다시 연결하지 마십시오. 그렇지 않으면 배터리가 단락될 수 있습니다. 0V 값은 역방향 연결입니다.

따라서 배터리 전압이 LCD 디스플레이에 표시됩니다. 배터리가 완전히 충전되지 않았기 때문에 값과 공칭 값 사이에 약간의 오류가 있을 수 있습니다. 그렇기 때문에 배터리를 사용할 수 있는지 여부를 파악하려면 전압을 측정해야 합니다.

추신:디스플레이 디스플레이에 문제가 있는 경우 LCD 디스플레이에 대한 FAQ(http://wiki.sunfounder.cc/index.php?title=LCD1602/I2C_LCD1602_FAQ)를 참조하세요.

초기 데이터 및 개정

따라서 이 시점에서 우리는 0..20V로 제한되는 정전압 전압계를 갖게 됩니다(참조: 이전 부분). 이제 여기에 0..5a 전류계를 추가합니다. 이를 위해 회로를 약간 수정합니다. 즉, 입력과 출력이 모두 있는 통과 회로가 됩니다.

LCD 디스플레이 관련 부분을 제거했는데 변경되지 않습니다. 원칙적으로 새로운 주요 요소는 0.1Ω Rx 션트입니다. R1-C1-VD1 체인은 아날로그 입력을 보호하는 역할을 합니다. 입력 A0에 동일한 것을 설치하는 것이 합리적입니다. 상당히 큰 전류를 가정하기 때문에 설치 요구 사항이 있습니다. 전력선은 상당히 두꺼운 와이어로 만들고 션트 단자에 직접 연결해야 합니다(즉, 납땜). 그렇지 않으면 판독값이 현실과 거리가 멀게 됩니다. 전류에 대한 참고 사항도 있습니다. 원칙적으로 기준 전압이 1.1V이면 션트에 등록할 수 있습니다. 0.01a보다 약간 더 낮은 정확도로 최대 11암페어의 0.1옴 전류이지만 이러한 전압이 Rx에서 떨어지면 방출되는 전력이 10W를 초과하므로 전혀 재미가 없습니다. 문제를 해결하려면 고품질 연산 증폭기와 10mΩ(0.01Ω) 션트를 사용하여 이득이 11인 증폭기를 사용할 수 있습니다. 하지만 지금은 삶을 복잡하게 만들지 않고 단순히 전류를 5A로 제한하겠습니다(이 경우 Rx 전력은 3-5W 정도에서 선택할 수 있습니다).

이 단계에서 저는 놀라움을 느꼈습니다. 컨트롤러의 ADC에 약 -3mV의 상당히 큰 제로 오프셋이 있다는 것이 밝혀졌습니다. 즉, ADC는 3mV 미만의 신호를 볼 수 없으며 약간 더 높은 레벨의 신호는 -3mV의 특성 부정확도로 표시되어 범위 시작 부분에서 선형성을 손상시킵니다. 빠른 검색에서는 이러한 문제에 대한 명확한 참조가 제공되지 않았으므로(제로 오프셋은 정상이지만 상당히 작아야 함) 이것이 특정 Atmega 328 인스턴스의 문제일 가능성이 높습니다. 제가 선택한 솔루션은 다음과 같습니다. 이중 - 전압 - 범위 시작 부분의 소프트웨어 단계(디스플레이는 0.06V에서 시작), 전류의 경우 - 5V 버스에 대한 풀업 저항입니다. 저항은 점선으로 표시됩니다.

원천

이 볼트-암페어 미터의 전체 버전(I2C 버전)은 기사 끝에 있는 링크에서 다운로드할 수 있습니다.다음으로 소스코드의 변경사항을 보여드리겠습니다. 전압계와 동일한 평균을 사용하여 아날로그 입력 A1의 판독값을 추가했습니다. 본질적으로 이것은 분배기가 없는 동일한 전압계이며 옴의 공식인 I = U/Rx를 사용하여 암페어를 얻습니다(예를 들어 Rx = 0.01V의 전압 강하가 있으면 전류는 0.1A입니다). 또한 미래를 위해 현재 이득 상수 AmpMult를 소개했습니다. 션트 저항의 부정확성을 고려하려면 션트 저항과 AmpRx 상수를 일치시켜야 할 것입니다. 글쎄, 이것은 이미 볼트 암페어 미터이고 1602 디스플레이에 아직 공간이 남아 있기 때문에 현재 전력 소비를 와트 단위로 표시하여 간단한 추가 기능을 얻습니다.

.... // 아날로그 입력 #define PIN_VOLT A0 #define PIN_AMP A1 // 내부 기준 전압(선택) const float VRef = 1.10; // 저항 분배기 계수(Rh + Rl) / Rl을 입력합니다. IN 0.2) InVolt += 3; // 볼트로 변환합니다. (In: 0..1023 -> (0..VRef) Mult로 스케일링) float Volt = InVolt * VoltMult * VRef / 1023; float Amp = InAmp * VRef / AmpMult / AmpRx / 1023 ; // 션트의 드롭을 고려하려면 2줄의 주석 처리를 제거합니다. //float RxVolt = InAmp * VRef / 1023 / AmpMult; // 볼트 -= RxVolt; float 와트 = 볼트 * 전류; // 출력 데이터 lcd.setCursor (8, 0); lcd.print(와트); lcd.print("W"); lcd.setCursor(0, 1); lcd.print(볼트); lcd.print("V"); lcd.setCursor(8, 1); lcd.print(앰프); lcd.print("A"); )

연결



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: