회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
932 마이크로프로세서 HOTADC관련 해서 질문이요~1 프로파일 2008 2011.08.25
931 마이크로프로세서 HOTstm32 uart 질문1 멍멍군 3704 2011.08.24
930 마이크로프로세서 HOT어제 질문한 3대 이상의 AVR 연결 다시 질문드려요 .3 sis0623 2198 2011.08.18
929 마이크로프로세서 HOTavr을 이용하여 아기의 울음소리를 입력받고 싶습니다.1 Floatin 1926 2011.08.18
928 마이크로프로세서 HOTCAN 통신에서 3개 이상의 AVR의 통신2 sis0623 2595 2011.08.17
927 마이크로프로세서 HOTdtmf 관련질문입니다.1 innercase 2247 2011.08.16
926 마이크로프로세서 HOTavr의 속도에 관한 질문.1 왕바리 2144 2011.08.16
925 마이크로프로세서 HOT외부 메모리 사용 컴맹9506 2059 2011.08.12
924 마이크로프로세서 HOTSD Card관련.2 HwangRoy 3243 2011.08.08
923 마이크로프로세서 HOTAT90CAN128 서로 CAN통신 하드웨어 연결 (완전초보)2 sis0623 4061 2011.08.05
922 마이크로프로세서 HOTICC V7 ATmege 2560 FFT 질문입니다.2 Gentlewolf 2675 2011.08.03
921 마이크로프로세서 HOTAVR aTmega128에서 Stepping Motor 돌려보려고 합니다.1 쿼코인 3002 2011.08.01
920 마이크로프로세서 HOT소프트웨어 필터 - 칼만 필터 문의1 만내 3132 2011.07.27
919 마이크로프로세서 HOT포텐쇼미터 adc 연결2 지에스 2388 2011.07.25
918 마이크로프로세서 HOTRF 모듈 질문요ㅠ 캐슬1 1924 2011.07.22
917 마이크로프로세서 HOTOR-CAD 회로도 PADS로 Import 중 애러 발생이 됩니다. 메갈로돈 2727 2011.07.21
마이크로프로세서 HOTATMEGA32 ADC 제어와 거리센서에 관한 질문입니다. 본능적으로 2235 2011.07.20
915 Software & IDEs HOTFreescale 질문인데 아시는 분 없나요? ㅠㅠ2 jzho 1555 2011.07.19
914 마이크로프로세서 HOTatmega 의 시리얼 통신을 이용하여 wifi를 제어하고 싶습니다..2 캐슬1 3696 2011.07.18
913 Software & IDEs HOTkey board 관련1 jjhuem 2453 2011.07.06
Prev 1 ... 7 8 9 10 11 12 13 14 15 16 ... 58 Next
  • 인생은 선을 실행하기 위하여 만들어졌다.
    - 칸트
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.