회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
14 구인구직 HOT사람인 - 월급 1000만원 프로젝트, 프로그래머 모집 쭈니닷 5046 2012.06.18
13 구인구직 HOT(주)엑스큐어넷 - 소프트웨어 개발자(프로그래머) 채용 쭈니닷 4916 2012.06.12
12 구인구직 HOT(주)시뮬라인 - 기술개발본부 소프트웨어 팀 신입/경력사원 채용공고 쭈니닷 5476 2012.06.11
11 구인구직 HOT㈜엔써즈 - 시스템엔지니어 신입사원 모집 쭈니닷 6351 2012.06.08
10 구인구직 HOT㈜고우넷 - unix 엔지니어 채용 콘마개마 3833 2012.06.05
9 구인구직 HOT전액무료 자바(java)기반 하이브리드 프레임웍개발 안드로이드 개발교육과정 cocoa13 3387 2012.05.14
8 구인구직 HOT[교육부담 0%] 이공계 전액무료 하이브리드 앱 개발자 취업확정자 교육연수과정 cocoa13 4064 2012.05.01
7 구인구직 HOT[전액무료교육] 구로디지털 단지 자바개발 업체 채용확정자 취업교육” 안드로이드 개발 및 프로젝트 과정 cocoa13 3626 2012.04.30
6 구인구직 HOT[전액무료과정] 웹디자이너 양성교육 비주얼 컨텐츠 디자인 과정 안내 cocoa13 4623 2012.04.26
5 구인구직 HOTPOWER설계 및 하드웨어 경력자 찾아요. 박우종 4997 2012.03.07
4 구인구직 HOT회로수리 및 수땜, ECO작업등 필요하시면 연락주세요. 세윤파파 8654 2012.01.27
3 구인구직 HOT실력있는 펌웨어 엔지니어를 모집합니다. JamesHan 8114 2011.12.27
2 구인구직 HOT(주)로벤 연구소에서 연구원을 모집합니다. maddog 6493 2011.11.10
1 구인구직 HOT[급구] PCB 설계 경력자 & H/W 및 펌웨어 엔지니어 모집 용가리3 13447 2010.12.23
Prev 1 ... 5 6 7 8 9 10 11 12 13 14 Next
  • 약속을 지키는 최선의 방법은 약속을 하지 않는 것이다.
    - 나폴레옹
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.