회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
4564 구인구직 HOT[교육부담 0%] 이공계 전액무료 하이브리드 앱 개발자 취업확정자 교육연수과정 cocoa13 4071 2012.05.01
4563 자유주제 HOT출근랭킹에...7 빛나는 영혼 18937 2012.05.01
4562 구인구직 HOT[전액무료교육] 구로디지털 단지 자바개발 업체 채용확정자 취업교육” 안드로이드 개발 및 프로젝트 과정 cocoa13 3634 2012.04.30
4561 자유주제 HOTVHDL 관련 해서 좀 하시는분..3 유스티노 19575 2012.04.29
4560 구인구직 HOT[전액무료과정] 웹디자이너 양성교육 비주얼 컨텐츠 디자인 과정 안내 cocoa13 4625 2012.04.26
4559 마이크로프로세서 HOT89s51 (80c51) instruction set3 하누리2 2810 2012.04.25
4558 PADS HOTlp wizard 사용방법좀 설명해주세요.1 고드름 1137 2012.04.24
4557 자유주제 HOT울집 고양이들8 빛나는 영혼 1516 2012.04.20
4556 전기전자 아무거나 HOT리모콘스위치의 전원회로에 대해2 채창우 1680 2012.04.19
4555 Analog & Mixed-Signal 설계 HOT220V단극전원공급회로(리모콘스위치에 사용하는 회로) 채창우 1030 2012.04.19
4554 자유주제 HOT스펨의 기준2 빛나는 영혼 19653 2012.04.18
4553 자유주제 HOT납이 몇점인지 안보여요1 먼지삼촌 20157 2012.04.16
4552 마이크로프로세서 HOTATmega 128의 대해서 질문입니다4 까롱 446 2012.04.15
4551 자유주제 HOT2012년 Automation #2 전시회 관람기[코엑스]1 사탄 8831 2012.04.14
4550 자유주제 HOT2012년 Automation #1 전시회 관람기[코엑스]2 사탄 8959 2012.04.14
4549 개발용역 HOT가상시리얼포트 서버연동 제작의뢰 합니다. 저기로보여지는 5294 2012.04.11
4548 마이크로프로세서 AM26LS31CDR 과 TLP115A 어떻게 사용되는지 알고싶습니다.2 용용이예요 316 2012.04.09
4547 전기전자 아무거나 HOT스마트폰 전자파 배출량과 일반폰 전자파 배출량(납20)1 나타카 1459 2012.04.08
4546 자유주제 HOT동종업계이직...3 김터프 20849 2012.04.07
마이크로프로세서 HOTDC모터 정회전/역회전/정지 를 시키고싶습니다!!2 신천동주민 1740 2012.04.03
Prev 1 ... 62 63 64 65 66 67 68 69 70 71 ... 295 Next
  • 실패한 고통보다 최선을 다하지 못했음을 깨닫는 것이 몇배 더 고통스럽다.
    - 앤드류 매튜스
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.