Download presentation
Presentation is loading. Please wait.
Published byJesse Warren Modified over 8 years ago
1
Sensing Algorithm using IR Sensor and ADC Soong-sil University. Robotics. 2007. 05. 02. 13 기 정 두 원.
2
-2--2- Index Infrared Sensor 1 Design Sensor Circuits 2 ADC with the Atmega128 3 Sensing Algorithm 4
3
-3--3- Infrared Sensor 적외선 ? 파장이 가시광선 보다 길고 전파보다 짧은 전자파 일종 일정 주파수의 빛을 발산 및 받아들이는 소자.( 발광, 수광 ) 발광부에서 나온 적외선이 물체에 반사되어 수광부에 얼마나 많은 양 이 들어오느냐에 따라서 수광부에 들어오는 전압의 양이 변화. ( 색에 따라 빛의 반사 정도 다름 ) 수광소자는 빛 에너지를 전기 에너지로 바꿔주는 역할. 발광수광
4
-4--4- Infrared Sensor Photo Diode. – 접합용량이 작으므로 읍답특성이 좋음. – 역바이스를 걸면 응답특성이 향상. – 출력 신호가 매우 낮음. Photo Transistor. –TR 의 베이스에 포토 다이오드 부착 한 형태 – 온도 보상에는 베이스가 부착된 포토 TR 사용. – 베이스가 부착된 포토 TR 은 광전류의 직진성을 개선. – 출력 전류가 크다.
5
-5--5- Infrared Sensor IR Sensor formation. In phase with input signal High ouput power signal Out of pahse with input signal Low output power signal
6
-6--6- Sensor Circuits Always give and take the signals. Simple Circuit design. Apply a low electric current. Intensity of light is relative to a current.
7
-7--7- Sensor Circuits High-Pass Filter Voltage 비교용 조절을 통해 출력을 High,Low 조절 비교방식의 회로 디자인
8
-8--8- Sensor Circuits 광량식 방식의 회로 디자인
9
-9--9- Features of the AD system for the 128 8 or 10-bit resolution 8 bit => 2 8 = 256 output states, so resolution of V FSR /2 8 = 1 part in 256 of V FSR (V REF ) 10 bit => 2 10 = 1024 output states, so resolution of V FSR /2 10 = 1 part in 1024 of (V REF ) 8 channel MUX => 8 single-ended (i.e. referenced to GND) voltage inputs on PORTF 16 combinations of differential inputs –Two (ADC1, ADC0 and ADC3, ADC2) have a programmable gain stage with 1X, 10X, or 200X gain selectable 1X or 10X can expect 8 bit resolution 200X 7-bit resolution –Seven differential channels share ADC1 as the common negative terminal (ADC0-ADC1) Input voltage range is 0 V – V CC V REF can be internal (either 2.56 V or AVCC) or externally supplied Interrupt on ADC conversion complete
10
- 10 - Procedure to Initialize ADC Set up ADCSRA and ADMUX: 1. Turn on the ADC (ADEN=1) 2. Choose single-conversion or free-run (ADFR=0 means single conversion) 3. Clock prescaler (selects system clock divider. Smaller divider => faster but less accurate conversion 4. Choose the voltage reference by selecting proper bits, in location 7 and 6 of ADMUX 5. Choose left or right adjustment of result (in ADMUX register, ADLAR=0 for right adjust) 6. Choose the AD channel to convert (in ADMUX, MUX bits)
11
- 11 - Procedure to Do a Conversion 1. Start a conversion by writing a 1 to ADC Status and Control Register, bit 6 (ADSC) 2. Wait until conversion is complete a. Can monitor bit 6 (ADSC). It will stay as 1 until conversion completes, or b. Generate an interrupt Bit 4 (ADIF) of ADSC will be set when the conversion is complete To use interrupts must: o Set bit 3 (ADIE) of ADCSRA and o Enable global interrupts: o Define an interrupt handling routine. o Make sure to #include
12
- 12 - Procedure to Do a Conversion 3. Read data from ADC Data register: ADCL first, then ADCH (if 10 bit desired) a. Note that access to the ADC data register is blocked until both ADCL and ADCH are read. Once ADCH is read, the ADC data register can be updated. b. ADLAR=0 (right shifted) c. ADLAR=1 (left-shifted)
13
- 13 - ADC Code Example #define Counter_Max 65535 // 16bit Overflow spot #define Period_1ms_count 16 // 1.02ms(1024us) #define pulse 3 // 0.19ms( 192us) #pragma vector = TIMER3_OVF_vect __interrupt void TIMER3_OVR_interrupt(void){ static unsigned char counter_flag = 1 ; static unsigned char counter = 0; if(counter_flag) { TCNT3H = (unsigned char)(((Counter_Max - pulse) >> 8 ) & 0x00FF); TCNT3L = (unsigned char)((Counter_Max - pulse) & 0x00FF); if(++counter>7) counter=0; PORTA=(1<<counter); counter_flag=0; } else { TCNT3H = (unsigned char)(((Counter_Max - (Period_1ms_count - pulse)) >> 8 ) & 0x00FF); TCNT3L = (unsigned char)((Counter_Max - (Period_1ms_count - pulse)) & 0x00FF); PORTA = 0x00; ADMUX = 0x20 + counter; ADCSR |= 0x40; // ADC start conversion counter_flag=1; } #pragma vector=ADC_vect __interrupt void ADC_conversion_done(void) { unsigned char temp; temp=ADCL; temp=ADCH; Sensor_ADC_result[ADMUX-0x20] = temp; }
14
- 14 - Sensing Algorithm 비교식 – 위치 값 정확. 노이즈에 강하다. – 처리 데이터 수가 적어서, 계산량이 적다. – 하드웨어적인 방법과 소프트 웨어적인 방법 ( 회로에서 H,L 값을 입력 받 는 방법, ADC 에 변환된 값을 코딩을 통해 H,L 판단하는 방법 ) – 자유 곡률에서 부드러운 주행 힘듦. 광량식 – 데이터가 세밀하고 양이 많아 계산량이 많음. – 정밀한 제어가 가능. – 자유곡률에서 부드러운 주행 가능.
15
- 15 - Sensing Algorithm - 비교식 ON-OFF 방식 1 – 회로에서 ON-OFF 방식으로 출력 –PORT A 를 통해 전체 입력을 받음. 프로그래밍 간단 10001000 10000000 int Get_Position(void) { int sum_position=0, flag=0; if(PINA0==1){sum_position +=10; flag++;} else if(PINA1==1){sum_position +=20; flag++;} else if(PINA2==1){sum_position +=30; flag++;} …. else if(FINA7==1){sum_position +=80; flag++;} return(sum_position/flag – 45) }
16
- 16 - Sensing Algorithm - 정규화 센서값 정규화 – 여러가지 이유로 센서의 최대값과 최소값이 각 센서마다 틀리다. – 검정색판과 흰색 라인 위에서 센서값의 최대, 최소값을 구해 저장 Min Max 255 0 정규화 값 (8 비트 ) 센서 값 정규화 된 값 = ( 센서값 -Min)*255/(Max-Min)
17
- 17 - Sensing Algorithm – Example Code unsigned char Sensor_ADC_max[8] = {0,0,0,0,0,0,0,0}, Sensor_ADC_threshold[8]; unsigned char Sensor_ADC_min[8] = {255,255,255,255,255,255,255,255}; void Sensor_Get_Min (void) { BYTE i; for(i=0;i<8;i++){ if(Sensor_ADC_result[i] < Sensor_ADC_min[i]){ Sensor_ADC_min[i] = Sensor_ADC_result[i]; } } void Sensor_Get_Max (void) { BYTE i; for(i=0;i<8;i++){ if(Sensor_ADC_result[i] > Sensor_ADC_max[i]){ Sensor_ADC_max[i] = Sensor_ADC_result[i]; } } void Sensor_Get_Threshold(void){ int i=0; for(i=0; i<8;i++) {Sensor_ADC_threshold[i] = (Sensor_ADC_max[i] - Sensor_ADC_min[i])>>3;} }
18
- 18 - Sensing Algorithm - 비교식 ON-OFF 방식 2 –ADC 값과 Threshold 값을 가지고 On-Off 판단 – 흰색이면 최대값을 갖을 것이고, 검정색이면 최소값을 갖게 될것. –Threshold 값 보다 크면 흰색 라인, 작으면 검정색으로 인식 int Get_Position(void) { int sum_position=0, flag=0; for(int i=0; i<8 ; i++){ if(Sensor_ADC_result[i] > Sensor_ADC_threshold[i]){ sum_position += Sensor_Importance[i]; flag++; } return(sum_position/flag – 45); }
19
- 19 - Sensing Algorithm - 광량식 광량식 – 센서 배치 문제 ( 두개의 센서가 라인의 어느 위치에 있느냐 ) – 짝수개의 수광부 센서 사용 하는 것이 쉽다. – 센서 사이의 값들을 선형적으로 만드는게 중요 – 각 센서에 가중치를 두어 위치파악 최대값 센서값 최소값 X10 X2 X2 X10
20
- 20 - Sensing Algorithm – Example Code int Get_Position (void){ int temp_position=0; int i; unsigned char temp_value[6]; for(i=0; i<6;i++) { if (Sensor_ADC_result[i] > Sensor_ADC_max[i]) temp_value[i]=Sensor_ADC_max[i]; else if (Sensor_ADC_result[i] < Sensor_ADC_min[i]) temp_value[i]=Sensor_ADC_min[i]; else temp_value[i] = (Sensor_ADC_result[i] - Sensor_ADC_min[i]); } temp_position -= (temp_value[0]<<7) / Sensor_ADC_threshold[0]; temp_position -= (temp_value[1]<<4) / Sensor_ADC_threshold[1]; temp_position -= (temp_value[2]<<2) / Sensor_ADC_threshold[2]; temp_position += (temp_value[3]<<2) / Sensor_ADC_threshold[3]; temp_position += (temp_value[4]<<4) / Sensor_ADC_threshold[4]; temp_position += (temp_value[5]<<7) / Sensor_ADC_threshold[5]; return(temp_position); }
21
- 21 - Sensing Algorithm – 비교식 + 광량식 비교식 + 광량식 –On-Off 로 라인 위에 있는 센서들을 인식 – 실제 라인에 있는 센서들의 ADC 값들만을 가지고 위치 구함 – 유효한 센서의 ADC 값을 계산하므로 계산량이 줄어든다.
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.