====== 엔코더 입력 ======
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
[[..:index|← CUBLOC2 목차로 돌아가기]]