Технический форум по робототехнике.
SkyStorm писал(а):Маладец!!! Давно собирался это сделать но все руки не доходили.
Сделай серию измерений м шагом 5 см и выложи пожалуста суда в след. виде
Реальное растояние; Расчитанное растояние; Значение ADC
Я беру на себя обязательство оформить это в Вике по типу странички [[GP2D12]].
И еще я не понял какие у тебя проблеммы с функцией Sharp_d12???
Vout = Vout1 + B -АДЦ
Range1 = M / Vout-по идее реальное расстояние
Range = Range1 - K -и рассчитанное
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
$regfile = "m16def.dat"
$crystal = 16000000
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
Const M = 10000
Const K = 0
Const B = -40
Local Range As Word , Vout As Word , Vout1 As Word
Start Adc : Vout = Getadc(adc_chanel)
Stop Adc
If Vout < 160 Then
Sharp_d12 = 0
Else
Vout1 = Vout + B ' M/(Vout+B)
Sharp_d12 = Range - K
End If
End Function
'Начало программы
'Обьявление функции
Declare Function Sharp_d12(byval Adc_chanel As Byte) As Byte
'Тело программы
'Вызов Sharp_d12
'Тело функции
Function Sharp_d12(byval Adc_chanel As Byte) As Byte
...
End Function
M=20000; B=-75; K=0
V R Real
971 22.32 20
774 28.61 30
601 38.02 40
477 49.75 50
410 59.70 60
358 70.67 70
307 79.74 80
284 88.51 90
255 102.77 100
246 108.18 110
232 117.83 120
'-------------------------------------------------------------------------------
$regfile = "m16def.Dat" ' мк ATmega16
$crystal = 16000000 ' частота кварца 16мГц
'-------------------------------------------------------------------------------
'-------------------------------- LCD-дисплей-----------------------------------
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки
'Библиотека lcd4.lbx использует следующее подключение:
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой
'-------------------------------------------------------------------------------
'----------------------------Константы и переменные-----------------------------
'Формула: R=M/(V+B)-K
Const M = 20000
Const K = 0
Const B = -75
Dim Range As Word , Range1 As Single , Vout As Word , Vout1 As Word , M1 As Word
'-------------------------------------------------------------------------------
'--------------------------------Настройка ADC----------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal
'-------------------------------------------------------------------------------
'--------------------------------------------- ----------------------------------
'Далее перед вывод информации на дисплее отключаем курсор,
'если этого не сделать он будет мешаться в виде такого
' знака "_". И делаем очистку с помощью команды "Cls".
Cursor Off 'отключаем отображение курсора на LCD
Cls 'очитка дисплея
Locate 1 , 5 'позиция курсора(1-строка, 5-начало надписи с 5-ого знакоместа)
Lcd "RoboHome" 'выводим надпись
Locate 2 , 4 ' позиция курсора(2-строка, 4-начало надписи с 4-ого знакоместа)
Lcd "Sharp test" 'выводим надпись
Waitms 2 'задержка 2 секунды
'-------------------------------------------------------------------------------
'Начало цикла основной программы
Do
Start Adc : Vout1 = Getadc(0) 'Запускаем ADC на PA0
Stop Adc 'Останавливаем ADC
Vout = Vout1 + B
If Vout < 325 Then : M1 = M - 1500 : Else : M1 = M : End If
Range1 = M1 / Vout
Range = Range1 - K
Cls 'очитка дисплея
Locate 1 , 1 ' позиция курсора
Lcd "Real=" ; Range ; "cm" ; " M1=" ; M1 ; "" 'выводим результат преобразования на ЖК
Locate 2 , 1 ' позиция курсора
Lcd "Vout=" ; Vout1 ; " " ; "R=" ; Range1 ; "" 'выводим результат преобразования на ЖК
Waitms 100 ' зедержка 0,1 секунды
Loop
End
'--------------------------------Настройка ADC----------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal
'-------------------------------------------------------------------------------
Выбор опорного сигнала
Это максимальное напряжение, которое будет взято за максимум при измерениях. Опорное напряжение должно быть как можно стабильней, без помех и колебаний — от этого кардинальным образом зависит точность работы АЦП. Задается он в битах REFS1..0 регистра ADMUX.
[...удалил...]
* REFS1..0 = 11 - внутренний источник опорного напряжения на 2.56 вольт. Честно говоря, качество этого источника мне сильно не понравилось. С ним показания АЦП плавают как говно в проруби. Но если невозможно обеспечить гладкую и стабильную подачу напряжения на AREF или AVCC то прокатит. Кстати, внутренний ИОН подключен к выводу AREF так что можно повесить туда кондер и попробовать его чуть чуть сгладить. Немного, но помогает.