PWM은 전압레벨을 제어 하여 아날로그 출력과 유사한 결과를 만들어 낼 수 있도록 해줍니다.
디지털 출력 라인을 매우 빠르게 껐다 켰다 함으로써 전압을 결정 할 수 있습니다.
예를 들어 아두이노의 디지털 라인은 0또는 5V의 전압을 출력할 수 있습니다. 만약 PWM을 Duty Cycle 50%로 설정한다면 평균 출력 전압은 2.5V가 되고 25% duty cycle이라면 출력은 1V가 됩니다.
PWM은 아두이노 디지털 핀에서 전압을 제어 할 수 있도록 해주지만 모터를 제어하기 하기에는 전류의 제약이 있습니다. 마이크로 컨트롤러가 제공할 수 있는 전압보다 모터가 더 큰 전압을 요구하기 때문에 마이크로컨트롤러의 출력핀으로는 모터를 동작시키는데 무리가 있습니다. 그리고 또한 DC모터의 회전 방향을 조정하기 위해서는 공급해주는 전압의 방향을 바꾸어 줄 필요가 있는데 이것을 구현할 수 가 없습니다.
DC 모터는 +와 - , 두 개의 단자를 가지고 있는데 극성을 바꾸어두면 회전 방향이 반대로 됩니다. 모터에서 필요로 하는 전원은 보통 보드에서 사용되는 5V 전원을 초과하기 때문에 H-Bridge 회로를 많이 사용되어 집니다. High Side left 스위치와 Low Side right 스위치를 닫아주면 모터는 정방향으로 회전하고 반대 쌍을 닫아주면 모터는 역방향으로 회전하는 원리를 이용하는 회로입니다.
여기에서는 L293D 를 사용는데 2개의 DC 모터를 제어 가능하며 4.5~36V 까지 전원공급이 가능합니다. 아래 회로처럼 모터용 전원을 따로 공급해주어야 합니다.
analogWrite 함수에 0을 주면 모터는 멈추고 255를 주면 최대 속도로 움직이게 됩니다. 1~254 사이 값으로 모터의 속도를 조절할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #define motor1pole1 2 #define motor1pole2 3 #define enablePin 9 int motorSpeed = 50; char buf[256]; void setup() { Serial.begin(9600); //시리얼 통신 초기화 pinMode(enablePin, OUTPUT); //지정한 핀을 출력 모드로 사용 pinMode( motor1pole1 , OUTPUT);//지정한 핀을 출력 모드로 사용 pinMode( motor1pole2, OUTPUT);//지정한 핀을 출력 모드로 사용 } void loop() { sprintf( buf, "모터 스피드 %d\n", motorSpeed ); Serial.print(buf); analogWrite(enablePin, motorSpeed); //이하는 두개의 핀 motor1pole1와 motor1pole2에 HIGH값과 LOW값을 조정하여 //모터의 방향 컨트롤하거나 모터를 정지시킬 수 있습니다. Serial.println("모터 정방향 회전 "); digitalWrite(motor1pole1, HIGH); digitalWrite(motor1pole2, LOW); delay(4000); Serial.println("모터 정지 "); digitalWrite(motor1pole1, LOW); digitalWrite(motor1pole2, LOW); delay(4000); Serial.println("모터 역방향 회전"); digitalWrite(motor1pole1, LOW); digitalWrite(motor1pole2, HIGH); delay(4000); Serial.println("모터 정지 "); digitalWrite(motor1pole1, HIGH); digitalWrite(motor1pole2, HIGH); delay(4000); //태스트틀 위해 모터 스피드를 변경합니다. motorSpeed += 50; if ( motorSpeed > 255 ) motorSpeed = 50; } | cs |
'Arduino Uno' 카테고리의 다른 글
아두이노에서 리모컨 신호 수신 (0) | 2015.02.19 |
---|---|
아두이노 세븐세그먼트 예제 (0) | 2015.02.19 |
아두이노 시뮬레이터 (0) | 2015.02.16 |
아두이노 튜토리얼 7 - Blink Without Delay (0) | 2015.02.11 |
아듀이노 튜토리얼 6 - Analog Read Voltage (0) | 2015.02.11 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!