회원가입 ID/PW 찾기
AA

제가 이번에 컨베이어벨트를 만들게 됐습니다!!


그래서 지금 ATmega128 키트와 AVRstudio를 써서 구동시키는 공부를 하고있습니다.

우선 그림에서 보듯이, AVR에 PORTC를 모터드라이버 L298과 연결시켰고

모터는 5V 기어모터를 사용하고 있습니다.


제가 프로그래밍 지식이 하나도 없는데...


#include <avr/io.h>

#include <avr/interrupt.h>

#include <stdio.h>


// DC MOTOR Control

#define MOTOR_PORT PORTC

#define PWM_PORT 0x00

#define PWM1_ON (MOTOR_PORT|=0x01)

#define PWM1_OFF (MOTOR_PORT&=0xFE)

#define DIR1_ON (MOTOR_PORT|=0x02)

#define DIR1_OFF (MOTOR_PORT&=0xFD)

#define ENABLE1_OFF (MOTOR_PORT|=0x04)

#define ENABLE1_ON (MOTOR_PORT&=0xFB)

#define BREAK1_ON (MOTOR_PORT|=0x08)

#define BREAK1_OFF (MOTOR_PORT&=0xF7)


#define PWM2_ON (MOTOR_PORT|=0x10)

#define PWM2_OFF (MOTOR_PORT&=0xEF)

#define DIR2_ON (MOTOR_PORT|=0x20)

#define DIR2_OFF (MOTOR_PORT&=0xDF)

#define ENABLE2_OFF (MOTOR_PORT|=0x40)

#define ENABLE2_ON (MOTOR_PORT&=0xBF)

#define BREAK2_ON (MOTOR_PORT|=0x80)

#define BREAK2_OFF (MOTOR_PORT&=0x7F)



#define LEFT 1

#define RIGHT 2

#define STOP 3


// SPEED Control

#define MIN_SPEED 1

#define MAX_SPEED 1700

#define SPEED_UP  1


// SWITCH Control

#define SW_PORT     PINA

#define SW_PORT_DDR DDRA

#define PRESSED 2

#define OPEN 0


volatile unsigned char num=PWM_PORT;

volatile unsigned char motor_state=LEFT, motor2_state=LEFT;

volatile unsigned char T20ms=0, T2_20ms=0;

volatile unsigned int DCMOTOR[8], sw_state[8]={0,0,0,0,0,0,0,0};

volatile unsigned int Tcount=0,T2_count=0;

volatile unsigned int motor_speed,motor2_speed;


void port_init(void)

{

 PORTA = 0x00;

 DDRA  = 0x00;

 PORTB = 0x00;

 DDRB  = 0x00;

 PORTC = 0x00; //m103 output only

 DDRC  = 0xff;

 PORTD = 0x00;

 DDRD  = 0x00;

 PORTE = 0x00;

 DDRE  = 0x00;

 PORTF = 0x00;

 DDRF  = 0x00;

 PORTG = 0x00;

 DDRG  = 0x00;

}


//TIMER0 initialize - prescale:64

// WGM: Normal

// desired value: 1mSec

// actual value:  1.000mSec (0.0%)

void timer0_init(void)

{

 TCCR0 = 0x00; //stop

 ASSR  = 0x00; //set async mode

 TCNT0 = 0x06; //set count

 OCR0  = 0xFA;

 TCCR0 = 0x04; //start timer

}


ISR(TIMER0_OVF_vect)

{

 TCNT0 = 0x06; //reload counter value

 T20ms++;

 if(T20ms >= 20)

 {

T20ms = 0;

Tcount = 0;

 }

 

 T2_20ms++;

 if(T2_20ms >= 20)

 {

T2_20ms = 0;

T2_count = 0;

 }

}


//TIMER2 initialize - prescale:64

// WGM: Normal

// desired value: 100uSec

// actual value: 100.000uSec (0.0%)

void timer2_init(void)

{

 TCCR2 = 0x00; //stop

 TCNT2 = 0xEC; //setup

 OCR2  = 0x14;

 TCCR2 = 0x02; //start

}


ISR(TIMER2_OVF_vect)

{

 TCNT2 = 0xE7; //reload counter value

 Tcount++;

 T2_count++;

 

 if(DCMOTOR[0]>Tcount)

    MOTOR_PORT |= (0x01<<num);

 else

  MOTOR_PORT &= (~(0x01<<num));

 if(DCMOTOR[4]>Tcount)

    MOTOR_PORT |= (0x01<<4);

 else

  MOTOR_PORT &= (~(0x01<<4));

}


//call this routine to initialize all peripherals

void init_devices(void)

{

 //stop errant interrupts until set up

 cli(); //disable all interrupts

 XMCRA = 0x00; //external memory

 XMCRB = 0x00; //external memory

 port_init();

 timer0_init();

 timer2_init();


  MCUCR = 0x00;

 EICRA = 0x00; //extended ext ints

 EICRB = 0x00; //extended ext ints

 EIMSK = 0x00;

 TIMSK = 0x41; //timer interrupt sources

 ETIMSK = 0x00; //extended timer interrupt sources

 sei(); //re-enable interrupts

 //all peripherals are now initialized

}


void delay(int cnt)

{

unsigned int i, j;

for(i=0;i<cnt;i++){

for(j=0;j<1000;j++)

{

}

}

}


void motor_init(void){

ENABLE1_ON;

  PWM1_ON;

  BREAK1_OFF; 

DIR1_ON;

   

ENABLE2_ON;

  PWM2_ON;

  BREAK2_OFF; 

DIR2_ON;

}


//

int main(void)

{

 

 init_devices();

 //insert your functional code here...

 motor_init();

 SW_PORT_DDR = 0x00;

 DCMOTOR[0] =  motor_speed = 800;

 DCMOTOR[4] = motor2_speed = 100;   

 

 while(1){

switch(SW_PORT&0xff){

case 0x01 :  motor_speed+=SPEED_UP;

  break;

case 0x02 :  motor_speed-=SPEED_UP;

  break;

case 0x04 :  sw_state[2] = PRESSED;    

  break; 

case 0x08 :  sw_state[3] = PRESSED;  

  break;

case 0x10 :  motor2_speed+=SPEED_UP;

  break;

case 0x20 :  motor2_speed-=SPEED_UP;

  break;

case 0x40 :  sw_state[4] = PRESSED;    

  break; 

case 0x80 :  sw_state[5] = PRESSED;  

  break;

 

case 0x00 : if(sw_state[2] == PRESSED){

  if(motor_state == STOP){

motor_state = LEFT;

}else{

  motor_state = STOP;

}

sw_state[2] = OPEN;

}

if(sw_state[3] == PRESSED){

  if(motor_state == STOP){

motor_state = RIGHT;

}else{

  motor_state = STOP;

}

sw_state[3] = OPEN;

}

if(sw_state[4] == PRESSED){

  if(motor2_state == STOP){

motor2_state = LEFT;

}else{

  motor2_state = STOP;

}

sw_state[4] = OPEN;

}

if(sw_state[5] == PRESSED){

  if(motor2_state == STOP){

motor2_state = RIGHT;

}else{

  motor2_state = STOP;

}

sw_state[5] = OPEN;

}

break;

default : break;

}

if(motor_speed >= MAX_SPEED){

motor_speed = MAX_SPEED;  

}

if(motor_speed <= MIN_SPEED){

motor_speed = MIN_SPEED;  

}

if(motor2_speed >= MAX_SPEED){

motor2_speed = MAX_SPEED;  

}

if(motor2_speed <= MIN_SPEED){

motor2_speed = MIN_SPEED;  

}


switch(motor_state){

case LEFT  : BREAK1_OFF;

  DIR1_ON;

  break; 

case RIGHT : BREAK1_OFF;

  DIR1_OFF;

  break;

case STOP  : BREAK1_ON;

  break;

default : break;

}

switch(motor2_state){

case LEFT  : BREAK2_OFF;

  DIR2_ON;

  break; 

case RIGHT : BREAK2_OFF;

  DIR2_OFF;

  break;

case STOP  : BREAK2_ON;

  break;

default : break;

}

DCMOTOR[0] = motor_speed;

DCMOTOR[4] = motor2_speed;

delay(5);


}

return 0;

}


이런 소스를 가져오니. 왼쪽방향으로 일정속도로 계속 돌더군요...
이 소스를 가지고 정회전, 역회전, 정지 기능을 살리고싶은데,
어떻게 해야할 지를 모르겠습니다ㅠ PORTA등을 써서 스위치를 만들어야 하는지...어떤식으로 해 나가야할 지 알려주세요~~ㅠㅠ
댓글 2
  • No Profile

    타인이 작성한 소스를 가져올 때는 일단 이해부터 하셔야겠지요.

    아래처럼 코드를 입력하면 오른쪽으로 돌기, 정지 등이 될 것입니다.


    motor_state = RIGHT;

    motor_state = STOP;


    소스코드 이해부터 하세요^^



  • No Profile

    고수님들께 몇가지 질문을 드려도 될른지.........


    1. 위에 소스에서 발진 주파수는 얼마로 해서 타이머를 계산하면 1mS, 100uS가 나오는건가요?


    2. Timer/Counter2에서 Prescaler가 clk/8이 아닌지....


    3. 위에 소스에서 사용된 타이머의 시간 계산 방법좀 알려주시면 감사하겠습니다.

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

search
번호 분류 제목 글쓴이 조회 수 날짜
58 ECAD 아무거나 HOT로드셀을 이용한 회로 설계에대해 궁금합니다.1 삼이ㅋ 974 2012.10.27
57 ECAD 아무거나 HOTorcad 16.3 설치 중 에러1 patto 3483 2012.09.29
56 ECAD 아무거나 HOTorcad 설치 질문인데요 하하하하히 529 2012.09.17
55 ECAD 아무거나 orcad usb 관련 질문인데요 하하하하히 288 2012.09.08
54 ECAD 아무거나 HOTMentorGraphics (pads) 실행시 에러가 뜨는데요ㅠ3 하하하하히 2657 2012.08.06
53 ECAD 아무거나 HOT전자 캐드 기능사 이론 시험 자료 가을비 526 2012.06.25
52 ECAD 아무거나 HOT패드스택 만들때 납이 묻을 패드크기 지정?? sinwho 543 2012.06.09
51 ECAD 아무거나 HOTorcad 16.3 설치중 에러질문입니다.1 조신율 717 2012.03.27
50 ECAD 아무거나 HOTPCB STACK UP에 대해 질문드립니다.1 라르크유키 1677 2012.02.27
49 ECAD 아무거나 Layout Guideline 질문드립니다.1 김진효 329 2012.01.31
48 ECAD 아무거나 HOTCAM350 TOOL공유 할수있나요1 정상까지 가보자! 4588 2012.01.12
47 ECAD 아무거나 초보입니다.. 업무상 필요한 부분이여서요 빠른 답변 부탁 드려요 ^^;;1 멜쉬 338 2012.01.10
46 ECAD 아무거나 HOTpmc/xmc 질문입니다. 마모루 1027 2011.10.04
45 ECAD 아무거나 HOTStandard PCB Layer Stack Up 정상까지 가보자! 1352 2011.10.03
44 ECAD 아무거나 HOTpads 9.2 설치 오류 문의 조필버그 1938 2011.09.09
43 ECAD 아무거나 HOT회로도 제작조언 및 제작부탁요청요!4 쏘주한잔 6084 2011.05.03
42 ECAD 아무거나 HOT9.3 설치방법에 관한 문의 Jux 1803 2011.04.21
41 ECAD 아무거나 HOT9.3VERSION에서 DxDEDIGNER동작 하나요?1 정상에서 1647 2011.04.04
40 ECAD 아무거나 HOTPads2007과 pads9.2의 사용법이 많이 다른가요?3 릭정 3755 2011.01.25
39 ECAD 아무거나 HOTwin7과 Artwork 프로그램(Pads, Cadstar등)간의 호환성 어떤가요?1 릭정 2862 2011.01.25
  • 비통 속에 있는 사람과의 약속은 가볍게 깨진다.
    - J.메이스필드
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.