GP2D12

Материал из roboforum.ru Wiki

Перейти к: навигация, поиск

ИК Дальномеры Sharp GP2D12 и GP2Y0A21

Итак немного подробнее о данных дальномерах. Общие данные для всей серии дальномеров Sharp.
Характеристики:

  • Минимальное расстояние: 10 см
  • Максимальное расстояние: 80 см
  • Напряжение питания: 4.5 - 5.5В - это очень важно!
  • Уровень сигнала: 3.1 - 0.4В
  • Потребление типовое: 33мА
  • Потребление максимальное: 50мА
  • Полный цикл измерения: 39 ms
  • Диаметр луча GP2D12: 6 см на удалении 80 см, данные требуют проверки
  • Диаметр луча GP2Y0A21: 12 см на удалении 80 см, данные требуют проверки


Выход с дальномера аналоговый с нелинейной характеристикой(ссылка).
Для получения линейной характеристики применяется либо табличный метод либо нормализация(ссылка). Формула нормализации после преобразования (см. ссылки)

R = \frac{m'}{V + b'} - k

Применение для 10 bit АЦП (0..1023) по данным Acroname:

  • m' = 6787
  • b' = − 3
  • k = 4

Но то ли датчики поменялись с тех пор или процессора на 3 вольта по другому обрабатывают АЦП но получаем след. результат Файл:GP2D12_normalization.jpg
Если взять (спасибо DeaD'у)

  • m' = 10000
  • b' = − 40
  • k = 0

Файл:GP2D12_normalization_ok.jpg
Тестовая программа на Bascom-AVR

Const Device = 1                                            'MiniBot Version 1 or 2
$regfile = "m32def.dat"
 
#if Device = 1
' Set configuration for MB1
   $prog &HFF , &HE4 , &HD9 , &H00
   $crystal = 8000000
   $baud = 9600
#else
' Set configuration for MB2
   $prog &HFF , &HBD , &HC9 , &H00
   $crystal = 7372800
   $baud = 115200
#endif
 
 
$hwstack = 32                                               'default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40                                             'default use 40 for the frame space
 
Declare Function Sharp_d12(byval Adc_channel As Byte) As Byte
 
Config Adc = Single , Prescaler = Auto , Reference = Internal
 
Enable Interrupts
Dim R As Byte , Channel As Byte
 
Print "Start Sharp Test"
 
Do
   For Channel = 0 To 7
     R = 0
     R = Sharp_d12(channel)
     Print "ADC chenel= " ; Channel ; ", Sharp L= " ; R
   Next
  Wait 5
Loop
 
Function Sharp_d12(byval Adc_channel As Byte) As Byte
Const M = 10000
Const K = 0
Const B = -40
Local Range As Word , Vout As Word , Vout1 As Word
   Vout = 0
   Start Adc : Vout = Getadc(adc_channel)                   'Sharp connected to PA=0(ADC0)
   Stop Adc
   If Vout < 160 Then
     Sharp_d12 = 0
   Else
   Vout1 = Vout + B                                         ' (Vout+B)
   Range = M / Vout1                                        ' M/(Vout+B)
   Sharp_d12 = Range - K                                    ' Range = M/(Vout+B)-K
   Sharp_d12 = Low(sharp_d12)
   Print "Sharp_d12 " ; Sharp_d12 ; " Vout" ; Vout
   End If
End Function
Источник — «http://roboforum.ru/wiki/GP2D12»