회원가입 ID/PW 찾기
AA

수고가 많으십니다.

모터가 구동할때 엔코더 신호를 받아서 현재속도를 측정하고 측정된 현재속도로 모터를 원하는 목표속도로 구동하게 하는 코딩을 짜보았습니다.

atmega128과 avr studio를 쓰고 있습니다.

공부한지 한달정도 되었는데 아직 어렵기만 하네요

제가 짜놓은 코딩입니다.

 

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define F_CPU 1600000UL
#include <util/delay.h>

unsigned char p_cut=0x00;
unsigned char p_duty0=0x00;
volatile unsigned int count=0;
volatile unsigned int present_speed=0, object_speed=255;
volatile unsigned int speed_err=0;

ISR(TIMER1_COMPA_vect){  //B포트의 5번포트에 출력이 걸릴때 모터 드라이버에는 1번포트에
if(p_duty0>=p_cut)       //pwm이 들어가야하므로 1번포트로 바꿔주는 코딩
PORTB=0x01;
else
PORTB=PORTB&(~0x01);

p_cut++;
}

 

void init_Port(void)
{
DDRB=0xff;
PORTB=0x00;
}

void init_Timer(void)  //타이머 초기화
{
cli();
TCCR1A=0x69;
TCCR1B=0x69;
OCR1AH=0x00;
OCR1AL=0x02;
TIMSK=0x10;            //인터럽트 호출
TIFR=0x04;
SREG|=0x80;
sei();
}
int main(void)
{
init_Port();
init_Timer();
p_duty0=25;            //초기 속도를 25로 줌
RTIHan();              //speed_error를 불러주는 함수 호출
while(1){}
}


void ex_int(void)
{
EIMSK=0x01;
EICRA=0x01;
}

ISR(INT0_vect)         //외부인터럽트 부분
{                      //엔코더신호를 D포트의 1번포트에 받음
if((PIND &0b01000000) == 0b01000000)
count=count+1;         //엔코더신호가 펄스신호가 들어올때 count변수를 1증가시킴
PORTD=0b00110000;
if(!(PIND&0b01000000) == 0b01000000)
count=count-1;
PORTD=0b00001100;
}

//void RTIHan() __attribute__ ((interrupt ()));
void RTIHan(void)
{
  present_speed = count/500/256;    //  v(cm/s) = (펄스수 * 100) / 16ms   //count변수가 증가할때 현재속도를 계산함
   speed_err = object_speed - present_speed;          
   if(speed_err > 0)                //현재속도가 목표속도보다 작을때 듀티비를 올려줌  
   p_duty0 = p_duty0 + speed_err;
   else if(speed_err == 0)
   p_duty0 = p_duty0;
   else if(speed_err < 0)           //현재속도가 목표속도보다 클때 듀티비를 줄여줌
   p_duty0 = p_duty0 - speed_err;

  
  count = 0;   // 엔코더 펄스 카운트한것을 리셋            
 _delay_ms(10);
  }

 

질문이 있습니다.

첫째, 메인함수에서 speed_error값을 불러주기 위해 void함수인 RTIHan함수를 호출하였는데 이런 방식이 맞는건가요?  실시간으로 엔코더값을 받아서 speed_error값을 계속 바꿔주어야하는데 RTIHan함수를 인터럽트함수로 지정하여야   하나요? 아님 void 함수로 지정하여도 실시간으로 값을 계속 받아올수 있는건가요?


둘째, 엔코더 신호를 외부인터럽트로 받고 있습니다.  ISR외부 인터럽트 함수로 지정하였는데 이때 증가하는 count값을 다른  함수(RTIHan함수)에서 불러올때 그냥 count변수를 써주면 불러진건가요? 아님 그함수안에서 별도의 지정을 해주어야 하는 건가요?


셋째,  엔코더 펄스 카운트한것을 오버플로우가 걸릴때 다시 0을 만들어주어야 한다고 알고 있는데 어느 함수부분에 적어주어야    할까요?


질문이 좀 길어졌네요.,. 주위에 avr을 쓰는 사람이 없어 당근이카페에 올려봅니다.

즐거운 하루 되시구요 많은 조언 부탁드립니다.

댓글 4
  • No Profile
    한달만에 이렇게 할수있나요 ....꾸준히 안해서 그런지 ... 님이 부럽습니다.
  • No Profile

     타이머 인터럽트를 하나 걸어서, 메인제어 주기를 관리해줄 필요가 있습니다. RTIHan 함수는 그 타이머 인터럽트에서 호출하면 될거 같구요. 그리고 타이머 인터럽으로 실행시킬때는 RTIHan 함수의 마지막 부분에 위치한 딜레이문은 제거해 주시기 바랍니다.

  • No Profile
    그리고 두번째와 세번째 질문은 데이터 시트나 서적을 조금만 더 자세히 보신다면 스스로 해결이 가능하실겁니다.
  • No Profile
    모터 제어 하는거 힘들던데 대단 ㅠ

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
66 펌웨어 & 코딩언어 HOT텍트로닉스(tektronix) 오실로스코프 질문드려요~~1 파괴지왕 1168 2010.06.24
65 펌웨어 & 코딩언어 HOTspice 프로그램을 만들고 싶습니다1 TreeOfDream 978 2010.06.21
64 펌웨어 & 코딩언어 HOTC언어 초보에요 ㅠㅠ 이쪽부분 간소화할려고하는데..조언좀..11 다크소마 1448 2010.06.19
63 펌웨어 & 코딩언어 HOTMFC 를 공부중입니다 API를 시작해야 하는데..3 TreeOfDream 1122 2010.06.11
62 펌웨어 & 코딩언어 HOT펌웨어 엔지니어입니다. 윈도우응용프로그램 MFC하고싶은데...6 상하이찬 1569 2010.06.02
61 펌웨어 & 코딩언어 HOT리눅스 기반 어셈블리어 작성했는데 자꾸 'command not found'라 뜨네요......2 하늘위의 성 1408 2010.05.30
60 펌웨어 & 코딩언어 HOT코드비젼 소스 설명좀 부탁드립니다 ㅠㅠ1 vsvm 2190 2010.05.24
59 펌웨어 & 코딩언어 HOT맥스포사의 mtm-cm3000 으로 리모콘 모듈이 조종 가능한가요? 철방이 880 2010.05.11
58 펌웨어 & 코딩언어 HOT코드비젼으로 컴파일해봤습니다...도움좀 주세요.4 푸후 1219 2010.05.04
57 펌웨어 & 코딩언어 HOT다시 작성합니다. MSDN 도움말 문제입니다. TreeOfDream 883 2010.04.29
56 펌웨어 & 코딩언어 HOT어셈블 도와주세요 ㅠㅠ1 마왕님 1032 2010.04.26
55 펌웨어 & 코딩언어 HOT왕초보 c언어 질문이요11 hshyo 1053 2010.04.19
54 펌웨어 & 코딩언어 HOT마이컴 제어하는 C언어 학습이 어디까지 이루어져야 할까요?8 봄날 1434 2010.04.17
53 펌웨어 & 코딩언어 HOT액세스 지정자에 대해서 궁금한 점이 있습니다. TreeOfDream 902 2010.04.17
52 펌웨어 & 코딩언어 HOT조이스틱 관련 Firmware,Driver 관련 조언 부탁드립니다.2 루키키 1094 2010.04.14
51 펌웨어 & 코딩언어 HOTc언어 배우려는 초보입니다.9 빛의속도 1026 2010.04.09
50 펌웨어 & 코딩언어 HOTzigbee 통신 프로그램 질문입니다!!5 소울 2451 2010.04.01
49 펌웨어 & 코딩언어 HOT비쥬얼 스튜디오 6.0에 관해서..3 꿇단지 1061 2010.03.24
48 펌웨어 & 코딩언어 HOTc언어 왕초보입니다. 좋은책 추천좀 해주세요10 circuit 1295 2010.03.15
47 펌웨어 & 코딩언어 HOT8051과 일반 C와 많이 차이나나요?5 개똥껄레 1098 2010.02.20
  • 악은 선을 인식시키고 고통은 기쁨을 느끼게 한다.
    - 그리스도
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.