마이크로프로세서에서 바퀴 등을 돌려야할 때 흔히 사용되는 모터가 스태핑모터다
일단 DC모터 보다 높은 전압과 전류를 소비하지만 강한 파워를 보여준다.
문제는
이 놈을 제어하는 것이 보통의 DC모터처럼 전압을 가하면 땡이 아니라는 것이다.
상 제어가 필요없는 모터드라이버를 사용하면 좋겠지만 그렇지 않은 경우
상 제어를 별도로 해 줘야한다.
상 제어?
이 모터를 구동시키는 방법엔 1상, 2상, 1-2상 여자방식이 있다.
스태핑모터의 내부에는 4개의 전자석이 있다. 이 전자석들이 차례로 동작하면서
모터를 회전시키는 것이다. 전자석들이 동작하는 방식에 따라 1상, 2상, 1-2상 여자방식이 나뉘게 된다.
1상
전자석들을 편의상 ABCD라고 할 때
ABCD
ABCD
ABCD
ABCD
의 형태로 신호를 보내는 경우다.
소비전력은 가장 낮으나 부드럽지 못하고 진동이 강하다.
2상
ABCD
ABCD
ABCD
ABCD
의 형태로 신호를 보내는 경우다.
1상에 비해 더 부드러운 동작을 보여주지만 전력소비가 더 크다.
1-2상
ABCD
ABCD
ABCD
ABCD
ABCD
ABCD
ABCD
ABCD
의 형태로 신호를 보내는 경우다.
1상과 2상이 합쳐진 형태로 보다 정밀한 제어가 가능하다.
ABCD중 하나 만 잡고 봤을 때 이 놈이 어느 Tick에 작동하는 지에 주목하면 간단해진다.
void moveForword() { if( moveSwt == 1) { if(cnt == 1 || cnt == 2 || cnt == 3) GPIO_SetBits(GPIOE,GPIO_Pin_1); else GPIO_ResetBits(GPIOE,GPIO_Pin_1); if(cnt == 3 || cnt == 4 || cnt == 5) GPIO_SetBits(GPIOE,GPIO_Pin_2); else GPIO_ResetBits(GPIOE,GPIO_Pin_2); if(cnt == 5 || cnt == 6 || cnt == 7) GPIO_SetBits(GPIOE,GPIO_Pin_3); else GPIO_ResetBits(GPIOE,GPIO_Pin_3); if(cnt == 7 || cnt == 8 || cnt == 1) GPIO_SetBits(GPIOE,GPIO_Pin_4); else GPIO_ResetBits(GPIOE,GPIO_Pin_4); if(cnt == 1 || cnt == 2 || cnt == 3) GPIO_SetBits(GPIOC,GPIO_Pin_9); else GPIO_ResetBits(GPIOC,GPIO_Pin_9); if(cnt == 3 || cnt == 4 || cnt == 5) GPIO_SetBits(GPIOC,GPIO_Pin_8); else GPIO_ResetBits(GPIOC,GPIO_Pin_8); if(cnt == 5 || cnt == 6 || cnt == 7) GPIO_SetBits(GPIOC,GPIO_Pin_7); else GPIO_ResetBits(GPIOC,GPIO_Pin_7); if(cnt == 7 || cnt == 8 || cnt == 1) GPIO_SetBits(GPIOC,GPIO_Pin_6); else GPIO_ResetBits(GPIOC,GPIO_Pin_6); cnt++; if(cnt == 9) cnt = 1; } }
라인트레이서(2개의 스태핑모터가 결합된 것)을 1-2상방식으로 전진시키기 위한 소스이다.
타이머 핸들러에선 위 함수를 매 클럭마다 호출하며 moveSwt변수에 의해 허용/비허용이 제어된다.
cnt변수가 매 주기마다 1~8을 반복하며 GPIO핀들을 제어하고 있다.
'Embeded > ARM Cortex-M4' 카테고리의 다른 글
초음파 센서 (0) | 2015.07.10 |
---|---|
UART - PC, 블루투스 통신 (0) | 2015.07.10 |
Sink방식과 Source방식 (0) | 2015.07.10 |
DAC(Digital-Analog Converter) (0) | 2015.07.10 |
ADC(Analog-Digital Converter) (0) | 2015.07.10 |