Top 26 엔코더 모터 속도 제어 Best 295 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 Chewathai27.com/to team, along with other related topics such as: 엔코더 모터 속도 제어 아두이노 엔코더 모터 pid 제어, 아두이노 엔코더 모터 속도 측정, 엔코더 모터 PID 제어, 엔코더 모터 아두이노 연결, 엔코더 모터 아두이노, 엔코더 모터 원리, 엔코더모터 드라이버, 엔코더 모터 위치제어

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


모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10
모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10


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

  • Article author: pkr7098.tistory.com
  • Reviews from users: 14684 ⭐ Ratings
  • Top rated: 3.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: 10004 ⭐ 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

아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16) : 네이버 블로그

  • Article author: m.blog.naver.com
  • Reviews from users: 32821 ⭐ Ratings
  • Top rated: 3.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16) : 네이버 블로그 “엔코더 값 읽기 – 속도표시 및 속도제어 – 위치제어”를 차례대로 해볼까 합니다. 아두이노 초보라서 잘 할 수 있을지 모르겠네요.–;. 테스트에 사용할 … …
  • Most searched keywords: Whether you are looking for 아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16) : 네이버 블로그 “엔코더 값 읽기 – 속도표시 및 속도제어 – 위치제어”를 차례대로 해볼까 합니다. 아두이노 초보라서 잘 할 수 있을지 모르겠네요.–;. 테스트에 사용할 …
  • Table of Contents:

카테고리 이동

모터뱅크의 모터 제어와 활용법

이 블로그 
디지털 방식
 카테고리 글

카테고리

이 블로그 
디지털 방식
 카테고리 글

아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16) : 네이버 블로그
아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16) : 네이버 블로그

Read More

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

  • Article author: bitbong.tistory.com
  • Reviews from users: 2416 ⭐ Ratings
  • Top rated: 3.7 ⭐
  • 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: 26551 ⭐ Ratings
  • Top rated: 4.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 엔코더: 사용 이유와 선택 방법 회전식 또는 샤프트 엔코더는 모터의 위치, 개수, 속도 및 방향에 대한 정보를 제공하는 전기 기계 장치이며 프로그램 가능 로직 제어기(PLC)와 같은 컨트롤러가 있는 응용 … …
  • Most searched keywords: Whether you are looking for 엔코더: 사용 이유와 선택 방법 회전식 또는 샤프트 엔코더는 모터의 위치, 개수, 속도 및 방향에 대한 정보를 제공하는 전기 기계 장치이며 프로그램 가능 로직 제어기(PLC)와 같은 컨트롤러가 있는 응용 …
  • Table of Contents:
엔코더: 사용 이유와 선택 방법
엔코더: 사용 이유와 선택 방법

Read More

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

  • Article author: patents.google.com
  • Reviews from users: 8571 ⭐ Ratings
  • Top rated: 4.8 ⭐
  • 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

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

  • Article author: maxpulse.tistory.com
  • Reviews from users: 40310 ⭐ Ratings
  • Top rated: 3.6 ⭐
  • 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

엔코더로 스마트한 모터 제어를 – MSD(Motion System Design)

  • Article author: www.msdkr.com
  • Reviews from users: 49118 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 엔코더로 스마트한 모터 제어를 – MSD(Motion System Design) 제어·정밀성·효율성 측면에서 더 큰 이점을 지닌 BLDC 모터가 확산되고 … 의 CUI 용량식 엔코더용 AMT Viewpoint 소프트웨어는 개발 속도를 높이고, … …
  • Most searched keywords: Whether you are looking for 엔코더로 스마트한 모터 제어를 – MSD(Motion System Design) 제어·정밀성·효율성 측면에서 더 큰 이점을 지닌 BLDC 모터가 확산되고 … 의 CUI 용량식 엔코더용 AMT Viewpoint 소프트웨어는 개발 속도를 높이고, … 로터리 엔코더는 거의 모든 모션 제어 애플리케이션에 필수적인 요소이지만, 오늘날 그 중요성은 더욱 높아지고 있다. 제어·정밀성·효율성 측면에서 더 큰 이점을 지닌 BLDC 모터가 확산되고 있기 때문이다. 또한 엔코더는 정확한 모션 시스템을 위한 필수 요소로, 더 지능화된 모션 제어에 대한 요구가 높아지는 상황도 엔코더의 가치를 제고시키고 있다. 스마트 모션 구현을 위한 엔코더 기술을 살핀다. 엔코더의 역할은 간단하다. 바로 모터 축의 위치를 시스템 컨트롤러에 정확히 표시하는 것이다. 이 정보를 사용하면 컨트롤러는 모터 권선을 정확하엔코더
  • Table of Contents:
엔코더로 스마트한 모터 제어를 - MSD(Motion System Design)
엔코더로 스마트한 모터 제어를 – MSD(Motion System Design)

Read More


See more articles in the same category here: Top 673 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 반응형

아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16)

안녕하세요? 드디어 엔코더 모터를 제어할 수 있는 드라이버가 출시되었습니다.

출시된지 한 달이나 됬지만, 컴퓨터와 모니터가 고장나는 바람에 아두이노 테스트가 늦었네요.

오늘은 [아두이노로 모터제어하기] 중 엔코더모터 제어 1탄 입니다.

“엔코더 값 읽기 – 속도표시 및 속도제어 – 위치제어” 를 차례대로 해볼까 합니다.

아두이노 초보라서 잘 할 수 있을지 모르겠네요.–;

테스트에 사용할 DMC-16 드라이버와 엔코더모터 입니다.

모터는 사이즈 36파이, 엔코더 2채널 26펄스, 감속비는 1/6 입니다.

엔코더 출력단자에 저항을 연결해서 아두이노에 직접 연결해서 엔코더 신호를 받을 순 있지만,

모터의 제 성능을 발휘하기 위해서는 모터 용량에 맞는 드라이버를 사용해야 합니다.

DMC-16은 DC모터 드라이버/컨트롤러 + 엔코터출력 기능이 있고, 엔코더에 저항을 연결하지 않아도 됩니다.

DMC-16 드라이버는 개발-테스트, 개발-테스트, 수정에 수정을 거듭하여 장인정신으로 빚어낸 녀석입니다.

가장 큰 장점은 엔코더 출력 기능이겠지만, 거기에 추가로

전자브레이크 설정 기능!!!! (모터 정시 신호시 바로 멈춥니다. 정시 상태에서 홀딩 기능은 아닙니다.)

자동 속도 가감속

그리고 순간전류 5A 에서도 작동!!!! -> 이건 나중에 포스팅 하겠습니다.

아래는 메뉴얼 입니다.

일단은 엔코더모터를 테스트 하기 위해서 엔코더 출력값이 잘 나오는지 테스트 해보겠습니다.

모터 제어는 DMC-16 보드에 토글스위치와 외부볼륨을 연결하여 수동으로 정/역회전과 속도조절을 하였습니다.

속도제어 범위는 0 rpm ~ 최대 rpm 까지 조절 가능합니다.

엔코더 값을 출력창에 띄웠습니다.

처음엔 출력 값이 왜 안뜨나 했더니, 출력 창을 따로 띄워야 하더군요,, 전 역시 초보입니다.ㅎㅎ

속도를 올릴수록 Pulse 값이 올라갑니다.

아래 사진에서는 모터 구동방향이 정방향 -> 역방향으로 바뀌었을 때 Pulse 값이 (+)에서 (-) 값으로 바뀝니다.

엔코더 출력 값이 낮아졌다가 점점 올라가는 이유는 :

DMC-16 드라이버 특성상 정/역회전시 자동으로 속도 가감속이 되기 때문입니다.

이렇게 엔코더 출력을 확인하였고, 다음에는 출력값을 이용해서 모터 피드백 제어를 해보려 합니다.

아두이노 카페와 구글을 열심히 찾아봐야 겠네요.ㅎㅎ

*****밑에 코드는 정확하지 않습니다. 참고만 하시고 제어파트는 손님이 하시는거기 때문에

밑에 내용에 대해 책임질 수 없습니다.

코드는 다 이해하지 못했습니다.

해석 가능하신 분들은 댓글 달아주시면 감사하겠습니다.

출처 : 제이케이랜서 님 블로그 http://blog.oshimari.com

const byte encoder0pinA = 2; // A pin -> the interrupt pin 2

const byte encoder0pinB = 4; // B pin -> the digital pin 4

byte encoder0pinALast;

int duration; // the number of the pulses

boolean Direction; // the rotation direction

void setup()

{

Serial.begin(9600); // initialize the serial port

EncoderInit(); // initialize the module

}

void loop()

{

Serial.print(“Pulse:”);

Serial.println(duration);

duration = 0;

delay(100);

}

void EncoderInit()

{

Direction = true; // default -> Forward

pinMode(encoder0pinB,INPUT);

attachInterrupt(0, wheelSpeed, CHANGE); // int.0

}

void wheelSpeed()

{

int Lstate = digitalRead(encoder0pinA);

if((encoder0pinALast == LOW) && Lstate==HIGH)

{

int val = digitalRead(encoder0pinB);

if(val == LOW && Direction)

{

Direction = false; // Reverse

}

else if(val == HIGH && !Direction)

{

Direction = true; // Forward

}

}

encoder0pinALast = Lstate;

if(!Direction) duration++;

else duration–;

}

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