모터의 엔코더포트를 이 보드에 연결하고 getEncoderPosition() 함수를 이용해 엔코더 카운터값을 모니터링 하십시오.
dcmotor.getEncoderPosition();
#include <PhpocExpansion.h>
#include <Phpoc.h>
byte spcId = 1;
ExpansionDCMotor dcmotor(spcId, 1);
void setup() {
Serial.begin(9600);
while(!Serial)
;
Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
Expansion.begin();
Serial.println(dcmotor.getPID());
Serial.println(dcmotor.getName());
dcmotor.setPeriod(10000);
dcmotor.setWidth(3000);
}
void loop() {
// get the counter value of an encoder
Serial.println(dcmotor.getEncoderPosition());
delay(100);
}
getEncoderPeriod() 함수를 이용해 엔코더 출력 펄스 주기 모니터링 하십시오.
period = dcmotor.getEncoderPeriod();
엔코더 출력 펄스 주기의 단위는 마이크로 초(us) 입니다. 엔코더 출력 펄스 주기를 모니터링할 때 오차를 줄이기 위해서는 엔코더 샘플링 카운트를 높은 값으로 설정하시기 바랍니다.
#include <PhpocExpansion.h>
#include <Phpoc.h>
byte spcId = 1;
ExpansionDCMotor dcmotor(spcId, 1);
int width = 3000;
void setup() {
Serial.begin(9600);
while(!Serial)
;
Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
Expansion.begin();
Serial.println(dcmotor.getPID());
Serial.println(dcmotor.getName());
dcmotor.setEncoderPSR(64);
dcmotor.setPeriod(10000);
dcmotor.setWidth(width);
}
void loop() {
if(width > 1000) {
width -= 100;
dcmotor.setWidth(width);
delay(500);
Serial.print(width);
Serial.print("=>");
// get the period of an encoder's output
Serial.println(dcmotor.getEncoderPeriod());
}
else
dcmotor.setWidth(0);
}
setEncoderPolarity() 함수를 이용해 엔코더 카운트 방향을 설정할 수 있습니다.
dcmotor.setEncoderPolarity(pol);
pol - 엔코더 카운트 방향
pol | polarity |
---|---|
0보다 크거나 같음 | 정방향(기본 값) |
0보다 작음 | 역방향 |
※참고: 실제 엔코더 카운터값은 모터의 회전 방향에 영향을 받습니다.
엔코더 카운트 방향 설정 | 모터의 회전 방향 | 카운터 값 |
---|---|---|
정방향 | 시계방향 | 증가 |
정방향 | 반시계방향 | 감소 |
역방향 | 반시계방향 | 증가 |
역방향 | 시계방향 | 감소 |
setEncoderPosition() 함수를 이용해 엔코더 카운터값을 초기화 또는 변경할 수 있습니다.
dcmotor.setEncoderPosition(pos);
pos - 엔코더 카운터값
카운터값은 -1000000000(-10억) 부터 1000000000(10억)까지 설정할 수 있습니다.
setEncoderPSR() 함수를 이용해 엔코더 샘플링 카운트를 설정할 수 있습니다.
dcmotor.setEncoderPSR(psr);
psr - 엔코더 샘플링 카운트
엔코더 샘플링 카운트는 엔코더 출력 펄스의 주기를 측정할 때 사용할 펄스의 개수를 의미합니다. 샘플링 카운트가 많을수록 오차는 줄어듭니다. 엔코더 샘플링 카운트는 1부터 64까지 설정할 수 있습니다.