하드웨어 설계에 관련한 공개 강좌를 게재하는 공간입니다.
운영진에 의해 강좌글은 편집되며, 공익을 위한 게시글은 '하드웨어 강좌'란으로 이동될 수 있습니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 2.5점 / 총 2명 참여 |
---|
/********************************************* Project : motor Version : 0.1 Date : 2006-02-28 Author : akma Comments: *********************************************/ #include <mega128.h> #include <delay.h> #include "acc.h" #define MOTOR_PORT PORTD #define MOTOR_DDR DDRD #define SPEED_HIGH 30 // 최고속도 #define SPEED_START 0 // 시작속도 #define FULL_STEP 3/*2상*/ /* 1-2상여자 = 7 */ #define RIGHT 1 #define LEFT 2 #define BOTH 3 typedef unsigned char byte; typedef unsigned int word; typedef unsigned long dword; const byte r_phase_table[] = {0x50, 0x60, 0xA0, 0x90}; const byte l_phase_table[] = {0x05, 0x06, 0x0A, 0x09}; byte r_phase_index,l_phase_index; word acc_index_r, acc_index_l; word speed_limit,time_r,time_l; byte motor_arrived_left; /* cw방향으로 바퀴를 제어할때(ccw일때도) cw방향으로 회전잘하다가 리셋하면 ccw방향으로 회전하는등 cw/ccw을 번갈아 랜덤하게 제어되면 7026드라이버가 고장난것으로 생각하고 교체바란다 본인의 경험에 의하면 대략 95%이상 맞다 왼쪽바퀴와 오른쪽 바퀴에 균등한 힘을 주어 한쪽만 계속 탈조나면 그것도 7026드라비어의 고장증상이다 7026의 고장이 아니라면 모터의 고장을 의심해볼수 있는데 여유모터가 있으면 테스트해보기 바란다. 모터고장으로 토크가 안걸리는 경우를 봤으며 고장난 모터로 인해 7026드라이버까지 타는 경우가 있다. 단, 때론 납땜이 부실하게 되어 전류가 제대로 전달되지 못 할수도있으므로 납땜을 확인하기 바란다. 좌측, 우측 7026의 파형을 보고 비슷한지 꼭 확인하라. 7026, 모터 전부 이상이 없다면 회로쪽도 한번쯤 의심해보면 좋을것이다. */ void cal_speed_l(void) { acc_index_l++; if (acc_index_l > speed_limit) acc_index_l = speed_limit; time_l=acc_tbl[acc_index_l]; } void cal_speed_r(void) { acc_index_r++; if (acc_index_r > speed_limit) acc_index_r = speed_limit; time_r=acc_tbl[acc_index_r]; } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { l_phase_index--; l_phase_index &= FULL_STEP; MOTOR_PORT = r_phase_table[r_phase_index] | l_phase_table[l_phase_index] ; cal_speed_l(); OCR1AH = ( time_l >> 8 ) & 0xff; OCR1AL = time_l & 0xff; } interrupt [TIM3_COMPA] void timer3_compa_isr(void) { r_phase_index++; r_phase_index &= FULL_STEP; MOTOR_PORT = r_phase_table[r_phase_index] | l_phase_table[l_phase_index] ; cal_speed_r(); OCR3AH = ( time_r >> 8 ) & 0xff; OCR3AL = time_r & 0xff; } void start_motor() { l_phase_index = r_phase_index = 0; // limit speed speed_limit = SPEED_HIGH; // start speed acc_index_l = SPEED_START; acc_index_r = SPEED_START; OCR1AH = (acc_tbl[acc_index_l]>>8)&0xff; // register high byte OCR1AL = acc_tbl[acc_index_l]&0xff; // register low byte OCR3AH = (acc_tbl[acc_index_r]>>8)&0xff; // register high byte OCR3AL = acc_tbl[acc_index_r]&0xff; // register low byte TCCR1B = 0x09; //clock/1 TCCR3B = 0x09; //clock/1 TIMSK = 0x10; // timer1_compare match inable, left ETIMSK = 0x10; //timer3_compare match inable, right } void main(void) { // system delay delay_ms(300); MOTOR_DDR = 0xff; //motor output MOTOR_PORT = 0x00; start_motor(); //delay_ms(200); // 리셋하고 이전에 모터에 남아있는 상이 있으면 역회전 할수도있으므로 // 상을 끊어주는 의미 #asm("sei") while (1) { }; }