반응형

 

 

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

 

 




문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts