CDS값을 ADC로 입력받은 값에 따라 모터회전속도 설정하기
#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);
}
}


댓글을 달아 주세요