Top 8 엔코더 모터 속도 제어 12740 Good Rating This Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 엔코더 모터 속도 제어 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: 엔코더 모터 속도 제어 아두이노 엔코더 모터 pid 제어, 아두이노 엔코더 모터 속도 측정, 엔코더 모터 PID 제어, 엔코더 모터 아두이노 연결, 엔코더 모터 아두이노, 엔코더 모터 원리, 엔코더모터 드라이버, 엔코더 속도 측정

엔코더 모터는 위에서 말했던 것처럼 위치제어와 속도제어가 요구되는 곳에 사용됩니다. 엔코더에서 나오는 펄스의 개수로 위치제어를 할 수 있으며, 펄스 사이의 시간 간격을 이용하여 속도제어를 할 수 있습니다.


인코더 모터 : 주행 속도 컨트롤 # 28
인코더 모터 : 주행 속도 컨트롤 # 28


엔코더 모터 제어 (0. 소개)

  • Article author: pkr7098.tistory.com
  • Reviews from users: 19855 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 엔코더 모터 제어 (0. 소개) Updating …
  • Most searched keywords: Whether you are looking for 엔코더 모터 제어 (0. 소개) Updating 서론 세상에는 여러 종류의 모터가 있습니다. 그 종류는 크게 서보모터, DC모터, BLDC, AC모터 그리고 이번에 다뤄 볼 엔코더 모터가 있습니다. 엔코더 모터는 DC모터에 엔코더가 부착되어 있는 모터로 속도 제어,..
  • Table of Contents:

서론

엔코더 모터 (Encoder motor)

방향성

진행 과정

Continue

태그

stm32실전 Related Posts

티스토리툴바

엔코더 모터 제어 (0. 소개)
엔코더 모터 제어 (0. 소개)

Read More

엔코더 모터 제어 (1. 펄스및 위치 측정)

  • Article author: pkr7098.tistory.com
  • Reviews from users: 40575 ⭐ Ratings
  • Top rated: 3.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 엔코더 모터 제어 (1. 펄스및 위치 측정) PID 제어로 속도 제어 [PID 함수들 만들기 Part 01]) (tistory.com). 서론. 엔코더 모터를 사용하는 이유 중 하나는 위치를 알 수 있다는 점입니다. …
  • Most searched keywords: Whether you are looking for 엔코더 모터 제어 (1. 펄스및 위치 측정) PID 제어로 속도 제어 [PID 함수들 만들기 Part 01]) (tistory.com). 서론. 엔코더 모터를 사용하는 이유 중 하나는 위치를 알 수 있다는 점입니다. 관련글 잡동사니 세상 :: 엔코더 모터 제어 (0. 소개) (tistory.com) 엔코더 모터 제어 (2. 속도 계산) (tistory.com) 엔코더 모터 제어 (3. PID 제어로 속도 제어 [PID 함수들 만들기 Part 01]) (tistory.com) 서..
  • Table of Contents:

관련글

서론

엔코더 설명

엔코더 값 읽기

외부 인터럽트

2체배

4체배

Continue

태그

stm32실전 Related Posts

티스토리툴바

엔코더 모터 제어 (1. 펄스및 위치 측정)
엔코더 모터 제어 (1. 펄스및 위치 측정)

Read More

[기초] 엔코더 제어방식 및 구조

  • Article author: bitbong.tistory.com
  • Reviews from users: 37992 ⭐ Ratings
  • Top rated: 4.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [기초] 엔코더 제어방식 및 구조 엔코더 서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는, 광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적 … …
  • Most searched keywords: Whether you are looking for [기초] 엔코더 제어방식 및 구조 엔코더 서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는, 광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적 … 엔코더 서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는, 광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적으로 사용되고 있습니다. 최근에는 광학식 엔코더가 주류로..
  • Table of Contents:
[기초] 엔코더 제어방식 및 구조
[기초] 엔코더 제어방식 및 구조

Read More

엔코더: 사용 이유와 선택 방법

  • Article author: www.portescap.com
  • Reviews from users: 28838 ⭐ Ratings
  • Top rated: 4.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 엔코더: 사용 이유와 선택 방법 엔코더는 속도 및 위치지정과 관련하여 정확한 모터 제어를 위한 피드백을 제공합니다. Portescap은 관련 기술을 살펴보고 귀하의 응용 프로그램에 맞는 엔코더를 선택 … …
  • Most searched keywords: Whether you are looking for 엔코더: 사용 이유와 선택 방법 엔코더는 속도 및 위치지정과 관련하여 정확한 모터 제어를 위한 피드백을 제공합니다. Portescap은 관련 기술을 살펴보고 귀하의 응용 프로그램에 맞는 엔코더를 선택 …
  • Table of Contents:
엔코더: 사용 이유와 선택 방법
엔코더: 사용 이유와 선택 방법

Read More

DC Mouse 3. 아두이노 DC 모터 PID 제어

  • Article author: maxpulse.tistory.com
  • Reviews from users: 43617 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about DC Mouse 3. 아두이노 DC 모터 PID 제어 아두이노 나노로 모터 2개의 엔코더 입력에 문제없음을 확인함 (DC Mouse 2 참조) … 직진 구간에서는 벽에 부딪히지 않도록 양쪽 바퀴의 속도 제어를 … …
  • Most searched keywords: Whether you are looking for DC Mouse 3. 아두이노 DC 모터 PID 제어 아두이노 나노로 모터 2개의 엔코더 입력에 문제없음을 확인함 (DC Mouse 2 참조) … 직진 구간에서는 벽에 부딪히지 않도록 양쪽 바퀴의 속도 제어를 … 아두이노 나노로 모터 2개의 엔코더 입력에 문제없음을 확인함 (DC Mouse 2 참조) PID 제어를 구현해본다 마이크로 마우스에서 직진과 회전 구간을 구분해서 동작하는데 직진 구간에서는 벽에 부딪히지 않도록 양..
  • Table of Contents:

태그

‘로봇 만들기 – AVR마이크로 마우스’ Related Articles

공지사항

최근 포스트

태그

검색

전체 방문자

DC Mouse 3. 아두이노 DC 모터 PID 제어
DC Mouse 3. 아두이노 DC 모터 PID 제어

Read More

KR19980033797A – 모터에서 엔코더를 이용한 속도검출 장치 및 ê·¸ 방법
– Google Patents

  • Article author: patents.google.com
  • Reviews from users: 29646 ⭐ Ratings
  • Top rated: 4.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about KR19980033797A – 모터에서 엔코더를 이용한 속도검출 장치 및 ê·¸ 방법
    – Google Patents 본 발명은 동기식 엠티(M/T)법을 이용하여 회전속도를 계산하는 장치 및 방법에 관한 것이다. 이를 위하여 본 발명의 장치는 속도제어주기를 발생하기 위한 속도샘플링 … …
  • Most searched keywords: Whether you are looking for KR19980033797A – 모터에서 엔코더를 이용한 속도검출 장치 및 ê·¸ 방법
    – Google Patents 본 발명은 동기식 엠티(M/T)법을 이용하여 회전속도를 계산하는 장치 및 방법에 관한 것이다. 이를 위하여 본 발명의 장치는 속도제어주기를 발생하기 위한 속도샘플링 …
    본 발명은 동기식 엠티(M/T)법을 이용하여 회전속도를 계산하는 장치 및 방법에 관한 것이다. 이를 위하여 본 발명의 장치는 속도제어주기를 발생하기 위한 속도샘플링 타임 카운터(404); 소정의 제1 주파수(F1) 클럭을 발생하는 제1 클럭발생기(405); 상기 제1 주파수(F1)보다 고주파인 소정의 제2 주파수(F2) 클럭을 발생하는 제2 클럭발생기(406); 엔코더펄스 카운터(407); 제1 타임 카운터(408); 제2 타임 카운터(409); 및 상기 M1인터럽트신호가 입력되면 상기 엔코더 펄스 카운터의 래치된 카운트값과 제1 타임 카운터의 래치된 카운트값 및 제2 타임 카운터의 래치된 카운트값을 데이터 버스를 통해 읽어와 소정의 수학식에 따라 계산하여 모터의 평균속도를 계산하는 프로세서(401)로 구성된다.
    따라서 모터 제어시스템에서 되먹임 정보의 검출 메카니즘을 일관성있게 유지하므로써 시스템의 선형성을 향상시킬 수 있으며, 이에 따라 전향 되먹임 제어 등의 제어 알고리즘 사용시 시스템의 성능을 향상시킬 수 있다.

  • Table of Contents:

Info

Links

Abstract

Description

Claims (2)

Priority Applications (1)

Applications Claiming Priority (1)

Publications (1)

ID=66519761

Family Applications (1)

Country Status (1)

Cited By (4)

Cited By (4)

Similar Documents

Legal Events

KR19980033797A - 모터에서 엔코더를 이용한 속도검출 장치 및 그 방법 
        - Google Patents
KR19980033797A – 모터에서 엔코더를 이용한 속도검출 장치 및 ê·¸ 방법
– Google Patents

Read More


See more articles in the same category here: Top 721 tips update new.

엔코더 모터 제어 (0. 소개)

반응형

서론

세상에는 여러 종류의 모터가 있습니다. 그 종류는 크게 서보모터, DC모터, BLDC, AC모터 그리고 이번에 다뤄 볼 엔코더 모터가 있습니다. 엔코더 모터는 DC모터에 엔코더가 부착되어 있는 모터로 속도 제어, 위치 제어에 용이합니다. 이번 시리즈는 위치제어보다는 속도제어에 초점을 맞춰 글을 풀어 나갈 예정입니다.

엔코더 모터 (Encoder motor)

엔코더 모터 (Encoder motor)

엔코더 모터는 위에서 말했던 것처럼 위치제어와 속도제어가 요구되는 곳에 사용됩니다. 엔코더에서 나오는 펄스의 개수로 위치제어를 할 수 있으며, 펄스 사이의 시간 간격을 이용하여 속도제어를 할 수 있습니다.

Pulse Per Revolution 즉, PPR이라는 것은 엔코더를 한 바퀴 회전시켰을 때 한 채널에서 발생되는 펄스의 개수 입니다. PPR이 11이면 한 바퀴당 11개의 펄스가 나온다는 뜻이고, 400이면 400개의 펄스가 나온다는 의미이죠. 엔코더 모터는 이 PPR을 기준으로 몇 바퀴 돌았는지, 회전속도는 어느 정도인지 등을 알려주는 모터입니다.

그림 01

위의 사진은 제가 이번에 사용할 엔코더 모터입니다. 11 PPR이며 2개의 채널이 있기 때문에 총 22 PPR입니다. 3.3v ~ 5v의 전압은 엔코더 용으로 사용되며, 12v로 동작하는 모터입니다.

다음은 엔코더 모터에서 펄스 개수와 회전 속도를 출력하는 영상입니다.

영상 01

방향성

이번 시리즈는 엔코더 모터에서 각도를 계산하는 방법에서부터, 속도 측정 그리고 PID제어를 통한 위치와 속도 제어를 할 예정입니다.

stm32f103zet6를 사용할 예정이지만, 범용적으로 설명하는 부분과 stm32f103zet6만의 특별한 기능 둘 모두 설명할 것이기 때문에 아두이노 등 다른 MCU를 사용하시는 분들께도 도움이 되기를 기원합니다.

진행 과정

1. 펄스및 위치 측정

2. 속도 계산

3. PID 제어로 속도 제어

준비물

반응형

엔코더 모터 제어 (1. 펄스및 위치 측정)

반응형

관련글

잡동사니 세상 :: 엔코더 모터 제어 (0. 소개) (tistory.com)

엔코더 모터 제어 (2. 속도 계산) (tistory.com)

엔코더 모터 제어 (3. PID 제어로 속도 제어 [PID 함수들 만들기 Part 01]) (tistory.com)

서론

엔코더 모터를 사용하는 이유 중 하나는 위치를 알 수 있다는 점입니다. 몇 바퀴 회전했는지, 또는 어느정도 각도만큼 움직였는지를 쉽게 측정할 수 있는지 말입니다. 엔코더 모터의 위치는 일반적인 엔코더 사용법과 완전히 동일합니다.

avr 로터리 엔코더 사용하기

제가 사용할 모터에 달려 있는 엔코더는 자석 기반의 엔코더이며, 11 PPR의 해상도를 가지고 있습니다. 한 바퀴에 11개의 펄스가 한 채널에서 발생된다는 거죠. 총 2개의 채널이 있으니 엔코더는 한 바퀴당 최대 22개의 펄스를 발생시킬 수 있습니다. 여기서 주의할 점은 엔코더 기준이지 모터 기준은 아니라는 겁니다. 모터의 ratio가 330이니 모터가 한 바퀴 돌 때, 엔코더는 330바퀴를 회전합니다. 이 덕분에 모터 한 바퀴당 엔코더의 한 채널에서는 11*330 = 3,630개의 펄스가 발생한다는 것을 알 수 있습니다.

여기서 펄스는 다음과 같이 직사각형 모양을 의미합니다. (펄스는 High의 길이(시간)와 관계 없이 Low -> High -> Low로 변하는 과정을 의미합니다.)

그림 01 [펄스란]

관계를 표현하면 다음과 같습니다.

두 채널에 발생된 펄스 한 채널에 발생된 펄스 엔코더 회전수 모터 회전수 7,260 개 3,630 개 330 바퀴 1 바퀴

이번 시간에는 엔코더에서 펄스 값을 계산하고, 위의 관계식을 이용하여 몇 바퀴 회전했는지 계산해 보겠습니다.

엔코더 설명

체배

엔코더 값 읽기

외부인터럽트

1체배

2체배

4체배

엔코더 설명

엔코더에는 A, B라고 불리우는 채널이라는 개념이 있습니다. 그냥 엔코더의 신호가 나오는 선이라고 생각하시면 됩니다. 엔코더가 시계방향 (Clock Wise) 또는 반시계방향(Count Clock Wise)에 따라 A, B 채널에서 다음과 같은 신호가 발생됩니다.

그림 02 [방향에 따른 엔코더 A, B 펄스]

시계 방향일 경우 A핀이 Low -> High로 변할 때(1번) B는 Low이고, B가 Low -> High일 때(2번) A가 High입니다. 마찬가지로 A가 High -> Low일 때(3번) B는 High이고, B가 High -> Low일 때(4번) A가 Low입니다. 표로 정이하면 다음과 같네요.

시계 방향으로 회전할 때 각 edge(rising or falling)에서의 핀들의 상태

채널 A rising일 때 A falling 일 때 B rising 일 때 B falling 일 때 A핀 상태 low -> high high -> low High Low B핀 상태 Low High low -> high high -> low

반시계 방향으로 회전할 때 각 edge(rising or falling)에서의 핀들의 상태

채널 A rising일 때 A falling 일 때 B rising 일 때 B falling 일 때 A핀 상태 low -> high high -> low Low High B핀 상태 High Low low -> high high -> low

위의 표를 보면 A핀이 low -> high 즉, rising인 상태일 때 B의 상태가 Low면 시계 방향(CW), High면 반시계 방향(CCW)라는 것을 알 수 있습니다.

우리는 이러한 edge의 개수를 기반으로 얼만큼 회전했는지를 알 수 있는 것입니다.

체배

체배라는 것은 엔코더의 한 개념으로, A rising, A falling, B rising, B falling 등의 edge를 몇개 사용하여 각도를 측정할 것인가에 대한 것입니다.

위에서 설명할 때 A rising, A falling, B rising, B falling 4개의 edge가 있다는 것을 알았고, 각각의 edge에서 다른 채널의 상태에 따라 CW인지, CCW인지를 알 수 있었습니다. 그러면 A rising일 때 B의 상태만 안다면 CW인지, CCW인지 알 수 있다는 의미입니다. 이렇듯 하나의 edge에서도 회전 방향을 알 수 있습니다. 4개 중 1개의 edge로 판단하든, 4개 중 4개 모두의 edge로 판단하든 회정 방향을 마찬가지라는 것이죠.

여기서 4개 중 1개의 edge를 사용하는 것이 1체배 방법, 2개를 사용하는 것이 2체배, 4개를 사용하면 4체배가 되는 거죠. 여기서 중요한 점은 체배가 높을 수록 보다 정확한 각도를 알 수 있다는 것입니다.

예를 들어 11 PPR 엔코더는 엔코더 한 바퀴당 한 채널에서 11개의 펄스가 나오고, 2개의 채널(A, B)이 있으니 총 22개의 펄스가 나옵니다. 한 펄스당 2개의 edge(rising, falling)가 있으니 총 44개의 edge가 발생합니다. 한 바퀴에 44개의 edge가 발생되니 360도 회전하는데 44개의 edge가 발생한다는 의미입니다.

역으로 생각한다면 하나의 edge가 감지 되면 대략 8.18도 회전했다는 것을 알 수 있죠. 근데 여기서 44개의 edge 말고 한 채널만의 edge만 고려한다면 22개의 edge가 발생하고, 그러면 1 edge당 16.36도 회전했다는 것을 알 수 있죠. 더 나아가 한 채널의 rising edge만 고려한다면 11개의 edge가 발생하고, 그러면 1 edge당 32.73도 회전했다는 것을 알 수 있죠.

이를 체배로 설명하면 다음과 같은 표를 생각할 수 있습니다.

한 펄스당 감지하는 edge의 개수 한 바퀴당 감지하는 edge의 개수 한 edge당 회전 각도 1체배 1 11 32.73 (낮은 정확도) 2체배 2 22 16.36 (중간 정확도) 4체배 4 44 8.18 (높은 정확도)

즉 1체배, 2체배, 4체배 기법 모두 회전 방향을 알 수 있지만, 정확도가 다르다는 것을 알 수 있습니다.

보통 2체배 방법을 이용하여 간단하게 처리하며, 높은 정확도를 원할 때는 4체배 그리고 1체배는 거의 안 쓰는 것 같습니다.

엔코더 값 읽기

제가 산 엔코더 모터의 색에 다른 의미는 다음과 같습니다.

색 의미 전압 범위 stm32f103zet6 연결 빨강 모터 전원선 0v ~ 12v –

(펄스 값만 읽을 때는 연결 x) 검정 엔코더 전원선 0v (GND) GND 노랑 엔코더 신호선 (펄스선 A) 3.3v ~ 5v PG0

(입맛에 따라 변경 가능) 초록 엔코더 신호선 (펄스선 B) 3.3v ~ 5v PG1

(입맛에 따라 변경 가능) 파랑 엔코더 전원선 3.3v ~ 5v 3.3v 하양 모터 전원선 0v ~ 12v –

(펄스 값만 읽을 때는 연결 x)

선이 대칭으로 되어 있으니, 헷갈리지 않으시기를 바랍니다.

펄스선 A, B 이렇게 나눴지만, 이를 반대로 한다고 해도 방향만 바뀌는 것이기 때문에 사실상 어떻게 연결하든 상관이 없습니다.

외부 인터럽트

엔코더에서 값을 읽는 시점은 앞에서 말한 것처럼 rising, falling 등의 edge에서 읽어야 합니다. 그렇다면 우리는 rising 또는 falling에서 발생되는 외부 인터럽트 (또는 EXTI)를 이용하면 이를 쉽게 구현할 수 있을 것입니다.

인터럽트 & 외부 인터럽트

이번 포스트에서는 PG0, PG1을 사용할 것이기 때문에 다음과 같이 작성해 줍니다.

void EXTIInit(void); int main(void) { GPIOG -> CRL = (4 << MODE0) | (4 << MODE1); // PG0, 1을 floating input으로 설정합니다. EXTIInit(); } void EXTIInit(void) { /* PG0, 1을 EXTI0, 1에 연결하고 NVIC에 연결하여 활성화시킵니다. Rising, Falling edges에서 동작되도록 설정합니다. */ RCC -> APB2ENR |= (1 << IOPGEN) | (1 << AFIOEN); // GPIOG에 클럭을 공급하고, Alternate Funcion을 사용하기 위해 AFIO에 클럭을 공급합니다. RCC -> APB1ENR |= (1 << 0); // TIM2에 클럭을 공급합니다. (36 MHz) AFIO -> EXTICR1 |= (6 << 0) | (6 << 4); // PG0와 PG1을 EXTI0와 EXTI1에 연결합니다. EXTI -> RTSR |= (1 << 0) | (1 << 1); EXTI -> FTSR |= (1 << 0) | (1 << 1); // EXTI0, 1을 rising, falling edge에서 발생되도록 합니다. EXTI -> IMR |= (1 << 0) | (1 << 1); // EXTI0, 1을 활성화할 준비를 합니다. NVIC_ISER0 |= (1 << 6) | (1 << 7); // NVIC에 EXTI0, 1을 연결하여 최종 활성화합니다. } PG0은 EXTI0에 PG1은 EXTI1에 연결되어야하기 때문에 EXTIInit()을 이에 맞게 작성했습니다. 그 다음으로 Handler의 기본 구조를 만들고 pulse를 저장할 변수를 지정합니다. (void EXTIInit(void);와 int main(void) {사이에 작성하세요.) volatile long encoderPulse = 0; void EXTI0_IRQHandler(void) { } void EXTI1_IRQHandler(void) { } volatile은 encoderPulse라는 변수가 인터럽트 내부에서 사용될 것이기 때문에 사용하는 것이라고 생각하시면 됩니다. long 자료형을 사용한 이유는 모터 한 바퀴당 적개는 330(1체배), 많을 때는 1,320의 펄스가 발생하기 때문이며, CW로 회전할 땐 +, CCW로 회전할 땐 -로 계산하기 위해 부호가 있는 자료형으로 설정했습니다. 1체배 한 채널만 사용하며 rising / falling edge 둘 중 하나에서만 pulse를 측정합니다. 여기서는 PG0핀만 interrupt를 받아지게할 예정이기 때문에 관련 코드를 지웁니다. (PG1을 안 사용하는 게 아니라 Interrupt로 사용 안 하겠다는 의미입니다.) void EXTIInit(void); int main(void) { GPIOG -> CRL = (4 << MODE0) /*| (4 << MODE1)*/; EXTIInit(); } void EXTIInit(void) { /* PG0, 1을 EXTI0, 1에 연결하고 NVIC에 연결하여 활성화시킵니다. Rising, Falling edges에서 동작되도록 설정합니다. */ RCC -> APB2ENR |= (1 << IOPGEN) | (1 << AFIOEN); // GPIOG에 클럭을 공급하고, Alternate Funcion을 사용하기 위해 AFIO에 클럭을 공급합니다. RCC -> APB1ENR |= (1 << 0); // TIM2에 클럭을 공급합니다. (36 MHz) AFIO -> EXTICR1 |= (6 << 0) /*| (6 << 4)*/; // PG0와 PG1을 EXTI0와 EXTI1에 연결합니다. // *PG1을 사용하지 않을 것이기 때문에 (6 << 4)를 지웁니다. EXTI -> RTSR |= (1 << 0)/* | (1 << 1)*/; /* EXTI -> FTSR |= (1 << 0) | (1 << 1);*/ // EXTI0, 1을 rising, falling edge에서 발생되도록 합니다. // *PG1을 사용하지 않을 것이기 때문에 (1 << 1)을 지웁니다. // Rising edge에서만 interrupt를 발생시키기 위해 EXTI -> FTSR을 지웁니다. EXTI -> IMR |= (1 << 0)/* | (1 << 1)*/; // EXTI0, 1을 활성화할 준비를 합니다. // *EXTI0만 사용할 것이기 때문에 (1 << 1)을 지웁니다. NVIC_ISER0 |= (1 << 6)/* | (1 << 7)*/; // NVIC에 EXTI0, 1을 연결하여 최종 활성화합니다. // EXTI0만 사용할 것이기 때문에 (1 << 7)을 제거합니다. } EXTI0만 사용할 것이기 때문에 Handler도 하나만 사용하며, 그 내부는 다음과 같이 수정합니다. volatile long encoderPulse = 0; void EXTI0_IRQHandler(void) { if (EXTI -> PR & (1 << 0)) { // EXTI0가 발생되었는지 확인합니다. //EXTI9_5 같은 인터럽트도 있기 때문에 존재 EXTI -> PR |= (1 << 0); // 1을 write하면 0으로 되는 register이기 때문에 1을 write하여 인터럽트가 발생되었다는 것을 알립니다. if(GPIOG -> IDR & (1 << 1)) { // A채널이 Rising일 때 B채널이 High라면 -> CCW encoderPulse–; } else { // A채널이 Rising일 때 B채널이 Low라면 -> CW encoderPulse++; } } } /* void EXTI1_IRQHandler(void) { }*/

설명했던 것처럼 A가 rising일 때 B가 High이면 CCW, Low이면 CW입니다. (EXTI0_IRQHandler는 A가 rising일 때 발생된다는 것을 잊지 마세요.)

이렇게 보면 너무 간단하죠? 하지만 이게 정말 끝입니다.

다음 코드는 1체배 모드로 엔코더 모터에서 펄스를 읽는 코드입니다.

void EXTIInit(void); volatile long encoderPulse = 0; void EXTI0_IRQHandler(void) { if (EXTI -> PR & (1 << 0)) { // EXTI0가 발생되었는지 확인합니다. //EXTI9_5 같은 인터럽트도 있기 때문에 존재 EXTI -> PR |= (1 << 0); // 1을 write하면 0으로 되는 register이기 때문에 1을 write하여 인터럽트가 발생되었다는 것을 알립니다. if(GPIOG -> IDR & (1 << 1)) { // A채널이 Rising일 때 B채널이 High라면 -> CCW encoderPulse–; } else { // A채널이 Rising일 때 B채널이 Low라면 -> CW encoderPulse++; } } } int main(void) { GPIOG -> CRL = (4 << MODE0); EXTIInit(); while(1) { //encoderPulse를 확인할 수 있는 코드 삽입 } } void EXTIInit(void) { /* PG0을 EXTI0에 연결하고 NVIC에 연결하여 활성화시킵니다. Rising edges에서 동작되도록 설정합니다. */ RCC -> APB2ENR |= (1 << IOPGEN) | (1 << AFIOEN); RCC -> APB1ENR |= (1 << 0); AFIO -> EXTICR1 |= (6 << 0); EXTI -> RTSR |= (1 << 0); EXTI -> IMR |= (1 << 0); NVIC_ISER0 |= (1 << 6); } 2체배 두 채널을 사용하여 구현하는 것으로, 1체배 코드를 EXTI1에도 응용해서 적용하면 됩니다. EXTI0 handler코드는 동일하며, EXTIInit에서 PG1을 EXTI1에 등록하고 활성화하고, PG1을 floating input으로 설정했다는 점, EXTI1은 EXTI0 handler를 응용했다는 점이 1체배 방식과 다릅니다. void EXTIInit(void); volatile long encoderPulse = 0; void EXTI0_IRQHandler(void) { if (EXTI -> PR & (1 << 0)) { // EXTI0가 발생되었는지 확인합니다. //EXTI9_5 같은 인터럽트도 있기 때문에 존재 EXTI -> PR |= (1 << 0); // 1을 write하면 0으로 되는 register이기 때문에 1을 write하여 인터럽트가 발생되었다는 것을 알립니다. if(GPIOG -> IDR & (1 << 1)) { // A채널이 Rising일 때 B채널이 High라면 -> CCW encoderPulse–; } else { // A채널이 Rising일 때 B채널이 Low라면 -> CW encoderPulse++; } } } void EXTI1_IRQHandler(void) { if (EXTI -> PR & (1 << 1)) { // EXTI1가 발생되었는지 확인합니다. //EXTI9_5 같은 인터럽트도 있기 때문에 존재 EXTI -> PR |= (1 << 1); // 1을 write하면 0으로 되는 register이기 때문에 1을 write하여 인터럽트가 발생되었다는 것을 알립니다. if(GPIOG -> IDR & (1 << 0)) { // B채널이 Rising일 때 A채널이 High라면 -> CCW encoderPulse++; } else { // B채널이 Rising일 때 A채널이 Low라면 -> CW encoderPulse–; } } } int main(void) { GPIOG -> CRL = (4 << MODE0) | (4 << MODE1); EXTIInit(); } void EXTIInit(void) { /* PG0, 1을 EXTI0, 1에 연결하고 NVIC에 연결하여 활성화시킵니다. Rising, Falling edges에서 동작되도록 설정합니다. */ RCC -> APB2ENR |= (1 << IOPGEN) | (1 << AFIOEN); RCC -> APB1ENR |= (1 << 0); AFIO -> EXTICR1 |= (6 << 0) | (6 << 4); EXTI -> RTSR |= (1 << 0) | (1 << 1); EXTI -> IMR |= (1 << 0) | (1 << 1); NVIC_ISER0 |= (1 << 6) | (1 << 7); } 주의해야할 점은 EXTI1에서는 encoderPulse의 가감하는 때가 다르다는 것입니다. (EXTI0코드와 비교해 보세요) 4체배 2체배 방식에서 falling edge까지 고려한 것으로, 정확도는 가장 높지만, 저성능 MCU에서는 동작하지 않을 수 있는 방식입니다. void EXTIInit(void); volatile long encoderPulse = 0; void EXTI0_IRQHandler(void) { if (EXTI -> PR & (1 << 0)) { // EXTI0가 발생되었는지 확인합니다. //EXTI9_5 같은 인터럽트도 있기 때문에 존재 EXTI -> PR |= (1 << 0); // 1을 write하면 0으로 되는 register이기 때문에 1을 write하여 인터럽트가 발생되었다는 것을 알립니다. if(GPIOG -> IDR & (1 << 0)) { // A채널이 rising일 때 -> 기존 코드를 내부에 복붙 if(GPIOG -> IDR & (1 << 1)) { // A채널이 Rising일 때 B채널이 High라면 -> CCW encoderPulse–; } else { // A채널이 Rising일 때 B채널이 Low라면 -> CW encoderPulse++; } } else { // A채널이 falling일 때 if(GPIOG -> IDR & (1 << 1)) { // A채널이 Falling일 때 B채널이 High라면 -> CW encoderPulse++; } else { // A채널이 Falling일 때 B채널이 Low라면 -> CCW encoderPulse–; } } } } void EXTI1_IRQHandler(void) { if (EXTI -> PR & (1 << 1)) { // EXTI1가 발생되었는지 확인합니다. //EXTI9_5 같은 인터럽트도 있기 때문에 존재 EXTI -> PR |= (1 << 1); // 1을 write하면 0으로 되는 register이기 때문에 1을 write하여 인터럽트가 발생되었다는 것을 알립니다. if(GPIOG -> IDR & (1 << 1) { // B채널이 rising일 때 -> 기존 코드를 내부에 복붙 if(GPIOG -> IDR & (1 << 0)) { // B채널이 Rising일 때 A채널이 High라면 -> CCW encoderPulse++; } else { // B채널이 Rising일 때 A채널이 Low라면 -> CW encoderPulse–; } } else { if(GPIOG -> IDR & (1 << 0)) { // B채널이 Rising일 때 A채널이 High라면 -> CCW encoderPulse–; } else { // B채널이 Rising일 때 A채널이 Low라면 -> CW encoderPulse++; } } } } int main(void) { GPIOG -> CRL = (4 << MODE0) | (4 << MODE1); EXTIInit(); } void EXTIInit(void) { /* PG0, 1을 EXTI0, 1에 연결하고 NVIC에 연결하여 활성화시킵니다. Rising, Falling edges에서 동작되도록 설정합니다. */ RCC -> APB2ENR |= (1 << IOPGEN) | (1 << AFIOEN); RCC -> APB1ENR |= (1 << 0); AFIO -> EXTICR1 |= (6 << 0) | (6 << 4); EXTI -> RTSR |= (1 << 0) | (1 << 1); EXTI -> FTSR |= (1 << 0) | (1 << 1); EXTI -> IMR |= (1 << 0) | (1 << 1); NVIC_ISER0 |= (1 << 6) | (1 << 7); } Continue 반응형

[기초] 엔코더 제어방식 및 구조

엔코더

서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는,

광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적으로 사용되고 있습니다.

최근에는 광학식 엔코더가 주류로 제일 많이 사용되고 있습니다.

서보모터용 엔코더의 종류

엔코더의 검출 방식

인크리멘트 방식과 앱솔루트 방식

서보모터에는 엔코더가 장착되어 있습니다 이 엔코더는 모터 위치의 검출,

모터 회전속도의 검출을 실시합니다.

엔코더에는, 인크리멘트 방식과 앱솔루트 방식의 2종류가 있어, 다음과 같은 특징이 있습니다.

엔코더의 구조

아래 그림에, 검출기로서 제일 많이 사용되고 있는 엔코더의 구조를 나타냅니다.

제어 방식

인버터, AC서보 제어 방식에는, 주로 아날로그 전압 등으로 모터의 회전속도를 제어하는

속도제어, 간단한 리미트 스위치나 고정밀의 엔코더 등을 사용해 모터의 회전량을 제어하는

위치제어, 서보모터에 흐르는 전류를 제어해 토크가 항상 어느 일정한값을 유지하도록

제어하는 토크제어의 3방식이 있습니다.

-속도제어-

① 오픈루프 제어

범용 인버터 등과 같이, 속도의 피드백

이 없는 제어 방식입니다.

지령 방식은 아날로그 전압 지령으로

컨베이어 반송 속도의 제어나 팬,

펌프의 풍량, 유량제어 등 많은 용도에

사용됩니다.

정격 토크에서의 슬립은 모터의 특성에 의하는데 약 3~5%정도의 속도 변동이 있습니다.

최근의 인버터는, 디지털 제어에 의해 내부에서 속도 데이터를 설정하거나 디지털 지령

(펄스열, 패러넬 데이터, 통신)에 의해 지령을 설정하고 온도 드리프트의 영향을 받지 않게

되었습니다. 또한, 어드밴스드 자속 벡터제어의 인버터 등 속도 변동율이 1%이하의 것도

있습니다. 인버터의 경우, 대부분이 이 속도제어 방식에서 사용됩니다

② 클로즈드루프 제어

모터의 속도의 변동을 보상하기 위해서는,검출기를 설치 실제의 속도를 검출해 제어회로에

피드백을걸어둡니다, 이 방식을 클로즈드 루프 제어라고 합니다.

검출기로서는, TG(타코제네레이터), 엔코더 등이 있는데 최근에는, 엔코더가 많이 사용

인버터나 서보 어느 쪽을 사용할지는 시스템의 요구에 대해 필요한 토크를 낼 수 있는지,

또 속도제어 범위를 커버할 수 있을지 아닐지 여부로 기종을 선정합니다.

속도제어 범위의 표현에서는, 175r/min~1750r/min(1 : 10~1 : 1000)등과 같이 표현합니다.

또 클로즈드 루프 속도 지령을 아날로그

(전압 또는, 전류)를 이용하는데 이 외 ,펄스열을 입력하는 방식이나

디지털 입력의 방식도 있습니다,

드로우 운전이나 전속 운전 등 정밀도가 높은 속도제어도 할 수 있습니다.

-위치제어-

모터 회전속도를 제어하면서, 거기다가 정지 위치를 목표로 하는 위치에 세우는 제어를

위치제어라고 합니다. 정지 신호에 외부 센서 신호를 받아 들여 목표 위치에 세우는 간단한

방식에서부터, 모터에 엔코더를 붙이고 고정밀의 위치결정을 실시하는 방식,

또 항상 변동하는 정지 목표 위치에 추종이나 동기 하면서 위치결정을 실시하는

고기능이 갖춘 것까지 많은 제어 방식이 있습니다.

① 오픈루프 제어

너무 높은 정지 정밀도를

필요로 하지 않는

용도에서는, 정지 목표

위치의 앞에 감속

지령용의 리미트 스위치를

마련하여, 이 신호에 의해

모터가 감속 정지하는 방법입니다. 감속 포인트의 불균형이 정지 위치 정밀도를 좌우합니다.

그리고 제일 간단한 염가의 방법입니다.

② 세미 클로즈드루프 제어

모터에 설치된 엔코더에서

피드백을 실시합니다.

예를 들어 서보앰프에 입력된

지령분만큼 서보모터가

움직여 피드백이 귀환됩니다.

이 때 입력된 지령량과 피드백

량의 차이는, 반드시“0”이 되도록 제어됩니다. 구성이 간단하고 응답도 거론되기 때문에

서보의 경우에는 이 방식이 일반적입니다.

③ 풀-클로즈드루프 제어

기계 측에 설치된 검출기(리니어 스케일, 엔코더 등)로부터 피드백하여 제어합니다.

검출기가 최종 기계단에 설치했기 때문에, 백래시나 기계계의 오차의 영향을 받지 않고

고정밀의 위치결정 을 할 수가 있습니다. 하지만 반면, 기계 강성을 높여 둘 필요가 있습니다.

일부의 공작기계 등 고정밀의 제어의 경우에 사용되는 일이 있습니다.

-토크제어-

토크제어란, 모터가 내는 토크(전류)를 제어하는 것이어 토크제한과는 다릅니다.

그러나 용도에 따라서는, 어디라도 사용 가능한 경우도 있기 때문에 시스템에 최적인

방법을 선택합니다. 토크제어는, 토크 지령값에 대한 토크(전류)를 제어하므로,

부하 토크가 작으면 자동적으로 속도는 상승하고, 크면 속도는 하강, 동일하면 토크는 어울려,

속도는 0, 즉 모터는 정지합니다. 요컨데 줄다리기와 같은 원리입니다.

이것에 대해 토크제한이란, 위치나 속도제어시에 필요 이상의 토크를 내면 기계 파손의 가능성

이 있는 경우나 기계를 눌러서 정지시키는 경우, 메카 록을 실시하고자 할 때에

토크 제한을 걸칩니다. 토크제어는, 모터에 흐르는 전류를 검출하여 제어할 필요가 있기 때문에

전류 검출을 실시하고 있는 벡터 인버터, 서보로 대응할 수가 있습니다.

① 오픈루프 제어

토크 정밀도를 그다지 필요로 하지 않는 권출(풀기), 권취(감기)축 등의 용도에 사용됩니다.

토크의 지령으로서는 아날로그 지령이 일반적입니다.

이러한 제어의 경우에는, 온도에 의해 토크의 정밀도가 변화하는(온도 드리프트) 일이나

기계의 로스 등도 고려해 둘 필요가 있습니다.

② 클로즈드루프 제어

장력의 정밀도가 요구되는 용도(종이, 필름 등)의 권출(감기), 권취(감기)축 등의 용도에

사용됩니다. 실제의 제품에 걸리는 장력을 검출해 장력제어 장치에 피드백하는 방식입니다.

So you have finished reading the 엔코더 모터 속도 제어 topic article, if you find this article useful, please share it. Thank you very much. See more: 아두이노 엔코더 모터 pid 제어, 아두이노 엔코더 모터 속도 측정, 엔코더 모터 PID 제어, 엔코더 모터 아두이노 연결, 엔코더 모터 아두이노, 엔코더 모터 원리, 엔코더모터 드라이버, 엔코더 속도 측정

Leave a Comment