엔코더 입력

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

← CUBLOC2 목차로 돌아가기