Skocz do zawartości

Problem z ADC i CNY70


Pomocna odpowiedź

Napisano

Witam.. mam problem tego typu że... Mam napisany program niby wszystko ok...

Ale. Czujniki czytają tylko czarną linie jak są 2cm nad nią... jeżeli dam je niżej czyli tak jak ma być te 1-2mm to Atmega16 głupieje.

Zmierzyłem też napięcie wchodzące do ADC

czujniki 2mm nad:

Czarna 4,66V

Biały 1,7V

Czujniki 2cm nad:

Czarna 4,5V

Biała 4,2V

$crystal = 16000000
$regfile = "m16def.dat"


In4 Alias Portd.0
In3 Alias Portd.1
In2 Alias Portd.2
In1 Alias Portd.3
'Config Porta = Adc

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Czujnik1 As Word , Czujnik2 As Word , Czujnik3 As Word , Czujnik4 As Word , Czujnik5 As Word , Czujnik6 As Word , Czujnik7 As Word , Czujnik8 As Word
Dim Sens1 As Byte , Sens2 As Byte , Sens3 As Byte , Sens4 As Byte , Sens5 As Byte , Sens6 As Byte , Sens7 As Byte , Sens8 As Byte
Dim Offset As Byte
Offset = 0
Start Adc

Enable Interrupts



Do

Sens1 = Getadc(0)
If Sens1 > 120 Then Czujnik1 = 1 Else Czujnik1 = 0

.......

loop

......

Sprawdź sobie przez UART (albo wyświetlacz LCD) jakie wartości zwracają czujniki - tak będzie najłatwiej. Podpiąłeś wszystkie kondensatory i dławik? Napięcie jest ok czyli błąd w programie albo w połączeniach. Co znaczy "głupieje"?

Jakie masz napiecie dołączone do AREF?

Na mój gust to może być problem źle dobranego napięcia wzorcowego, z tym że nie znam się na składnie Bascom. Więc napisz jakie ustawiłeś.

Spróbuj zmienić granicę na np. 500.

Z czystej ciekawości.. spróbuj jeszcze zmienić SensX 'as Byte' na 'as Single'

Aref jest dobrze dobrane...

Problem Tkwił w granicy czyli jest na 700 i sobie już radzi:)

Drugi problem tkwił w tym ze samiast Sensx As Byte miało być Sensx As word

a przy okazji także zmieniłem Czujnikx As Word na Czujnikx As bit

Pomógł kolega z Forum "kuczus za co mu wielkie dzieki;)

Wiec program wygląda mniejwiecej tak

$crystal = 16000000
$regfile = "m16def.dat"

Dim Granica As Word
Granica = 550
Config Pind.0=output
Config Pind.1=output
Config Pind.2=output
Config Pind.3=output
Config Pind.6=input
portd.6=1

In4 Alias Portd.0
In3 Alias Portd.1
In2 Alias Portd.2
In1 Alias Portd.3

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64
Config Adc = Single , Prescaler = Auto , Reference = Avcc

Dim Czujnik1 As Bit , Czujnik2 As Bit , Czujnik3 As Bit , Czujnik4 As Bit , Czujnik5 As Bit , Czujnik6 As Bit , Czujnik7 As Bit , Czujnik8 As Bit
Dim Sens1 As Word , Sens2 As Word , Sens3 As Word , Sens4 As Word , Sens5 As Word , Sens6 As Word , Sens7 As Word , Sens8 As Word

Dim X as bit
x=1

Do
if pind.6=0 then x=0
Loop Until X = 0
x=1

Start Adc
Enable Interrupts

a robocik jeździ teraz tak....

Jest to jego 20% możliwości a spowodowane jest tym iż algorytm trzeba dopracowac;) narazie działa na 4ru CNY

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...