1. 제어주기
T/C2 사용 Overflow Interrupt Routine
2. 정규화
void Normalization(int array[], int max[], int min[]){
double numerator = 0; // 분자
double denominator = 0; // 분모
for(int i = 0; i < 8; i++)
{
numerator = array[i] - min[i];
denominator = max[i] - min[i];
array[i] = (numerator / denominator) * 100; // ADC값 정규화
if(array[i] <= 50) line[i] = 1; // 검은색이면 1 흰색이면 0으로 배열 line에 저장
else line[i] = 0;
}
}
3. 가중치
void Weighted_Data_Processing(){ // 가중치
int j = 0;
sigma_L = 0; // 좌측 ADC 가중치
sigma_R = 0; //우측 ADC 가중치
for(int i = 0; i < 4; i++) sigma_L -= (line[i] * (1<<(3 - i))); // -8, -4, -2, -1
for(int i = 4; i < 8; i++) sigma_R += (line[i] * (1<<(i - 4))); // 1, 2, 4, 8
UART1_Transmit(' ');
UART1_TransNum(sigma_R + sigma_L); // 총 가중치를 uart로 출력
}
4. 주행
while (1)
{
ADC_Receive(adc_array); // ADC값을 받아온다.
if(button == 1) // 버튼을 한 번 누르면 ADC 최대 최소값 받음
{
PORTA = 0x55;
for(int i = 0; i < 8; i++)
{
if(adc_array[i] > adc_max[i]) adc_max[i] = adc_array[i];
if(adc_array[i] < adc_min[i]) adc_min[i] = adc_array[i];
}
}
else if(button >= 2) // 버튼을 한 번 더 누르면
{
PORTA = ~(1 << flag);
Normalization(adc_array, adc_max, adc_min); // 정규화
line_s = 0;
for(int i = 0; i < 8; i++)
{
UART1_Transmit(line[i] + 48); // 각 센서가 검은줄 위에 있는지 0/1로 uart로 출력
line_s += line[i]; // 검은줄 위에 있는 수발광 센서의 수
}
if((sigma_L + sigma_R) != 0) uturn = MOTOR_Direction((sigma_R + sigma_L), line_s, uturn); // 가중치 가 0이 아닐 경우 모터 방향 변경
//uturn = MOTOR_Direction((sigma_R + sigma_L), line_s, uturn); // 수정
// 문제점 1. 가중치가 0일 경우를 제외하였기 때문에 직진을 바르게 하지 못했음.
}
UART1_Transmit(' '); // 띄어쓰기
Weighted_Data_Processing(); // 가중치
UART1_Transmit(13); // uart 줄넘김
}
<Github>