다들 수고가 많으십니다.
이번에 모터제어를 하는데요 엔코더 신호를 받아서 atmega128에 펄스 신호를 받을때마다 count변수를 증가시켜서 제가 목표를 삼는 속도에 도달하는 것을 목적으로 공부하고 있습니다.
atmega128을 쓰고 있구요 avr studio4버젼을 쓰고 있습니다.
지금 제가 궁금한것은 모터가 구동될때 외부 인터럽트핀 PIND0핀에 펄스신호가 들어오는 것까지 확인이 되었구요
이 신호가 들어오면서 count변수가 증가되는것인지 확인할 법이 없어서 애매모호한 상태입니다.
또 지금 제가 코딩한 부분에서 RTIHan함수가 실현되어서 목표속도가 나오는 것인지 아니면 그냥 설정한 목표속도에 따라서 모터가 구동되고 있는것인지가 궁금합니다.
#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){
if(p_duty0>=p_cut)
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();
RTIHan();
if(present_speed < object_speed)
p_duty0= p_duty0 + speed_err;
else
p_duty0 = p_duty0;
_delay_ms(1);
while(1){}
}
void ex_int(void)
{
EIMSK=0xff;
EICRA=0xff;
}
ISR(INT0_vect)
{
if((PIND &0b01000000) == 0b01000000)
count=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
speed_err = object_speed - present_speed;
/*if(speed_err > 0)
p_duty0 = p_duty0 + (int) speed_err;
else if(speed_err == 0)
p_duty0 = p_duty0;
else if(speed_err < 0)
p_duty0 = p_duty0 - (int) speed_err;*/
count = 0; // 엔코더 펄스 카운트한것을 리셋
}
많은 조언 부탁드립니다.
카운트 변수를 lcd나 시리얼통신으로 출력해서 확인하세요.
인터럽트가 들어온다면 하드웨어적으로는 작동하는거 같군요
아 그런방법이 있었군요 감사합니다.
128키트에 ldc모듈은 없는거라 통신포트 연결해서 해봐야겠군요
수고하세요~