CDS값을 ADC로 입력받은 값에 따라 모터회전속도 설정하기


CDS 는 PA1, 모터 출력포트는 PB, 모터 드라이버는 AM-CS2P 사용.


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdio.h>

#include <carroty/fundamental.h>
#include <carroty/delay.h>
#include <carroty/fnd.h>

unsigned int adc0;
char step;
int aaa;

void motor(unsigned int value) {
 
//CDS 값에 따른 모터 회전 딜레이 설정.
 if(value>0 && value<50) aaa=1;
  else if(value>51 && value<100) aaa=2;
  else if(value>101 && value<150) aaa=3;
  else if(value>151 && value<200) aaa=4;
  else if(value>201 && value<250) aaa=5;
  else if(value>251 && value<300) aaa=6;
  else if(value>301 && value<350) aaa=7;
  else if(value>351 && value<400) aaa=8;
  else if(value>401 && value<450) aaa=9;
  else if(value>451 && value<500) aaa=10;
  else if(value>501 && value<550) aaa=11;
  else if(value>551 && value<600) aaa=12;
  else if(value>601 && value<650) aaa=13;
  else if(value>651 && value<700) aaa=14;
  else aaa=30;

 switch(step){               //switch문이 1번 돌면 스텝모터가 1.8도 회전한다.
  case 0xc3 :  step=0x66; break;
  case 0x66 :  step=0x3c; break;
  case 0x3c :  step=0x99; break;
  case 0x99 :  step=0xc3; break;
  default   :  step=0xc3; break;
 }
 PORTB=step;
 delay_ms(aaa);
}

void adc_init() {
  ADMUX= 0x41;        // ADC1(PA1)핀, AVCC 단자, 단극성 입력
  ADCSRA= 0x8C;       // ADC Enable, ADC Interrupt Enable, 16분주(1MHz)
}

SIGNAL(SIG_ADC) {               // ADC 완료 인터럽트
  unsigned int temp;
  temp =  ADCL;                 // ADCL 먼저 읽기
  temp += (ADCH<<8);
  adc0= temp;
}

void led_init(void) {  // FND에 대한 포트 설정.
  DDRB= 0xFF;
}

int main(void) {
 led_init();           // FND 초기화
 adc_init();        // ADC 초기화
 sei();            // 글로벌 인터럽트 허용

  while(true) {
    ADMUX= 0x41; //외부의 AVCC단자로 입력된 전압 사용, ADC1 단극성 입력.
    ADCSRA |= 0x40;  // ADC1 시작
    motor(adc0); // adc 값 출력
 delay_ms(1);
  }
}

2009/06/16 07:27 2009/06/16 07:27


ㄹㅔㅈㅕ
하드웨어/AVR 2009/06/16 07:27

트랙백 주소 : http://seoltang.com/trackback/337

댓글을 달아 주세요

[ SG, SB ] Powerd by Textcube, designed by criuce
rss