당신은 주제를 찾고 있습니까 “엔코더 모터 속도 제어 – 모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10“? 다음 카테고리의 웹사이트 https://ppa.cazzette.com 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.cazzette.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 프로세서 파크 이(가) 작성한 기사에는 조회수 3,914회 및 좋아요 50개 개의 좋아요가 있습니다.
엔코더 모터는 위에서 말했던 것처럼 위치제어와 속도제어가 요구되는 곳에 사용됩니다. 엔코더에서 나오는 펄스의 개수로 위치제어를 할 수 있으며, 펄스 사이의 시간 간격을 이용하여 속도제어를 할 수 있습니다.
Table of Contents
엔코더 모터 속도 제어 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10 – 엔코더 모터 속도 제어 주제에 대한 세부정보를 참조하세요
동국대학교 전자전기공학부 마이크로 프로세서 실습 20년도 10번째 실습 영상입니다.
로터리엔코더를 이용하여 모터의 바퀴수를 세는 실습을 합니다.
엔코더 모터 속도 제어 주제에 대한 자세한 내용은 여기를 참조하세요.
엔코더 모터 제어 (2. 속도 계산) – 잡동사니 세상 – 티스토리
엔코더 모터를 사용하는 이유 중 하나는 속도 측정을 하기 위함일 것입니다. 회전 속도를 제어하는 것은 로봇의 이동 방향, 행동을 정확하게 한다는 …
Source: pkr7098.tistory.com
Date Published: 6/29/2022
View: 7149
아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16)
“엔코더 값 읽기 – 속도표시 및 속도제어 – 위치제어”를 차례대로 해볼까 합니다. 아두이노 초보라서 잘 할 수 있을지 모르겠네요.–;. 테스트에 사용할 …
Source: m.blog.naver.com
Date Published: 9/12/2022
View: 4359
[기초] 엔코더 제어방식 및 구조 – 봉로그 – Tistory
엔코더 서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는, 광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적 …
Source: bitbong.tistory.com
Date Published: 9/26/2021
View: 9746
엔코더 모터 속도 제어 | 인코더 모터 : 주행 속도 컨트롤 # 28 …
엔코더 모터 제어 (2. 속도 계산) – 잡동사니 세상. 엔코더 모터를 사용하는 이유 중 하나는 속도 측정을 하기 위함일 것입니다. 회전 속도를 제어하는 …
Source: you.1111.com.vn
Date Published: 9/16/2022
View: 5210
Top 26 엔코더 모터 속도 제어 Best 295 Answer
Summary of article content: Articles about 엔코더 모터 제어 (1. 펄스및 위치 측정) PID 제어로 속도 제어 [PID 함수들 만들기 Part 01]) (tistory.com). 서론. 엔코더 …
Source: chewathai27.com
Date Published: 2/18/2021
View: 8671
모터에서 엔코더를 이용한 속도검출 장치 및 그 방법
본 발명은 동기식 엠티(M/T)법을 이용하여 회전속도를 계산하는 장치 및 방법에 관한 것이다. 이를 위하여 본 발명의 장치는 속도제어주기를 발생하기 위한 속도샘플링 …
Source: patents.google.com
Date Published: 3/30/2022
View: 4833
엔코더: 사용 이유와 선택 방법 – Portescap
엔코더는 속도 및 위치지정과 관련하여 정확한 모터 제어를 위한 피드백을 제공합니다. Portescap은 관련 기술을 살펴보고 귀하의 응용 프로그램에 맞는 엔코더를 선택 …
Source: www.portescap.com
Date Published: 8/2/2022
View: 6983
주제와 관련된 이미지 엔코더 모터 속도 제어
주제와 관련된 더 많은 사진을 참조하십시오 모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

주제에 대한 기사 평가 엔코더 모터 속도 제어
- Author: 프로세서 파크
- Views: 조회수 3,914회
- Likes: 좋아요 50개
- Date Published: 2020. 6. 10.
- Video Url link: https://www.youtube.com/watch?v=QyNCeKN0SuQ
엔코더 모터 제어 (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 제어로 속도 제어
준비물
반응형
엔코더 모터 제어 (2. 속도 계산)
반응형
관련글
엔코더 모터 제어 (0. 소개) (tistory.com)
엔코더 모터 제어 (1. 펄스및 위치 측정) (tistory.com)
엔코더 모터 제어 (3. PID 제어로 속도 제어 [PID 함수들 만들기 Part 01]) (tistory.com)
서론
엔코더 모터를 사용하는 이유 중 하나는 속도 측정을 하기 위함일 것입니다. 회전 속도를 제어하는 것은 로봇의 이동 방향, 행동을 정확하게 한다는 의미와도 같죠.
엔코더 모터의 회전 속도를 측정하는 방식은 크게 2가지 방식이 있습니다. M 방식과 T 방식이 있는데, 두 방식은 각각의 장단점이 일치하여 서로 같이 쓴다고도 합니다.
이번 포스트에서는 두 방식에 대한 간단한 설명과 속도 측정 공식, 그리고 M 방식을 사용했을 경우의 코드를 알아볼 예정입니다.
M 방식
T 방식
M 방식 속도 측정
initEXTI0, 1
initTIM2
initRCC
main
EXTI0_IRQHandler
EXTI1_IRQHandler
TIM2_IRQHandler
최종 코드
시연 영상
참고 자료
STM32F103ZET6 Reference Manual
STM32F10xxx/20xxx/21xxx/L1xxxx Cortex®-M3 programming manual
RPM 계산 방법 M/T 방법(M/T Method) (tistory.com)
M 방식
M 방식은 쉽게 말하면 1초동안 몇 바퀴를 회전했는가로 RPM을 계산하는 방식입니다. 좀 더 일반적으로 말하자면 일정 시간(t) 동안 얼만큼의 신호가 들어 왔는가입니다.
M 방식의 장점은 고속에서 유리하다는 점입니다. 반대로 저속에서는 불리하죠.
더보기 만약에 속도가 너무 느려서 2초마다 신호가 하나씩 들어온다고 가정합니다. 하지만 stm32에게 2초는 너무 느려서 1초마다씩만 속도 계산을 할 수 있다고 한다면, 처음 1초에는 신호가 들어 와서 RPM을 계산할 수 있지만, 두 번째 1초에는 신호가 들어 오지 않아 RPM이 0으로 나올 것입니다. 실제로는 2초마다 하나씩 들어와서 RPM이 0이 아니지만요. 따라서 M 방식은 MCU 타이머의 한계로 저속에서는 불리한 방식이라고 할 수 있습니다.
PPR이라는 개념 기억 하시나요? Pulse Per Revolution의 약자로 엔코더를 한 바퀴 돌렸을 때 한 채널에서 발생시키는 신호(펄스)의 개수를 의미합니다. 제가 사용하고 있는 엔코더의 경우 11 PPR호 엔코더를 한 바퀴 돌렸을 때 한 채널에서 11개의 펄스가 발생하죠. A, B 두 채널이 있으니까 총 22개의 펄스가 발생하겠네요.
또한 전 포스트에서 언급한 체배의 개념도 알고 계셔야합니다.
M 방식으로 RPM을 구하는 공식은 다음과 같습니다.
RPM = (60 * edge) / (t * PPR * 체배)
여기서 60은 RPM은 minute 즉, 분 단위를 쓰고 시간 t는 second 초 단위를 사용하기 때문에 이를 변환하는 값입니다.
edge는 단위 시간 동안 들어온 신호의 개수 (rising / falling)입니다.
t는 단위 시간입니다.
PPR은 아실 거예요.
체배는 1체배 방식이면 1, 2체배 방식이면 2, 4면 4를 의미합니다.
저 공식을 일정 주기 t마다 실행시켜 RPM을 계산하면 되는 거죠.
T 방식
T 방식은 M 방식과는 다르게 신호가 들어온 시간 간격을 기준으로 RPM을 계산합니다.
쉽게 말하자면 첫 번째 신호가 들어 오고, 다음 신호가 몇 초 뒤에 들어 오는가를 기준으로 계산하는 거죠.
T 방식은 저속에서 유리합니다. (설명은 참고 자료 사이트에 자세히 나와 있습니다.)
공식은 다음과 같습니다.
RPM = 60 / (PPR * 신호 사이의 시간 간격 * 체배)
M 방식 속도 측정
처음에 저는 T 방식으로 속도를 측정하려 했습니다. 어느정도 잘 측정 되다가 가끔씩 값이 튕기는 현상이 있어서 어쩔 수 없이 M 방식으로 방향을 바꾸게 되었습니다.
순서는 다음과 같습니다.
1. PG0와 PG1에 엔코더 A, B 채널을 연결합니다.
2. PG0와 PG1에 EXTI0, EXTI1을 연결한 후, 인터럽트를 활성화합니다.
3. TIM2를 10 Hz로 맞춰 0.1s 마다 속도 값을 계산합니다.
4. EXTI0, 1 Interrupt handler는 M 방식에서 사용할 pulse값을 카운트 합니다.
5. TIM2 interrupt handler는 pulse 값과 위의 공식을 이용하여 RPM을 계산합니다. 그후 pulse값을 다시 0으로 초기화 합니다.
initEXTI0, 1
M 방식에서는 들어오는 신호의 개수가 많을 수록 정확해지기 때문에 4체배 방식을 이용했습니다.
void initEXTI0(void) { RCC -> APB2ENR |= ((1 << IOPGEN) | (1 << AFIOEN)); GPIOG -> CRL |= (4 << MODE0); AFIO -> EXTICR1 |= (6 << 0); EXTI -> RTSR |= (1 << 0); EXTI -> FTSR |= (1 << 0); EXTI -> IMR |= (1 << 0); NVIC_ISER0 |= (1 << 6); } void initEXTI1(void) { RCC -> APB2ENR |= ((1 << IOPGEN) | (1 << AFIOEN)); GPIOG -> CRL |= (4 << MODE1); AFIO -> EXTICR1 |= (6 << 4); EXTI -> RTSR |= (1 << 1); EXTI -> FTSR |= (1 << 1); EXTI -> IMR |= (1 << 1); NVIC_ISER0 |= (1 << 7); } RTSR, FTSR 둘 모두를 설정하여 Rising, Falling에서 Handler가 동작되도록 설정했습니다. initTIM2 void initTIM2(void) { RCC -> APB1ENR |= (1 << 0); TIM2 -> PSC = 30000 – 1; // 4500 8,000Hz TIM2 -> ARR = 120; // 1 1.25us, 8,000Hz TIM2 -> CNT = 0; TIM2 -> SR = 0; TIM2 -> DIER = (1 << 0); NVIC_ISER0 |= (1 << 28); TIM2 -> EGR |= (1 << 0); TIM2 -> CR1 |= (1 << 0); } TIM2에서는 PSC와 ARR 값을 적절히 조절하여 10 Hz마다 Interrupt가 발생되도록 설정했습니다. initRCC void initRCC(void) { RCC -> CFGR &= ~(7 << MCO); // PLL clock / 2 is selected as MCO RCC -> CFGR |= (1 << USBPRE); // set USB prescaler to 1 RCC -> CFGR |= (7 << PLLMUL); // PLL x9 RCC -> CFGR |= (1 << PLLXTPRE); // HSE divided RCC -> CFGR |= (1 << PLLSRC); //HSE seleted as PLL input clock RCC -> CFGR |= (1 << ADCPRE); // prescaler to 4 RCC -> CFGR &= ~(7 << PPRE1); // no prescaler RCC -> CFGR &= ~(7 << PPRE2); // no prescaler RCC -> CR |= (1 << HSEON); // enable HSE while(!(RCC -> CR & (1 << HSERDY))); // waiting for HSE ready RCC -> CR |= (1 << PLLON); while(!(RCC -> CR & (1 << PLLRDY))); // waiting for PLL ready RCC -> CFGR |= (2 << SW); while(((RCC -> CFGR >> SWS) & 0x03) != (2 << SW)); } CFGR에 적절한 값들을 넣어 TIM2가 연결된 APB1 라인에 36 MHz가 공급하게 하여 TIM2에 36 MHz를 공급했습니다. 그 다음으로 CR을 설정하고, 기다리고를 반복하여 안전하게 RCC가 동작되도록 했습니다. main int main(void) { initRCC(); initEXTI0(); initEXTI1(); initTIM2(); while(1) { // RPM을 출력할 수 있는 적절한 함수 } } EXTI0_IRQHandler void EXTI0_IRQHandler(void) { EXTI -> PR |= (1 << 0); encPulseRPMCnt++; // 엔코더 펄스가 얼만큼 들어 왔는지는 측정하기 위한 변수 /* 회전 방향을 볼려고 한 것이 아니기 때문에 다른 계산은 없습니다. */ }; EXTI1_IRQHandler void EXTI1_IRQHandler(void) { EXTI -> PR |= (1 << 1); encPulseRPMCnt++; // 엔코더 펄스가 얼만큼 들어 왔는지는 측정하기 위한 변수 /* 회전 방향을 볼려고 한 것이 아니기 때문에 다른 계산은 없습니다. */ }; TIM2_IRQHandler void TIM2_IRQHandler(void) { TIM2 -> SR = 0; encRPM = 10 * encPulseRPMCnt / 22; // 위의 공식에 기반한 식 encPulseRPMCnt = 0; };
위의 공식에 따르면 M 방식을 이용할 경우
RPM = (60 * edge) / (t * PPR * 체배) 입니다.
여기서 edge는 encPulseRPMCnt라는 변수로 넣었습니다.
t는 TIM2 자체가 0.1s 주기로 동작하기 때문에 0.1을 넣었습니다.
PPR은 30 * 11이죠
11은 엔코더 자체의 PPR이고
30은 모터가 한 바퀴 돌 때 엔코더가 30 바퀴 돌기 때문입니다. (흔히 엔코더 모터의 ratio라고 하죠)
즉 모터가 한 바퀴 돌 때 엔코더 펄스는 330개가 발생하기 때문에 PPR에 30 * 11을 넣습니다.
저는 4체배 방식을 이용하기 때문에 체배에는 4를 넣고요.
따라서 식은 다음과 같이 쓸 수 있습니다.
RPM = (60 * encPulseRPMCnt) / (0.1 * (11 * 30) * 4)
이를 정리하면 10 * encPulseRPMCnt / 22가 나옵니다.
최종 코드
#include “gpio.h” #include “exti.h” #include “rcc.h” #include “afio.h” #include “tim.h” #include “nvic.h” // =============================================================== volatile unsigned int encPulseRPMCnt = 0; // =============================================================== void EXTI0_IRQHandler(void) { EXTI -> PR |= (1 << 0); encPulseRPMCnt++; }; void EXTI1_IRQHandler(void) { EXTI -> PR |= (1 << 1); encPulseRPMCnt++; }; void TIM2_IRQHandler(void) { TIM2 -> SR = 0; encRPM = 10 * encPulseRPMCnt / 22; encPulseRPMCnt = 0; }; // =============================================================== int main(void) { initRCC(); initEXTI0(); initEXTI1(); initTIM2(); while(1) { // RPM을 출력할 수 있는 적절한 함수 } } // =============================================================== void initEXTI0(void) { RCC -> APB2ENR |= ((1 << IOPGEN) | (1 << AFIOEN)); GPIOG -> CRL |= (4 << MODE0); AFIO -> EXTICR1 |= (6 << 0); EXTI -> RTSR |= (1 << 0); EXTI -> FTSR |= (1 << 0); EXTI -> IMR |= (1 << 0); NVIC_ISER0 |= (1 << 6); } void initEXTI1(void) { RCC -> APB2ENR |= ((1 << IOPGEN) | (1 << AFIOEN)); GPIOG -> CRL |= (4 << MODE1); AFIO -> EXTICR1 |= (6 << 4); EXTI -> RTSR |= (1 << 1); EXTI -> FTSR |= (1 << 1); EXTI -> IMR |= (1 << 1); NVIC_ISER0 |= (1 << 7); } void initTIM2(void) { RCC -> APB1ENR |= (1 << 0); TIM2 -> PSC = 30000 – 1; // 4500 8,000Hz TIM2 -> ARR = 120; // 1 1.25us, 8,000Hz TIM2 -> CNT = 0; TIM2 -> SR = 0; TIM2 -> DIER = (1 << 0); NVIC_ISER0 |= (1 << 28); TIM2 -> EGR |= (1 << 0); TIM2 -> CR1 |= (1 << 0); } void initRCC(void) { RCC -> CFGR &= ~(7 << MCO); // PLL clock / 2 is selected as MCO RCC -> CFGR |= (1 << USBPRE); // set USB prescaler to 1 RCC -> CFGR |= (7 << PLLMUL); // PLL x9 RCC -> CFGR |= (1 << PLLXTPRE); // HSE divided RCC -> CFGR |= (1 << PLLSRC); //HSE seleted as PLL input clock RCC -> CFGR |= (1 << ADCPRE); // prescaler to 4 RCC -> CFGR &= ~(7 << PPRE1); // no prescaler RCC -> CFGR &= ~(7 << PPRE2); // no prescaler RCC -> CR |= (1 << HSEON); // enable HSE while(!(RCC -> CR & (1 << HSERDY))); // waiting for HSE ready RCC -> CR |= (1 << PLLON); while(!(RCC -> CR & (1 << PLLRDY))); // waiting for PLL ready RCC -> CFGR |= (2 << SW); while(((RCC -> CFGR >> SWS) & 0x03) != (2 << SW)); } 시연 영상 저는 USART1을 이용하여 RPM 값을 컴퓨터 화면에 띄웠습니다. 홍보 여자친구를 위한 우리의 특별한 잠옷! (tistory.com) 반응형
아두이노로 엔코더모터 제어하기 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–;
}
[기초] 엔코더 제어방식 및 구조
엔코더
서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는,
광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적으로 사용되고 있습니다.
최근에는 광학식 엔코더가 주류로 제일 많이 사용되고 있습니다.
서보모터용 엔코더의 종류
엔코더의 검출 방식
인크리멘트 방식과 앱솔루트 방식
서보모터에는 엔코더가 장착되어 있습니다 이 엔코더는 모터 위치의 검출,
모터 회전속도의 검출을 실시합니다.
엔코더에는, 인크리멘트 방식과 앱솔루트 방식의 2종류가 있어, 다음과 같은 특징이 있습니다.
엔코더의 구조
아래 그림에, 검출기로서 제일 많이 사용되고 있는 엔코더의 구조를 나타냅니다.
제어 방식
인버터, AC서보 제어 방식에는, 주로 아날로그 전압 등으로 모터의 회전속도를 제어하는
속도제어, 간단한 리미트 스위치나 고정밀의 엔코더 등을 사용해 모터의 회전량을 제어하는
위치제어, 서보모터에 흐르는 전류를 제어해 토크가 항상 어느 일정한값을 유지하도록
제어하는 토크제어의 3방식이 있습니다.
-속도제어-
① 오픈루프 제어
범용 인버터 등과 같이, 속도의 피드백
이 없는 제어 방식입니다.
지령 방식은 아날로그 전압 지령으로
컨베이어 반송 속도의 제어나 팬,
펌프의 풍량, 유량제어 등 많은 용도에
사용됩니다.
정격 토크에서의 슬립은 모터의 특성에 의하는데 약 3~5%정도의 속도 변동이 있습니다.
최근의 인버터는, 디지털 제어에 의해 내부에서 속도 데이터를 설정하거나 디지털 지령
(펄스열, 패러넬 데이터, 통신)에 의해 지령을 설정하고 온도 드리프트의 영향을 받지 않게
되었습니다. 또한, 어드밴스드 자속 벡터제어의 인버터 등 속도 변동율이 1%이하의 것도
있습니다. 인버터의 경우, 대부분이 이 속도제어 방식에서 사용됩니다
② 클로즈드루프 제어
모터의 속도의 변동을 보상하기 위해서는,검출기를 설치 실제의 속도를 검출해 제어회로에
피드백을걸어둡니다, 이 방식을 클로즈드 루프 제어라고 합니다.
검출기로서는, TG(타코제네레이터), 엔코더 등이 있는데 최근에는, 엔코더가 많이 사용
인버터나 서보 어느 쪽을 사용할지는 시스템의 요구에 대해 필요한 토크를 낼 수 있는지,
또 속도제어 범위를 커버할 수 있을지 아닐지 여부로 기종을 선정합니다.
속도제어 범위의 표현에서는, 175r/min~1750r/min(1 : 10~1 : 1000)등과 같이 표현합니다.
또 클로즈드 루프 속도 지령을 아날로그
(전압 또는, 전류)를 이용하는데 이 외 ,펄스열을 입력하는 방식이나
디지털 입력의 방식도 있습니다,
드로우 운전이나 전속 운전 등 정밀도가 높은 속도제어도 할 수 있습니다.
-위치제어-
모터 회전속도를 제어하면서, 거기다가 정지 위치를 목표로 하는 위치에 세우는 제어를
위치제어라고 합니다. 정지 신호에 외부 센서 신호를 받아 들여 목표 위치에 세우는 간단한
방식에서부터, 모터에 엔코더를 붙이고 고정밀의 위치결정을 실시하는 방식,
또 항상 변동하는 정지 목표 위치에 추종이나 동기 하면서 위치결정을 실시하는
고기능이 갖춘 것까지 많은 제어 방식이 있습니다.
① 오픈루프 제어
너무 높은 정지 정밀도를
필요로 하지 않는
용도에서는, 정지 목표
위치의 앞에 감속
지령용의 리미트 스위치를
마련하여, 이 신호에 의해
모터가 감속 정지하는 방법입니다. 감속 포인트의 불균형이 정지 위치 정밀도를 좌우합니다.
그리고 제일 간단한 염가의 방법입니다.
② 세미 클로즈드루프 제어
모터에 설치된 엔코더에서
피드백을 실시합니다.
예를 들어 서보앰프에 입력된
지령분만큼 서보모터가
움직여 피드백이 귀환됩니다.
이 때 입력된 지령량과 피드백
량의 차이는, 반드시“0”이 되도록 제어됩니다. 구성이 간단하고 응답도 거론되기 때문에
서보의 경우에는 이 방식이 일반적입니다.
③ 풀-클로즈드루프 제어
기계 측에 설치된 검출기(리니어 스케일, 엔코더 등)로부터 피드백하여 제어합니다.
검출기가 최종 기계단에 설치했기 때문에, 백래시나 기계계의 오차의 영향을 받지 않고
고정밀의 위치결정 을 할 수가 있습니다. 하지만 반면, 기계 강성을 높여 둘 필요가 있습니다.
일부의 공작기계 등 고정밀의 제어의 경우에 사용되는 일이 있습니다.
-토크제어-
토크제어란, 모터가 내는 토크(전류)를 제어하는 것이어 토크제한과는 다릅니다.
그러나 용도에 따라서는, 어디라도 사용 가능한 경우도 있기 때문에 시스템에 최적인
방법을 선택합니다. 토크제어는, 토크 지령값에 대한 토크(전류)를 제어하므로,
부하 토크가 작으면 자동적으로 속도는 상승하고, 크면 속도는 하강, 동일하면 토크는 어울려,
속도는 0, 즉 모터는 정지합니다. 요컨데 줄다리기와 같은 원리입니다.
이것에 대해 토크제한이란, 위치나 속도제어시에 필요 이상의 토크를 내면 기계 파손의 가능성
이 있는 경우나 기계를 눌러서 정지시키는 경우, 메카 록을 실시하고자 할 때에
토크 제한을 걸칩니다. 토크제어는, 모터에 흐르는 전류를 검출하여 제어할 필요가 있기 때문에
전류 검출을 실시하고 있는 벡터 인버터, 서보로 대응할 수가 있습니다.
① 오픈루프 제어
토크 정밀도를 그다지 필요로 하지 않는 권출(풀기), 권취(감기)축 등의 용도에 사용됩니다.
토크의 지령으로서는 아날로그 지령이 일반적입니다.
이러한 제어의 경우에는, 온도에 의해 토크의 정밀도가 변화하는(온도 드리프트) 일이나
기계의 로스 등도 고려해 둘 필요가 있습니다.
② 클로즈드루프 제어
장력의 정밀도가 요구되는 용도(종이, 필름 등)의 권출(감기), 권취(감기)축 등의 용도에
사용됩니다. 실제의 제품에 걸리는 장력을 검출해 장력제어 장치에 피드백하는 방식입니다.
엔코더 모터 속도 제어 | 인코더 모터 : 주행 속도 컨트롤 # 28 161 개의 자세한 답변
당신은 주제를 찾고 있습니까 “엔코더 모터 속도 제어 – 인코더 모터 : 주행 속도 컨트롤 # 28“? 다음 카테고리의 웹사이트 you.1111.com.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://you.1111.com.vn/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 양세훈 이(가) 작성한 기사에는 조회수 2,235회 및 좋아요 23개 개의 좋아요가 있습니다.
엔코더 모터는 위에서 말했던 것처럼 위치제어와 속도제어가 요구되는 곳에 사용됩니다. 엔코더에서 나오는 펄스의 개수로 위치제어를 할 수 있으며, 펄스 사이의 시간 간격을 이용하여 속도제어를 할 수 있습니다.
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
1) 인코더가 장착되어 있는 모터 2 개의 속도를 같게 하여 자동차가 직진 주행하도록 하는 방법 입니다.
2) 가성비 좋은 모터 드라이버 # 26 : TB6612 : https://www.youtube.com/watch?v=VuZn7mnl2hU
3) 모터 속도 측정 방법 : 옵토 인터럽터 (자동차 직진 주행) # 27 : https://www.youtube.com/watch?v=4vP4JLg4BaQ
엔코더 모터를 사용하는 이유 중 하나는 속도 측정을 하기 위함일 것입니다. 회전 속도를 제어하는 것은 로봇의 이동 방향, 행동을 정확하게 한다는 …
+ 더 읽기
Source: pkr7098.tistory.com
Date Published: 5/21/2022
View: 992
“엔코더 값 읽기 – 속도표시 및 속도제어 – 위치제어”를 차례대로 해볼까 합니다. 아두이노 초보라서 잘 할 수 있을지 모르겠네요.–;. 테스트에 사용할 …
+ 여기에 보기
Source: m.blog.naver.com
Date Published: 10/30/2022
View: 5543
엔코더 서보모터의 회전방향을 포함한 회전속도 및 회전각도를 정확하게 알기 위한 검출기로서는, 광학식 엔코더, 자기식 엔코더, 리졸버 등이 일반적 …
+ 더 읽기
Source: bitbong.tistory.com
Date Published: 10/8/2021
View: 4601
본 발명은 동기식 엠티(M/T)법을 이용하여 회전속도를 계산하는 장치 및 방법에 관한 것이다. 이를 위하여 본 발명의 장치는 속도제어주기를 발생하기 위한 속도샘플링 …
+ 여기를 클릭
Source: patents.google.com
Date Published: 11/16/2021
View: 4869
목표> – 엔코더가 장착된 모터를 아두이노로 제어해서 사용해보자. 아두이노 공식 홈페이지에서 로터리 엔코더 사용에 대해 설명한 페이지를 우선 …
+ 여기에 표시
Source: diyver.tistory.com
Date Published: 9/11/2021
View: 7134
아두이노 나노로 모터 2개의 엔코더 입력에 문제없음을 확인함 (DC Mouse 2 참조) … 직진 구간에서는 벽에 부딪히지 않도록 양쪽 바퀴의 속도 제어를 …
+ 여기를 클릭
Source: maxpulse.tistory.com
Date Published: 7/3/2021
View: 908
엔코더는 속도 및 위치지정과 관련하여 정확한 모터 제어를 위한 피드백을 제공합니다. Portescap은 관련 기술을 살펴보고 귀하의 응용 프로그램에 맞는 엔코더를 선택 …
+ 여기에 보기
Source: www.portescap.com
Date Published: 12/14/2021
View: 3776
주제와 관련된 더 많은 사진을 참조하십시오 인코더 모터 : 주행 속도 컨트롤 # 28. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
– 엔코더가 장착된 모터를 아두이노로 제어해서 사용해보자.
아두이노 공식 홈페이지에서 로터리 엔코더 사용에 대해 설명한 페이지를 우선 첨부해본다.
필요한 경우 방문을 하면 되겠다.
playground.arduino.cc/Main/RotaryEncoders/
모터의 회전축에 엔코더 모듈을 부착하여 회전여부를 측정할 수 있다.
엔코더는 크게 두가지 원리가 있다.
인크리멘탈 방식과 앱솔루트 방식이 두개가 있는데, 우리가 흔히 쓰는 방식은 앱솔루트 방식이다.
인크리멘탈 방식
인크리멘탈 방식은 위와같이 발광소자와 수광소자를 통해서 빛을 감지하는 것으로 회전수를 측정할 수 있는 것이다.
성능이 떨어지며, LED를 한개만 사용하면 회전 방향도 알 수 없다.
서로 다른 파장의 LED를 사용한다면 정확도가 증가하고 회전방향도 알 수 있다.
하지만 분해능이 확실히 떨어진다.
앱솔루트 방식
앱솔루트 방식은 인크리멘탈보다 정밀한 성능을 보여준다.
디스크에 슬릿이 서로다른 패턴으로 규칙적으로 있으며,
발광소자의 빛이 디스크에 나있는 구멍을 통해 검출기에 도달하면 그 신호를 이진 데이터로 변환하여 회전량을 알 수 있게 한다.
발광다이오드가 많으면 많을 수록 분해능이 더 좋다고 할 수 있으며,
패턴 비교를 통해 정방향 역방향을 알 수 있다.
앱솔루트 방식의 경우 무조건 빛으로만 신호를 검출하는 것이 아니라,
마그네틱 – 홀자기 센서를 이용해서도 회전량을 측정할 수 있다.
전자기 유도 법칙을 이용하여 코일이 있는 부분에 자석이 지나가면서 전기신호가 발생하는 것을 감지하는 것이다.
인크리멘탈 방식과 앱솔루트 방식에서 신호를 간단히 하자면 위와 같이 검출이 된다.
신호의 패턴을 통해서 정방향과 역방향으로의 회전을 감지할 수 있으며,
얼마나 많이 회전했는지도 알 수 있다.
앱솔루트 방식의 경우 모터가 가리키고 있는 방향도 패턴을 통해 알 수 있다는 것 역시 큰 장점 중 하나이다.
아두이노에서는 위와같은 신호를 통해서 회전수와 방향을 알 수 있는 것이다.
엔코더에 대해서 더 정확하게 이해하고 싶다면 아래 글을 참고하면 되겠다.
elecs.tistory.com/181
– 아두이노(우노, 나노, 메가), 엔코더 장착된 N20 모터, [모터드라이버(L298N, L9110)]
– 모터 드라이버는 있어도 되고, 없어도 되고…
C1 과 C2 는 아두이노 디지털 핀과 연결
VCC와 GND 에는 아두이노의 +5V와 GND를 연결
M1과 M2 는 모터의 양 극으로 모터드라이버에 연결하거나
아두이노의 전원단에 각각 연결해줘도 무방하다.
N20 모터의 엔코더는 홀-자기센서로 카운팅 한다.
성능은 나름 정교한 편
각도로치면 25도 정도 분해능을 가지고 있다.
int val; int encoder0PinA = 3; int encoder0PinB = 4; int encoder0Pos = 0; int encoder0PinALast = LOW; int n = LOW; void setup() { pinMode (encoder0PinA, INPUT); pinMode (encoder0PinB, INPUT); Serial.begin (9600); } void loop() { n = digitalRead(encoder0PinA); if ((encoder0PinALast == LOW) && (n == HIGH)) { if (digitalRead(encoder0PinB) == LOW) { encoder0Pos–; } else { encoder0Pos++; } Serial.print (encoder0Pos); Serial.println (“/”); } encoder0PinALast = n; }
엔코더가 회전하면서 회전수가 1씩 증가하는 결과를 확인할 수 있다.
코드를 해석해보자.
n에 현재의 pinA 와 pinB의 신호를 읽어 오는데,
현재 pinA의 신호가 HIGH 이면서 이전 pinA의 신호는 LOW 일때
회전을 하는 것을 감지한 것으로 판단한다.
어느방향으로 회전하는지 판단하지 위해서 pinB의 신호를 확인하는 작업을 거친다.
pinB 에서 신호가 감지되는지 안 되는지에 따라서 회전 방향을 판단한다.
웃긴 결과를 확인할 수 있었는데
-32768 보다 더 회전하게 되면
엔코더 수치가 32767 로 시작해서 감소하게 된다.
이 현상은 엔코더 수치를 저장하는 변수가 int 이기 때문이다.
회전수가 많다면 long 변수에 저장해주는것이 좋다.
N20 모터의 경우 shaft가 1회전을 할때 엔코더는 8만큼 증가하게 된다.
만약 감속비가 1/50 이라면
N20 모터가 회전을 50번 했을 때, 최종 회전은 1번이 된다.
엔코더가 400만큼 카운트 했을 때, 1번씩 회전을 했다는 뜻이다.
위에서 사용한 코드는 테스트용도이지 실제로 엔코더를 저렇게 사용하면 안 된다.
왜냐하면 다른 센서를 사용하게 되면 측정을 제대로 못 하기 때문이다.
다른 센서의 신호를 받아오는 와중에도 모터는 회전하고 있고, 그 신호를 감지 못하고 흘려보내게 된다.
그러면 어떻게 해야 제대로 모터 엔코더를 사용할 수 있는 것일까?
이미 해답은 그전에도 다뤘었었다.
바로 입출력 인터럽트를 사용하는 것이다.
신호의 변화를 감지하는 것이 인터럽트의 기본적인 발동조건인데
엔코더의 원리가 신호의 변화이기 때문이다.
#define encoder0PinA 2 #define encoder0PinB 4 volatile long encoder0Pos = 0; void setup() { pinMode(encoder0PinA, INPUT); //digitalWrite(encoder0PinA, HIGH); // turn on pull-up resistor pinMode(encoder0PinB, INPUT); //digitalWrite(encoder0PinB, HIGH); // turn on pull-up resistor attachInterrupt(0, doEncoder, RISING); // encoder pin on interrupt 0 – pin 2 Serial.begin (9600); Serial.println(“start”); // a personal quirk } void loop() { // do some stuff here – the joy of interrupts is that they take care of themselves } void doEncoder() { /* If pinA and pinB are both high or both low, it is spinning forward. If they’re different, it’s going backward. For more information on speeding up this process, see [Reference/PortManipulation], specifically the PIND register. */ if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) { encoder0Pos++; } else { encoder0Pos–; } Serial.println (encoder0Pos, DEC); } /* See this expanded function to get a better understanding of the meanings of the four possible (pinA, pinB) value pairs: */ void doEncoder_Expanded() { if (digitalRead(encoder0PinA) == HIGH) { // found a low-to-high on channel A if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos – 1; // CCW } else { encoder0Pos = encoder0Pos + 1; // CW } } else // found a high-to-low on channel A { if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos – 1; // CCW } } Serial.println (encoder0Pos, DEC); // debug – remember to comment out // before final program run // you don’t want serial slowing down your program if not needed }
코드는 아두이노 공식 홈페이지에서 제공하는 것을 살짝만 수정하였다.
결과를 보면 아래와 같은데
이상한 점이 있다.
잘 되는 것 처럼 보이지만 역방향으로 회전하지 않았음에도 불구하고
엔코더가 잘 못 카운팅 되는 현상이 발생하는 것이다.
왜 그런 것인지 정확히 알 수 없지만
아두이노의 입출력 인터럽트는 문제가 있는 것 같다.
정확하게 안 되고, 채터링 현상이 발생하는 것 같다.
실제 신호는 왼쪽과 같아야 하지만
확대해서 보면 오른쪽과 같이 신호의 떨림에 의해서 잘못된 신호가 감지되는 것이다.
입출력 인터럽트를 많이 사용해봤지만
아두이노는 확실히 이론대로 인터럽트를 사용하기에는 부족함이 있는 것 같아 보인다.
다른 방법으로 해결해도록 하자.
코드를 조금 더 명확하게 해서 인터럽트 발생시 정확하게 카운트를 할 수 있게 해보자.
#define encoder0PinA 2 #define encoder0PinB 4 volatile long encoder0Pos = 0; void setup() { pinMode(encoder0PinA, INPUT); //digitalWrite(encoder0PinA, HIGH); // turn on pull-up resistor pinMode(encoder0PinB, INPUT); //digitalWrite(encoder0PinB, HIGH); // turn on pull-up resistor attachInterrupt(0, Int_A, CHANGE); // encoder pin on interrupt 0 – pin 2 Serial.begin (115200); Serial.println(“start”); // a personal quirk } void loop() { Serial.println(encoder0Pos); // do some stuff here – the joy of interrupts is that they take care of themselves } void Int_A() { if (digitalRead(encoder0PinA) == HIGH && digitalRead(encoder0PinB) == LOW) encoder0Pos = encoder0Pos+1; else if (digitalRead(encoder0PinA) == LOW && digitalRead(encoder0PinB) == HIGH) encoder0Pos = encoder0Pos+1; else if (digitalRead(encoder0PinA) == HIGH && digitalRead(encoder0PinB) == HIGH) encoder0Pos = encoder0Pos-1; else if (digitalRead(encoder0PinA) == LOW && digitalRead(encoder0PinB) == LOW) encoder0Pos = encoder0Pos-1; } void doEncoder() { /* If pinA and pinB are both high or both low, it is spinning forward. If they’re different, it’s going backward. For more information on speeding up this process, see [Reference/PortManipulation], specifically the PIND register. */ if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) { encoder0Pos++; } else { encoder0Pos–; } Serial.println (encoder0Pos, DEC); } /* See this expanded function to get a better understanding of the meanings of the four possible (pinA, pinB) value pairs: */ void doEncoder_Expanded() { if (digitalRead(encoder0PinA) == HIGH) { // found a low-to-high on channel A if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos – 1; // CCW } else { encoder0Pos = encoder0Pos + 1; // CW } } else // found a high-to-low on channel A { if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way // encoder is turning encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos – 1; // CCW } } Serial.println (encoder0Pos, DEC); // debug – remember to comment out // before final program run // you don’t want serial slowing down your program if not needed }
카운트가 역행하지않고 정상적으로 카운트 되는 것을 확인할 수 있었다.
위의 코드를 사용하니 실제 모터의 shaft가 1회전 할 때, 14만큼 증가하는 것을 확인할 수 있었다.
이정도 코드만 있어도 엔코더가 장착된 모터를 사용하는데 전혀 지장이 없을 것이다.
※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!
Top 26 엔코더 모터 속도 제어 Best 295 Answer
모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10
모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10
엔코더 모터 제어 (0. 소개)
Article author: pkr7098.tistory.com
Reviews from users: 14684 Ratings
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. 소개)
Read More
엔코더 모터 제어 (1. 펄스및 위치 측정)
Article author: pkr7098.tistory.com
Reviews from users: 10004 Ratings
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. 펄스및 위치 측정)
Read More
아두이노로 엔코더모터 제어하기 1탄 (드라이버 : DMC-16) : 네이버 블로그
Article author: m.blog.naver.com
Reviews from users: 32821 Ratings
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) : 네이버 블로그
Read More
[기초] 엔코더 제어방식 및 구조Article author: bitbong.tistory.com
Reviews from users: 2416 Ratings
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
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
Ratings Top rated: 4.8
Lowest rated: 1
Summary of article content: Articles about KR19980033797A – 모í°ìì ìì½ë를 ì´ì©í ìëê²ì¶ ì¥ì¹ ë° ê·¸ ë°©ë²
– Google Patents 본 발명은 동기식 엠티(M/T)법을 이용하여 회전속도를 계산하는 장치 및 방법에 관한 것이다. 이를 위하여 본 발명의 장치는 속도제어주기를 발생하기 위한 속도샘플링 … …
– 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)ë¡ êµ¬ì±ëë¤.
ë°ë¼ì ëª¨í° ì ì´ìì¤í ìì ë먹ì ì ë³´ì ê²ì¶ ë©ì¹´ëì¦ì ì¼ê´ì±ìê² ì ì§íë¯ë¡ì¨ ìì¤í ì ì íì±ì í¥ììí¬ ì ìì¼ë©°, ì´ì ë°ë¼ ì í¥ ë먹ì ì ì´ ë±ì ì ì´ ìê³ ë¦¬ì¦ ì¬ì©ì ìì¤í ì ì±ë¥ì í¥ììí¬ ì ìë¤.
– 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
Read More
DC Mouse 3. 아두이노 DC 모터 PID 제어
Article author: maxpulse.tistory.com
Reviews from users: 40310 Ratings
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 제어
Read More
엔코더로 스마트한 모터 제어를 – MSD(Motion System Design)
Article author: www.msdkr.com
Reviews from users: 49118 Ratings
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)
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 제어, 엔코더 모터 아두이노 연결, 엔코더 모터 아두이노, 엔코더 모터 원리, 엔코더모터 드라이버, 엔코더 모터 위치제어
엔코더: 사용 이유와 선택 방법
엔코더는 속도 및 위치지정과 관련하여 정확한 모터 제어를 위한 피드백을 제공합니다. Portescap은 관련 기술을 살펴보고 귀하의 응용 프로그램에 맞는 엔코더를 선택하는 방법을 설명합니다.
의료용 주입 장치에서 펌프가 이루어질 때마다 정확한 양의 인슐린이 전달되도록 하거나 제조 조립에 사용되는 로봇 팔이 적시에 정확한 지점으로 이동하도록 하려면 전기 모터를 엔코더와 결합해야 합니다. 회전식 또는 샤프트 엔코더는 모터의 위치, 개수, 속도 및 방향에 대한 정보를 제공하는 전기 기계 장치이며 프로그램 가능 로직 제어기(PLC)와 같은 컨트롤러가 있는 응용 프로그램에 연결됩니다 PLC는 일반적으로 ‘피드백’으로 알려진 엔코더의 정보를 사용하여 모터 제어의 높은 정확도를 보장합니다.
엔코더 기술
엔코더의 두 가지 주요 유형은 증분형 및 절대형으로 알려져 있습니다. 증분형 엔코더는 실시간 피드백을 식별하며, 특정 지점을 참조하기보다는 위치 및 방향 변경과 관련된 정확한 동작을 추적합니다. 지속적으로 높고 낮은 피드백 펄스를 사용하여 위치 간의 상대적 이동에 대한 피드백을 제공하여 이를 달성합니다. 절대형 엔코더는 정확한 위치를 보여주지만 복잡성이 증가하여 더 많은 비용이 듭니다. 즉, 증분형 엔코더가 대부분의 응용 프로그램에서 더욱 비용 효율적이라는 것을 의미합니다. 응용 프로그램별 통합 회로(ASIC)와 같은 증분형 엔코더 인터페이스를 추가하면 정확한 위치 참조 기능을 추가할 수도 있습니다.
한편, 자기 엔코더는 둘레를 둘러싼 다수의 극을 가진 자화된 디스크로 구성됩니다. 디스크가 회전할 때 센서는 전압 변화를 감시하는 홀 효과 장치로 측정한 것과 같은 자기장의 변화를 감지합니다. Portescap MR2와 같은 자기 엔코더는 충격이나 침투 가능성을 갖고 있는 까다로운 응용 프로그램에 사용하기에 이상적입니다. 예를 들어 MR2 자기 엔코더는 온도에 민감하지 않으며 원치 않는 외부 필드에 대한 민감도가 낮습니다.
엔코더 작동 원리
엔코더는 회전하면서 일반적으로 90도 역상인 A와 B라는 두 개의 사각파 출력을 생성합니다. A및 B 출력의 위상 시프트를 측정하여 엔코더의 방향을 결정할 수 있습니다. 이동 거리 또는 속도를 측정하려면 엔코더의 해상도도 고려해야 합니다. 해상도는 듀티 사이클 또는 주기라고도 하는 샤프트의 360도 회전 내 측정 지점의 수입니다. 일반적으로 회전당 라인(LPR) 또는 회전당 펄스(PPR)라고 하는 포인트 수가 많을수록 측정 정확도가 높아집니다. 예를 들어 Portescap의 M-Sense 자기 엔코더는 콤팩트한 디자인으로 회전당 최대 1,024개의 라인을 제공합니다.
각각의 출력 A와 B는 높거나 낮게 전환됩니다. 따라서 2비트의 정보는 각 라인 또는 펄스에 대해 4배의 카운트를 생성하며 이를 직교 위상 디코딩이라고 합니다. 따라서 직교 위상 디코딩은 해상도를 최대 4배까지 높일 수 있습니다. 예를 들어 Portescap MR2 엔코더의 512개 라인을 2048 카운트 또는 각 단계로 바꿀 수 있습니다. 두 개의 A 및 B 출력 채널 외에도 기준 위치를 결정하는데 사용할 수 있는 세 번째 채널 Z가 포함되는 경우가 있습니다.
엔코더가 사용되는 곳
엔코더가 모터 제어를 위한 피드백을 제공하는 방법을 이해하면 엔코더의 사용이 다양한 응용 프로그램에서 얼마나 중요한 지 알 수 있습니다. 기존 방식대로의 인슐린 투여를 예시로 들어보겠습니다. 약물 전달 시스템에서는 지정된 비율로 정확한 양의 약물을 분사해야 하며 엔코더를 사용하여 정확한 용량이 전달되는지 확인합니다. 이 예시에서는 또한 엔코더 해상도를 높이기 위한 라인 수가 많을수록 가장 정확한 흐름 속도를 보장하는 데 어떻게 도움이 되는지 보여줍니다.
예를 들어, 로봇 그리퍼를 제조에 사용하여 상대적으로 섬세한 부품을 처리할 수 있습니다. 구성 요소의 손상을 방지하기 위해 올바른 압력과 속도를 사용하여 구성 요소를 올바르게 처리하는 것이 핵심입니다.엔코더 덕분에 로봇 그리퍼의 기능은 모터가 처리하는 각 구성 요소에 따라 모터의 속도와 위치를 모션 제어하여 최적화됩니다. 마찬가지로 전자 장비 조립에 사용되는 장착 응용 프로그램에도 PCB 구성 요소의 크기와 무게를 빠르고 반복적으로 감지하여 정밀하게 배치하기 위해 고속 모션 제어가 필요합니다. 엔코더는 이와 같이 속도가 빠르면서도, 높은 정확도의 제어를 가능하게 하여 생산성과 제조 품질을 보장합니다.
엔지니어에게 문의
키워드에 대한 정보 엔코더 모터 속도 제어
다음은 Bing에서 엔코더 모터 속도 제어 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10
- 마이크로프로세서
- MSP430
- msp430f5529
- 로터리 엔코더
- 엔코더
모터 # #바퀴 #수를 #엔코더로 #세어보자! #/ #마이크로 #프로세서 #실습 #20-10
YouTube에서 엔코더 모터 속도 제어 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 모터 바퀴 수를 엔코더로 세어보자! / 마이크로 프로세서 실습 20-10 | 엔코더 모터 속도 제어, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.