엔코더 홀센서 차이 - enkodeo holsenseo chai

홀 센서/ 마그네틱 엔코더 (마그네틱 엔코더 예제코드 포함)

안녕하세요 변위 센서 중에서 오늘은 홀센서를 소개하려고 합니다. 홀 센서는 홀효과(Hall effect)를 이용해서 비접촉식 위치감지에 많이 사용됩니다. 자동차에서도 비접촉식 회전속도 센서, 점화시기제어, 안전벨트 버클, 페달 상태 확인을 위한 센서로 널리 사용되고 있으니 그 신뢰성과 내구성에 대해서는 두말이 필요 없을 것 같네요. 

BLDC 모터를 사용할 경우 모터드라이버에서 회전자의 회전에 따라 3상의 출력은 제어해야하기 때문에 홀센서 신호를 입력하도록 되어있습니다. 모터에 기어비를 크게 사용하는 경우 홀센서 신호만으로 위치제어가 가능하지만 정밀한 위치제어 등을 위해서는 엔코더를 추가로 장착해 사용하는 경우가 많습니다.

이러한 홀센서를 이용한 또는 홀센서 원리를 이용한 비접촉식 변위측정 센서로, 회전각을 측정하는 로타리 마그네틱 엔코더와 선형변위를 측정하는 리니어 마그네틱 엔코더가 역시 이미 많이 상품화되어 있습니다. 비접촉식의 장점은 움직이는 물체에 접촉된 브러쉬나 전선 등으로인한 마찰없이 변위를 측정할 수 있다는 점입니다. 

오늘은 이 장점을 보여줄 수 있는 로타리 마그네틱 엔코더의 사용예를 한가지 소개하려고 합니다.
(본 제품은 현재 스토어팜에서 판매되고 있습니다!) 모터 등을 이용해 이미 회전하고 있는 물체가 있을 때 회전수와 각도를 어떻게 하면 알 수 있을까요? 선풍기를 한 번 예로 들어보면, 선풍기 앞덮개 열고 날개를 뜯어내고 엔코더 등을 추가한다면 앞덮개를 씌우지 못할 수도 있고, 생각만 해도 작업이 복잡합니다ㅠㅠ. 그리고 무엇보다도 원래 잘 작동하고 있는 장치에 뭔가 추가적인 장치를 끼워넣어야 하는 상황이라면... 잘못하다 고장이라도 나면....  

자 이제 이런 고민과 걱정을 해결해 줄 수 있는 마그네틱 엔코더를 소개하려고 합니다. 일단 선풍기 앞 덮개를 빼면 회전하는 날개를 고정하는 고정부가 있죠? 고정부의 회전중심에 자석을 딱! (직경6mm에 높이 2.5mm인데 글루건이나 순간접착제로 붙여도 되겠죠?ㅎ) 그리고 엔코더는 앞덮개 자석 앞편에 0.5~2.5 mm 간격을 두고 딱! 붙이면 측정이 되겠네요ㅎ 물론 자석과의 거리 조절을 위해 받침을 대거나 해야겠지만, 보통 고정판과 앞 덮개 사이에 간격이 크지 않기 때문에 부착은 상자등을 자른 골판지와 글루건이면 충분해보입니다. 그리고 엔코더의 5V 전원은 아두이노의 5V에 OUT은 아날로그 출력이기 때문에 아두이노의 아날로그 핀(A0~A5 등)에 꽂고 GND는 아두이노 GND에 연결하면, 선풍기가 회전할 때 자석이 회전하게 되고 회전하는 자석의 각도를 아두이노를 이용해 측정할 수 있습니다!


그런데 회전수를 알고 싶은데 엔코더가 멀티턴이 아니라 0에서 5V가 계속 반복해서 나타나게 될텐데요;; 아마 삼각파처럼 출력되겠죠? 그래도 회전수만을 단순히 아는 거라면 5V(1023)에서 0V(0)으로 변하는 순간만 잘 체크하면 될 것 같네요. (AnalogReadSerial 예제를 일부만 수정했어요!)


루프(loop)가 계속 실행하게 될 때 현재 읽은 센서 값(sensorValue)이 계속 갱신되기 때문에, 현재 루프에서 이전 루푸에서 읽은 센서 값을 사용하고자 할 때는 보통 이전값을 저장해서 사용합니다.  sensorValue_old가 바로 이전값 저장 변수인데요, 제가 이 old라는 접미를 붙여서 이전값으로 많이 사용하니 기억해두시면 좋을 것 같아요^^. 루프의 마지막 줄에 sensorValue_old = sensroValue; 로 넣어서 이전값을 업데이트 해야합니다! 그래야 다음 루프에서 읽은 현재 센서값과 저장해둔 이전값을 비교할 수 있습니다. 

int sensorValue = 0; // 엔코더에서 OUT에 연결된 핀(AO)의 값을 저장할 변수 int sensorValue_old = 0; //이전 엔코더 값을 저장할 변수 int cnt = 0; // 회전수를 저장할 변수 // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: sensorValue = analogRead(A0); //이전 센서값과 지금 센서값을 비교해서 900보다 크면 cnt를 1씩 증가하도록 했습니다. //사실 == 1023으로 바꾸어도 괜찮지만, 회전속도대비 샘플링이 아주 빠르지 않을 경우를 고려했습니다. //절대값 abs를 쓴건 회전하는 방향이 바뀌더라도 카운트되도록 한것입니다. if (abs(sensorValue-sensorValue_old) > 900) cnt = cnt + 1; sensorValue_old = sensorValue; //이전 센서 값을 지금 읽은 값으로 업데이트 Serial.println(cnt); delay(1); }

다음에는 회전수뿐만 아니라, 실제 누적된 회전각도를 알고 싶을 경우 어떻게 하면 될 지 한번 생각해보겠습니다. 위에서는 왼쪽으로나 오른쪽으로 회전하는 모든 경우에 대해서 회전수를 무조건 1씩 증가하게 했습니다만, 실제 엔코더로 쓰려면 시계방향으로 도는지 반시계방향으로 도는지 모두 체크를 해야할 것입니다. 그래야 멀티턴 엔코더로 사용할 수 있겠죠? 이렇게 회전한 회전수(cnt)에 360도를 곱하고 현재 읽은 각도를 더하면 누적된 회전각도(degree)를 알 수 있습니다. 환산된 회전각도는 소수점으로 표현되기 때문에 double로 선언합니다. (전압5(1023, 비트수)가 360도로 환산되기 때문에, 비트수를 1023으로 나누고 360을 곱하면 현재각도가 계산됩니다.)  단, 현재 900을 문턱치로 회전수를 체크하고 있지만 회전속도가 너무 빠른 경우 이를 놓칠 수도 있습니다. 샘플링속도는 루프에 있는 코드의 길이와 난이도에 영향을 많이 받고 delay함수에 영향을 크게 받기 때문에 확인해보셔서 꼭! 검증절차를 거져야 합니다. 

int sensorValue = 0; int sensorValue_old = 0; int cnt = 0; double ang = 0.0; // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: sensorValue = analogRead(A0); if (sensorValue-sensorValue_old > 900) cnt = cnt - 1; else if (sensorValue-sensorValue_old < -900) cnt = cnt + 1; ang = (double)cnt*360.0 + (double)sensorValue*360.0/1023.0; sensorValue_old = sensorValue; //이전 센서 값을 지금 읽은 값으로 업데이트 // print out the ang: Serial.println(ang); delay(1); }

모터란 무엇인가?

크게 DC와 BLDC가 있다. 가장 큰 차이점은 브러쉬의 유무이다. 브러쉬는 정류자에 전류를 공급하는 장치로, 모터가 회전함에 있어 마찰이 생겨 모터 효율을 낮추는 단점이 있다.
따라서 브러쉬를 없앤 것이 BLDC이며 3상의 코일로 전자기력을 형성하여 회전하는 것이 BLDC의 특징이다. 또한, 각 코일은 홀센서로 자석의 위치를 알게 되고 이에 따라 코일의 전류가 공급되어 회전하는 것이 특징이다.

엔코더란 무엇인가?

크게 인크리멘탈과 앱솔루트 방식으로 측정이 된다.

인크리멘탈은 엔코더 슬릿이 회전함에 따라 광입자 측정을 a,b상 펄스로 만들어 내어 위치와 속도를 측정합니다. 일정한 방향으로 도는 DC모터에 자주 사용한다.

장점:회전량 제한이 없다. 단점: 절대위치 측정x, 전원이 꺼지면 초기위치 다시 검출

앱솔루트 경우, 각 지점의 절대값을 설정하여 측정 되는 해당 위치에서의 값을 전달하는 방식으로 1바퀴 이상 돌아가지 않는 특정 각도로 미세하게 움직이는 서보모터에 적합한 방식이다. 엔코더 슬릿을 통해 3개의 검출소자가 측정되며 이를 통해 특정위치를 확인한다. 회전수의 경우 구동측에 감속기어를 추가하여 횟수 측정한다.

장점: 전원 상태 무관, 절대 위치 유지. 단점 : 회전량 제한

엔코더 계산

1번 회전당 2000펄스(슬릿구멍 개수) 발생되는 것이 있다. 모터가 3000rpm으로 회전시, 분당 30002000 개의 펄스 발생한다.(어떤 위치를 기준으로 슬릿 구멍이 총 30002000 개 지나간다고 생각하면 된다) RPM 단위는 min 이기 때문에 초당으로 단위 환산할 시 나누기 60 > 초당 10만 펄스 발생하고, 100khz 로 표현하기도 한다.

한 예로, 서보앰프(모터드라이버 비슷한)가 500us 당 50개를 카운트하는 능력의 서보라면 50/500us = 10만counts(pulse)/s (100kHz)이므로 2000개 슬릿을 가진 엔코더와 3000rpm으로 회전이 가능한 모터를 서보앰프가 감당(데이터 샘플링)할 수 있다는 의미로 해석할 수 있다.

분해능

엔코더에서 전송하는 최소 측정 단계로, 회전당 얼마만큼의 펄스를 출력할 수 있는 가의 정도이다. 슬릿의 갯수로 이해하면 편하다. 위치를 매우 작은 단위까지 측정!

정밀도

지금 이 글을 적는 나 자신도 매우 헷갈리는 분해능과 정밀도의 차이… 두 용어를 혼용하여 쓰는 분도 있고, 다르다고 구분짓는 분도 있다. 필자는 구분짓지만 혼용도 가능하다고 생각한다. 따라서 정답을 잘 모르겠다… (아시는 분은 답변 부탁드립니다!)

정밀도는 쉽게 말해 측정한 위치가 실제 값과 얼마나 가까운 가의 정도이다. 엄밀히 말해 분해능과 차이가 있지만, 정밀도가 분해능과 관련이 있다고 생각할 수 있는 것이 분해능이 좋을 수록 정밀도도 좋아지기 때문이다. 필자는 쉽게 정 위치와 얼마나 가까운지로 이해한다.

모터 드라이버

모터드라이버란 쉽게 말하여 모터를 제어할 수 있는 장치이다. 여기서 단순히 모터에 +, - 연결하면 한 쪽 방향으로만 회전하여 손으로 +,- 입력단자를 바꾸지 않는 이상 회전 변환은 불가능하다. 따라서 모터드라이버가 H-브릿지회로를 사용하여 입력단자를 바꿔주고 이를 통해 회전방향을 제어하게 된다. 또한 모스펫 채널을 통해 펄스수를 제어하여 전압조절로 모터 속도를 제어하게 된다.

H-브릿지 회로란? - 스위치 제어

아래 그림을 볼 때, S1S_1 스위치와 S4S_4 스위치 가 연결 될 때 +는 모터 왼쪽, - 는 오른쪽에 있어 정방향 회전을 한다. 그러나 만약, S3S_3S2S_2 스위치가 닫히면 모터의 +,- 방향이 반대로 되어, 회전이 역방향으로 변함을 알 수 있다. 이러한 스위치 전환을 통해 입력단자를 전환할 수 있는 회로를 H-브릿지회로라 한다.

PWM 제어

Pulse Width Modulation의 약자로 펄스 폭을 변화시켜 전압을 조절하고, 이를 통해 모터의 속도를 제어하는 것을 의미한다.

모터 속도 공식은 아래와 같다.

N=k∗(V−IaRa)∅ N = k *\frac { (V- I_aR_a)} {\varnothing}

VV는 전압, IaRaI_aR_a는 역기전력, NN은 분당 회전수, ∅\varnothing는 계자이다.

따라서, 회전속도를 결정짓는 중요한 인자 중 하나는 전압이다. 전압 조절은 PWM 즉, 위에서 언급한 스위치를 모스펫 채널로 특정 주기마다 열고 닫고를 하면 전체 평균 전압이 변하여 전압을 조절할 수 있다. 아래 그림을 통해 이해해보자.

10V전압 인가 시, 스위치를 1초마다 on/off 하면 평균 전압이 5V가 됨을 알 수 있다. > 전체 면적(전압*시간)을 시간으로 나누면 된다. 참고로, 시간은 사이클 단위로 계산해야 한다.

마찬가지로 전압을 2초동안 주고 1초 쉬고를 반복하면 6.66V가 나옴을 알 수 있다.

이렇게 구한, 전압을 공식에 대입하고, 나머지 변수는 주어진다면, 속도를 구할 수 있고 이것이 모터드라이버가 속도를 제어하는 것이라 할 수 있다.

  • 모스펫 채널은 간단하게 스위치를 주기별로 on/off 하는 것으로, 성능이 좋을수록 짧은 주기로 열고 닫을 수 있어 미세한 전압조절이 가능하다.

PID 제어

P 비례 : 오차 값의 크기에 비례한 제어작용, kp 크면 빠르게 셋포인트 도달, 그러나 불안정상태 > 진동

I 적분 : 일정한 상태로 유지되는 오차를 없애는 작용, 누적 오차에 따라 출력을 보고 바꿔야 함

오차가 클 경우 시간이 지남에 따라 오차 합이 쌓이며, 출력은 빠르게 변해 오차 제거.
Ki크면 빠르게 응답, 그러나 파형 상승부도 커짐> 그러나 점점 안정

D 미분 : 출력값의 급격한 변화에 제동을 걸어 오버슛을 줄여 안정성 향상

관련 게시물

Toplist

최신 우편물

태그