회원가입 ID/PW 찾기
AA

안녕하세요 AVR 입문자 입니다. 

다름이 아니라 제가 작은 키트를 작동하려고 하는데요.(ATMEGA32, 모터와 거리센서 3개(왼쪽,정면,오른쪽))

작동하려고 하는 것은 거리센서 (왼쪽,정면,오른쪽)에 신호가 가면 모터가 그에 맞게 동작을 하는 것입니다. 

문제는 제가 구현하고자 하는 대로 되지 않는 것에 속하는대요.

만약 정면 거리센서에 신호가 가면 멈추었다가 방향을 어느정도(90도)턴을 한다던가 하는 구현이 재대로 되지 않습니다. 지금은 센서에 신호가 가면  반응(왼쪽턴, 오른쪽 턴)을 하고 신호가 없으면 다시 전진하는 식으로 되어 있는데요

간단한 딜레이 함수를 소스에 구현하여 중간에 넣어 보았지만 계속 신호가 들어 와야지만 동작을 실행 합니다...(신호가 없으면 바로 직진.) 

신호를 한번 주면 그에 맞는 동작을 하고 다시 원래의 동작을 하는 방법이 궁금함니다. 거리센서인 만큼 거리에 따라서 전압이 달라지는데 거리에 따라서 그에 맞게 동작을 맞추어 보고 싶은데 ㅠ 손도 못대고 있는 상황인데요. 어디 부터 다시 손 봐야 하나요?

고수님들 도와주시면 감사하겠습니다.


제가 열심히 만든 소스 입니다. 고수님들의 많은 조언 부탁드립니다.

#include <inttypes.h>

#include <avr/io.h>

#include <avr/iom32.h>

#include <avr/interrupt.h>

#ifndef BV

#define BV _BV

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

#endif //#endif define end


static int speedMotor0 = 0;  // always > 0

static int speedMotor1 = 0;  // always > 0


void ledOn(int i);

void ledOff(int i);

void delay(int temp);


void adc_port_init(void);


inline int abs(int a) ;

void motor(int i, int speed);

void motors(int motor0, int motor1);

void motorsOff();


unsigned char startConvertion(unsigned char ch);

unsigned char readConvertData(void);


void ADC_proce0(volatile unsigned char i);

void ADC_proce1(volatile unsigned char i);

void ADC_proce2(volatile unsigned char i);

void ADC_proce3(volatile unsigned char i);

void ADC_proce4(volatile unsigned char i);

bool button(int i);


int main()

{

adc_port_init();

while(1){

if(startConvertion(0)||startConvertion(1)||startConvertion(2)){

ADC_proce0(startConvertion(0)); // Left sensor Converting

ADC_proce1(startConvertion(1)); // mid sensor Converting

ADC_proce2(startConvertion(2)); // right sensor Converting

}

else if(startConvertion(0) && startConvertion(1)){

ADC_proce3(startConvertion(0)); // Left sensor Converting

}

else if(startConvertion(1) && startConvertion(2)){

ADC_proce4(startConvertion(2)); // right sensor Converting

}

}

}


bool button(int i)

{

  if ((i<0) || (i>3)) return false;

  return ( (PINA & (16<<i)) == 0);

}


void ledOn(int i)

{

  if ((i<0) || (i>1)) return;

  cbi(PORTC, i+6); // clear bit -> LED on

}


void ledOff(int i)

{

  if ((i<0) || (i>1)) return;

  sbi(PORTC, i+6); // set bit -> LED off

}


void delay(int temp)

{

while(temp--);

}


inline int abs(int a) 

{

  if (a>=0) return a;

  else return -a;

}


void adc_port_init(void)

{

 PORTA = 0x00;

 DDRA  = 0x00;

 ADCSRA = 0x00; //disable adc

 ADMUX = 0x00; //select adc input 0

 ACSR  = 0x80;

 ADCSRA = 0xC6;

}


unsigned char startConvertion(unsigned char ch) //ADC start

{

ADCSRA = ADCSRA & 0x0f;

ADMUX = 0x60 | (ch & 0x0f);

ADCSRA = ADCSRA | 0xc0;

return ADCSRA;

}


unsigned char readConvertData(void)

{

volatile unsigned char temp;

while((ADCSRA & 0x10)==0);

ADCSRA = ADCSRA | 0x10; 

temp = ADCL;

temp = ADCH;

ADCSRA = ADCSRA | 0x10; 

return temp; 

}


void ADC_proce0(volatile unsigned char i){


int ADC_data;

ADC_data=readConvertData();


if(ADC_data>100)

{

motors(255,-0);

ledOn(1);

ledOff(0);

delay(3000);

}

else{

ledOff(1);

motors(255,-255);

}

}


void ADC_proce1(volatile unsigned char i){


int ADC_data;

ADC_data=readConvertData();


if(ADC_data>100)

{

motors(0,0);

delay(3000);

ledOn(1);

ledOn(0);

}

else{

ledOff(1);

ledOff(0);

motors(255,-255);

}

}

void ADC_proce2(volatile unsigned char i){


int ADC_data;

ADC_data=readConvertData();


if(ADC_data>100)

{

motors(0,-255);

ledOn(0);

ledOff(1);

delay(3000);

}

else{

ledOff(0);

motors(255,-255);

}

}


void ADC_proce3(volatile unsigned char i){


int ADC_data;


ADC_data=readConvertData();

if(ADC_data>100)

{

motors(255,0);

ledOn(1);

ledOff(0);

delay(3000);

}

else{

ledOff(1);

motors(255,-255);

}

}

void ADC_proce4(volatile unsigned char i){


int ADC_data;

ADC_data=readConvertData();

if(ADC_data>100)

{

motors(0,-255);

ledOn(1);

ledOff(0);

delay(3000);

}

else{

ledOff(1);

motors(255,-255);

}

}


void motor(int i, int speed)

{

  if ((i<0) || (i>1)) return;


  if (i==0) {

    speedMotor0 = abs(speed);

    if (speed==0) {

      cbi(PORTC, 4);   // input1  = 0

      cbi(PORTC, 5);   // input2  = 0

    }

    else if (speed>0) {

      sbi(PORTC, 5);   // input1  = 1

      cbi(PORTC, 4);   // input2  = 0


    }

    else {

      cbi(PORTC, 5);   // input1  = 0

      sbi(PORTC, 4);   // input2  = 1

    }

  }


  if (i==1) {

    speedMotor1 = abs(speed);

    if (speed==0) {

      cbi(PORTC, 2);   // input3  = 0

      cbi(PORTC, 3);   // input4  = 0

    }

    else if (speed>0){

      sbi(PORTC, 3);   // input3  = 1

      cbi(PORTC, 2);   // input4  = 0

    }

    else {

      cbi(PORTC, 3);   // input3  = 0

      sbi(PORTC, 2);   // input4  = 1    

    }

  }

}


void motors(int motor0, int motor1)

{

  motor(0, motor0);

  motor(1, motor1);

}


void motorsOff()

{

  motor(0, 0);

  motor(1, 0);

}


댓글 0

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

search
번호 분류 제목 글쓴이 조회 수 날짜
4244 마이크로프로세서 HOT소프트웨어 필터 - 칼만 필터 문의1 만내 3130 2011.07.27
4243 PADS HOTpads 9.2버젼 Crack파일 있으신분1 파도^^; 3232 2011.07.27
4242 PADS HOT초보자입니다. 하늘사랑73 2242 2011.07.26
4241 Allegro & OrCAD HOT고수님들의 도움좀 바랍니다.1 하늘사랑73 1695 2011.07.25
4240 PADS HOTPADS 공유 해 주실분 혹시 없나요 ? 킁킁 1508 2011.07.25
4239 자유주제 HOT제어 공부를 같이 해볼 수 없을까요??2 류야 12977 2011.07.25
4238 마이크로프로세서 HOT포텐쇼미터 adc 연결2 지에스 2385 2011.07.25
4237 PADS HOT9.3작업중 마우스가 약간 느려서 불편하던데1 파도^^; 1706 2011.07.22
4236 마이크로프로세서 HOTRF 모듈 질문요ㅠ 캐슬1 1922 2011.07.22
4235 PADS HOT이 에러가 왜 나는건가요 ??? 킁킁 1334 2011.07.22
4234 PADS HOTpads9.0 설치방법 킁킁 2950 2011.07.22
4233 PADS HOTPads 2007 Patch 있으신분 파도^^; 2064 2011.07.21
4232 자유주제 HOT호주에서 회로 설계하시는 분 계신가요?1 메갈로돈 21371 2011.07.21
4231 마이크로프로세서 HOTOR-CAD 회로도 PADS로 Import 중 애러 발생이 됩니다. 메갈로돈 2724 2011.07.21
4230 Allegro & OrCAD HOTORCAD 16.3 설치 ex1 nicdday 5175 2011.07.20
마이크로프로세서 HOTATMEGA32 ADC 제어와 거리센서에 관한 질문입니다. 본능적으로 2233 2011.07.20
4228 Software & IDEs HOTFreescale 질문인데 아시는 분 없나요? ㅠㅠ2 jzho 1552 2011.07.19
4227 Allegro & OrCAD HOTOrCAD 16.3 설치시 오류 메세지..... 좀 도와 주세요. Smileholic 3287 2011.07.18
4226 마이크로프로세서 HOTatmega 의 시리얼 통신을 이용하여 wifi를 제어하고 싶습니다..2 캐슬1 3694 2011.07.18
4225 개발용역 HOTPCB ARTWORK 해드립니다 아놀드1 6756 2011.07.17
Prev 1 ... 78 79 80 81 82 83 84 85 86 87 ... 295 Next
  • 실패한 고통보다 최선을 다하지 못했음을 깨닫는 것이 몇배 더 고통스럽다.
    - 앤드류 매튜스
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.