회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
1344 자유주제 HOT부품 문의(사진)1 효연 22956 2012.03.30
1343 전기전자 아무거나 HOTAtmega162를 이용해서 환풍기를 제어할라고 하는데요.2 커즈 470 2012.04.01
1342 자유주제 HOT납 사용에 관한 아이디어 공모1 사탄 22420 2012.04.01
1341 전기전자 아무거나 HOT스마트폰에서 발생하는 전자파에 대해서1 여신 1076 2012.04.02
마이크로프로세서 HOTDC모터 정회전/역회전/정지 를 시키고싶습니다!!2 신천동주민 1732 2012.04.03
1339 자유주제 HOT동종업계이직...3 김터프 20849 2012.04.07
1338 전기전자 아무거나 HOT스마트폰 전자파 배출량과 일반폰 전자파 배출량(납20)1 나타카 1456 2012.04.08
1337 마이크로프로세서 AM26LS31CDR 과 TLP115A 어떻게 사용되는지 알고싶습니다.2 용용이예요 313 2012.04.09
1336 개발용역 HOT가상시리얼포트 서버연동 제작의뢰 합니다. 저기로보여지는 5293 2012.04.11
1335 자유주제 HOT2012년 Automation #1 전시회 관람기[코엑스]2 사탄 8955 2012.04.14
1334 자유주제 HOT2012년 Automation #2 전시회 관람기[코엑스]1 사탄 8830 2012.04.14
1333 마이크로프로세서 HOTATmega 128의 대해서 질문입니다4 까롱 442 2012.04.15
1332 자유주제 HOT납이 몇점인지 안보여요1 먼지삼촌 20156 2012.04.16
1331 자유주제 HOT스펨의 기준2 빛나는 영혼 19650 2012.04.18
1330 Analog & Mixed-Signal 설계 HOT220V단극전원공급회로(리모콘스위치에 사용하는 회로) 채창우 1026 2012.04.19
1329 전기전자 아무거나 HOT리모콘스위치의 전원회로에 대해2 채창우 1678 2012.04.19
1328 자유주제 HOT울집 고양이들8 빛나는 영혼 1513 2012.04.20
1327 PADS HOTlp wizard 사용방법좀 설명해주세요.1 고드름 1133 2012.04.24
1326 마이크로프로세서 HOT89s51 (80c51) instruction set3 하누리2 2806 2012.04.25
1325 구인구직 HOT[전액무료과정] 웹디자이너 양성교육 비주얼 컨텐츠 디자인 과정 안내 cocoa13 4623 2012.04.26
  • 세상이 자기를 버렸다고 생각하지 마라. 세상은 날 가진적이 없다.
    - 박 종영
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.