BASIC4MCU | 질문게시판 | 답변 : 모터 엔코더 제어 질문드립니다.
페이지 정보
작성자 master 작성일2022-05-27 19:39 조회302회 댓글1건본문
모터엔코더 를 통해 각도 제어를 해보려고 하는데요
현재 외부인터럽트를 사용하여 스위치 한개는 방향전환 ,
한개는 PWM 출력을 통한 속도제어를 하였습니다
그에 추가하여
엔코더 카운터를 사용하여 한바퀴를 돌리고
엔코더 카운트 값을 시리얼 통신 터미널을 통해 출력을 해보려고 하는데요 .
제가 사용하는 모터 엔코더가 counts per turn 이 128 인 엔코더인데
1체배로 돌리고 있음에도 불구하고 약 엔코더카운트가 13200으로 설정을 하여야 한바퀴에서 멈추고
터미널에서는 엔코더 카운트 통신값도 매번 다르게 나오더라구요.
제가 공부한 바에 따르면 따르면 엔코더 카운트 값이 128에서 한바퀴가 되어야 하는걸로 알고 있는데 어디서 틀린지 모르겠네요ㅠ..
만약 한바퀴에 엔코더 카운트 값이 13200이라 하더라도
13200 의 값이 항상 나오도록 하려는 의도로 작성하였는데 혹시 잘못된 부분이 있다면 지적 가능할까요?
시작한지 얼마안되어 굉장히 지저분하고 부족한 점 죄송합니다.
#include <mega128.h>
#include <stdio.h>
#include <delay.h>
//
char flag1=0,flag2=0;
int encodercount=0;
//
interrupt [EXT_INT6] void SW_0(void){
if(++flag1>3)flag1=0;
//
if(flag2==0){ // 정방향
if(flag1==0){ OCR0= 70; PORTC=~1; }
if(flag1==1){ OCR0=130; PORTC=~2; }
if(flag1==2){ OCR0=180; PORTC=~4; }
if(flag1==3){ OCR0=240; PORTC=~8; }
}
else{ // 역방향
if(flag1==0){ OCR2= 70; PORTC=~1; }
if(flag1==1){ OCR2=130; PORTC=~2; }
if(flag1==2){ OCR2=180; PORTC=~4; }
if(flag1==3){ OCR2=240; PORTC=~8; }
}
encodercount=0;
}
//
interrupt [EXT_INT7] void SW_1(void){ // 정회전,역회전 변환
flag2^=1;
if(flag2){ PORTB=0x11; OCR0=0; }
else { PORTB=0x81; OCR2=0; }
encodercount=0;
}
//
interrupt [EXT_INT1] void enc_0(void){ // 엔코더 카운터 동작
if(PIND.0){ if(encodercount>-256)encodercount--; } //역방향 카운터 1하강
else { if(encodercount< 256)encodercount++; } //정방향 카운터 1상승
//
if(encodercount==128){ PORTB=0x91; OCR0=0; OCR2=0; } // 정방향 한바퀴
if(encodercount== 0){ PORTB=0x91; OCR0=0; OCR2=0; } // 역방향 한바퀴
}
//
interrupt [TIM1_OVF] void enc_1(void){
static char b=0;
b^=1; // 토글
if(b)UDR0=encodercount>>8; // 상위바이트 전송
else UDR0=encodercount&0xFF; // 하위바이트 전송
}
//
void main(void){
DDRB=0xff; // 모터 출력 설정
DDRC=0xff; PORTC=0xff;
DDRD=0x00; PORTD=0x02; // 인터럽트 내부 풀업저항
DDRE=0x00; PORTD=0xC0; // 인터럽트 내부 풀업저항
//
TCCR0=0x6f; TCNT0=100; // PWM 모드 설정 ,1024 분주비
TCCR2=0x6d; TCNT2=100;
TCCR1B=0x03; TIMSK=0x04;
//
UCSR0B=0x18; UBRR0L=103;
//
EICRA=0xAA; EICRB=0xAA; EIMSK=0b11000010; //하강엣지
SREG=0x80;
while(1);
}
모터가 관성에 의해서 돌아갈텐데 OCR=0을 준다고 바로 멈출까요?
댓글 1
조회수 302oreoreo님의 댓글
oreoreo 작성일감사합니다...답변 들으니 아차 싶네요. 다시 공부하겠습니다!