엔코더 입력
AB상 엔코더 입력을 통해 펄스를 카운트하며, 회전 방향에 따라 증가 또는 감소합니다.
최대 2채널의 엔코더 입력을 지원하며, 채널당 최대 50kHz의 고속 펄스 입력을 처리할 수 있습니다.
- 지원 채널: 0 ~ 1
각 채널의 A상/B상 입력 포트는 아래와 같이 고정되어 있습니다.
| channel | A상 입력 포트 | B상 입력 포트 |
|---|---|---|
| 0 | 6 | 7 |
| 1 | 8 | 9 |
Encstart
Encstart channel
| 파라미터 | 설명 |
|---|---|
| channel | 엔코더 채널 번호 (0 또는 1) |
지정한 채널의 엔코더 입력을 시작합니다. A상/B상 입력 포트는 채널 번호에 따라 자동으로 할당됩니다.
Encread
value = Encread(channel)
| 파라미터 | 설명 |
|---|---|
| value | 현재 카운트 값 |
| channel | 엔코더 채널 번호 (0 또는 1) |
현재 엔코더 카운트 값을 반환합니다.
Encclear
Encclear channel
| 파라미터 | 설명 |
|---|---|
| channel | 엔코더 채널 번호 (0 또는 1) |
카운트 값을 0으로 초기화합니다.
Encstop
Encstop channel
| 파라미터 | 설명 |
|---|---|
| channel | 엔코더 채널 번호 (0 또는 1) |
엔코더 입력을 정지합니다.
동작 설명
- A상과 B상의 위상차를 이용하여 방향을 판단합니다.
- 정방향 회전 시 카운트가 증가합니다.
- 역방향 회전 시 카운트가 감소합니다.
- A상과 B상의 모든 신호 변화에서 카운트가 증가 또는 감소하며, 높은 해상도로 동작합니다.
- BASIC/LD 실행과 관계없이 항상 동작합니다.
예제
Dim A As Integer Encstart 1 Do A = Encread(1) Debug Dec A, Cr Wait 100 _DD(0) = A Loop
특징
- 방향 인식 가능
- 증가/감소 카운트 지원
- 고해상도(x4) 카운트
- 백그라운드 동작
- 채널 번호만으로 A상/B상 포트 자동 할당
주의사항
- 입력 신호는 노이즈의 영향을 받을 수 있으므로, 쉴드 케이블 사용 또는 간단한 RC 필터를 적용하는 것이 좋습니다.
- 입력 신호 주파수는 최대 50kHz까지 지원합니다.
- 옵토커플러를 사용하는 경우, 옵토커플러의 응답 속도에 따라 실제 사용 가능한 입력 주파수가 낮아질 수 있습니다.
- A상과 B상의 배선이 서로 바뀌면 증가/감소 방향도 반대로 동작합니다.
채널 사용 제한
- HSC와 엔코더 입력 기능은 내부적으로 동일한 고속 처리 자원을 공유합니다.
- 동일 채널 번호는 두 기능에서 동시에 사용할 수 없습니다.
테스트 프로그램
엔코더 테스트 예제
이 예제는 두 개의 출력 포트를 이용하여 A/B상 엔코더 신호를 생성하고,
Encread 명령으로 카운트 동작을 확인하는 테스트 프로그램입니다.
- 16번 포트 → A상
- 17번 포트 → B상
프로그램은 쿼드러처(Quadrature) 신호를 생성하여 엔코더 입력을 시뮬레이션합니다.
동작
- 기본 상태에서는 정방향 회전 신호를 생성합니다.
- 4번 입력이 HIGH가 되면 역방향 신호로 전환됩니다.
- 5번 입력이 HIGH가 되면 다시 정방향으로 전환됩니다.
- 현재 엔코더 카운트 값은
Encread(1)로 읽어_DD(0)에 저장됩니다. - LD로 가서 모니터링한뒤, 데이터뷰에 DD0를 추가하면 엔코더 카운트 값을 실시간으로 볼 수 있습니다.
참고
- 본 예제는 기능 확인용으로, 고속 및 정밀 테스트에는 적합하지 않습니다.
- 실제 성능 검증은 외부 엔코더를 사용하는 것을 권장합니다.
Dim tm As Integer
Dim dir As Byte ' 0 = 정방향, 1 = 역방향
tm = 500
Freepin 16 To 17
Encstart 1
dir = 0 ' 초기: 정방향
Do
' 방향 입력 처리
If In(4) = 1 Then dir = 1 ' 역방향
If In(5) = 1 Then dir = 0 ' 정방향
If dir = 0 Then
' ===== 정방향 =====
High 16
Low 17
uDelay tm
High 17
uDelay tm
Low 16
uDelay tm
Low 17
uDelay tm
Else
' ===== 역방향 =====
Low 17
Low 16
uDelay tm
High 17
uDelay tm
High 16
uDelay tm
Low 17
uDelay tm
End If
_DD(0) = Encread(1)
Loop
