Skocz do zawartości

[KEIL] [LPC2138] Jak mierzyć 2 napięcia jednocześnie?


Pomocna odpowiedź

Napisano

Witam

Dopiero zaczynam przygodę z mikokontrolerami, zakupiłem ZL9ARM + LPC2138, w przykładowym programie mogę zmierzyć napięcie za pomocą ADC i wyswietlić go na LCD, natomiast mam pytanie jak zmierzyć 2-ie wartości napięcia jednocześnie, np.drugie napięcie na porcie 0.29

Mam taki kod do pomiaru pojedynczego napięcia

int main (void)
{
unsigned int val;

PINSEL1 &= !(BIT26 | BIT27 | BIT28 | BIT29);

PINSEL1 |= BIT24; // P0.28 = AD0.1
AD0CR = 0x002E0402; // AC: 10 bit AD0.1 @ 3MHz

LCD_init();

while (1)
{
AD0CR |= 0x01000000; // start konwersji AC
do
{
val = AD0DR; // odczytaj wynik konwersji
} while ((val & 0x80000000) == 0); // czekaj na koniec konwersji AC
AD0CR &= ~0x01000000; // koniec konwersji AC
val = (val >> 6) & 0x03FF;

LCDTextXY(0,1, "AIN0 = 0x");
LCD_Hex((val >> 8) & 0x0F); // 1 cyfra
LCD_Hex((val >> 4) & 0x0F); // 2 cyfra
LCD_Hex(val & 0x0F); // 3 cyfra

}
}

jak bardzo "jednoczesnie"

ADC jest wielokanalowy wiec jezeli roznica w czasie pomiaru rzedu kilkunastu-kilkudziesieciu ns Cie satysfakcjonuje to nie ma problemu 🙂

Jezeli faktycznie rownoczesnie to 2 ADC konieczne.

Wybacz, ale który ADC w mikrokontrolerze zrobi pomiar w kilkadziesiąt ns?

Standardowo najszybsze jakie znam robią pomiary z prędkością 1MHz, czyli 1000ns=1us...

nie chodizło mi o dosłownie "równocześnie 2 napięcia" rozumiem że musi być jakaś różnica czasowa, chodzi mi o to jak w kodzie włączyć np 2 kanał na porcie 0.29

Tak jak pisałem jak masz w mikrokontrolerze 2 ADC to nie musi być różnicy czasowej.

Nie znam tego mikrokontrolera, ale z tego co widzę to w rejestrze AD0CR ustawiasz który kanał ma być kanałem wejściowym ( AD0CR = 0x002E0402; // AC: 10 bit AD0.1 @ 3MHz ). Zmień odpowiednio rejestr AD0CR i wywołaj kolejną konwersję (patrz dokumentacja).

ok poszukam, jeszcze jedno pytanie, o co chodzi w linijkach

PINSEL1 &= !(BIT26 | BIT27 | BIT28 | BIT29);

PINSEL1 |= BIT24; // P0.28 = AD0.1

nie bardzo to rozumiem

Ustawiasz bity 26/27/28/29 na zero a bit24 na 1 nie zmieniając ustawienia innych bitów w pinsel1.

Prawdopodobnie ustawiasz które piny to wejście, a który to wyjście (strzelam, tak jak mówiłem nie znam mikrokontrolera, ale nazwa PINSEL1 na tego typu rzecz jest trochę dziwna).

Rejestr PINSEL służy do wyboru alternatywnych funkcji portu. Taką jest właśnie wejście ADC. PINSEL0 to młodsza cześć, PINSEL1 starsza.

PINSEL1 |= BIT24; // P0.28 = AD0.1 

Oznacza podłączenie wejścia ADC 0.1 do pinu P0.28.

Jeśli chcesz używać drugiego kanału, musisz przede wszystkim najpierw podłączyć go do danego pinu.

PINSEL1 |= BIT26; // P0.29 = AD0.2 

czyli rozumiem, żeby teraz zmierzyć "coś" na porcie 0.29

muszę

PINSEL1 &= !(BIT24 | BIT25 | BIT28 | BIT29);

PINSEL1 |= BIT26; // P0.29 = AD0.1 

natomiast

AD0CR = 0x002E0402; // AC: 10 bit AD0.1 @ 3MHz 

i reszta kodu pozostaje bez zmian?

[ Dodano: 23-08-2011, 10:37 ]

mam 🙂 włączyłem AD1CR

PINSEL0 |= (BIT16 | BIT17);		 // P0.8 = AD1.1	
PINSEL1 |= BIT24;				 // P0.28 = AD0.1

 AD0CR   = 0x002E0402;              // AC: 10 bit AD0.1 @ 3MHz		   
 AD1CR =   0x002E0402;              // AC: 10 bit AD1.1 @ 3MHz

takie niby nic, a jednak dla początkującego to 2 dni szukania 🙂

wielkie dzięki za pomoc 🙂

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...