GP2D12 — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(ИК Дальномеры Sharp GP2D12 и GP2Y0A21)
 
(не показаны 2 промежуточные версии 1 участника)
Строка 5: Строка 5:
 
* Минимальное расстояние: '''10 см'''
 
* Минимальное расстояние: '''10 см'''
 
* Максимальное расстояние: '''80 см'''
 
* Максимальное расстояние: '''80 см'''
* Напряжение питания: '''4.5 - 5.5В'''
+
* Напряжение питания: '''4.5 - 5.5В''' - это очень важно!
 +
* Уровень сигнала: '''3.1 - 0.4В'''
 
* Потребление типовое: '''33мА'''  
 
* Потребление типовое: '''33мА'''  
 
* Потребление максимальное: '''50мА'''
 
* Потребление максимальное: '''50мА'''
Строка 29: Строка 30:
 
* k = 0
 
* k = 0
 
[[Файл:GP2D12_normalization_ok.jpg]]<br>
 
[[Файл:GP2D12_normalization_ok.jpg]]<br>
Пример кода на Bascom-AVR
+
Тестовая программа на Bascom-AVR
 
<source lang="vb">
 
<source lang="vb">
Function Sharp_d12(byval Adc_chanel As Byte) As Byte
+
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 M = 10000
 
Const K = 0
 
Const K = 0
 
Const B = -40
 
Const B = -40
 
Local Range As Word , Vout As Word , Vout1 As Word
 
Local Range As Word , Vout As Word , Vout1 As Word
   Start Adc : Vout = Getadc(adc_chanel)                   'Sharp connected for example to PA=0(ADC0)
+
  Vout = 0
 +
   Start Adc : Vout = Getadc(adc_channel)                   'Sharp connected to PA=0(ADC0)
 
   Stop Adc
 
   Stop Adc
   If Vout < 160 Then                                       ' if les 160 its out of range
+
   If Vout < 160 Then
 
     Sharp_d12 = 0
 
     Sharp_d12 = 0
 
   Else
 
   Else
Строка 44: Строка 84:
 
   Range = M / Vout1                                        ' M/(Vout+B)
 
   Range = M / Vout1                                        ' M/(Vout+B)
 
   Sharp_d12 = Range - K                                    ' Range = M/(Vout+B)-K
 
   Sharp_d12 = Range - K                                    ' Range = M/(Vout+B)-K
 +
  Sharp_d12 = Low(sharp_d12)
 +
  Print "Sharp_d12 " ; Sharp_d12 ; " Vout" ; Vout
 
   End If
 
   End If
 
End Function
 
End Function
 
</source>
 
</source>

Текущая версия на 13:46, 17 марта 2012

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

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

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


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

<math>R = \frac{m'}{V + b'} - k</math>

Применение для 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 <source lang="vb"> Const Device = 1 'MiniBot Version 1 or 2 $regfile = "m32def.dat"

  1. if Device = 1

' Set configuration for MB1

  $prog &HFF , &HE4 , &HD9 , &H00
  $crystal = 8000000
  $baud = 9600
  1. else

' Set configuration for MB2

  $prog &HFF , &HBD , &HC9 , &H00
  $crystal = 7372800
  $baud = 115200
  1. 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 </source>