HAL810 - hallotron

To nie jest miejsce tylko dla początkujących, wszyscy jesteśmy w czymś początkujący i wymieniamy się doświadczeniami.
Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

HAL810 - hallotron

Postautor: gaweł » piątek 05 lis 2021, 22:45

Jeszcze Polska nie umarła,
póki my żyjemy...


Zabawa z polem magnetycznym

hal810.JPG


Swego czasu miałem pewien problem inżynierski, który jak później się okazało nie był aż taki na jak wyglądał na pierwszy rzut oka. Jednym z zadań, jakie miało spełniać pewne urządzenie pomiarowe był pomiar prądu jaki pobiera z zasilacza jakiś tam system. Nie było by w tym nic nadzwyczajnego, gdyby nie to, że mierzony prąd (stały, czyli DC) jest rzędu kilkudziesięciu amperów. Już samo doprowadzenie takiego prądu staje się problematyczne (złączki, kabelki, ścieżki na PCB). Gdyby to był prąd przemienny, to bym zastosował coś w rodzaju przekładnika prądowego. Tu jest prąd stały a ten słabo poddaje się takim operacjom. Po iluś tam próbach różnego rozwiązania stanęło na pomiarach hallotronowych. Co prawda tytułowy bohater HAL810 nie jest klasycznym hallotronem ale ma to coś w swoich genach. Otóż pan HAL810 jest programowalnym liniowym sensorem bazującym na efekcie Halla. Określenie „programowalny” odnosi się do możliwości zmiany czułości sensora. Fabrycznie ma on 150mT, ale daje się wyostrzyć zmysły na 30mT. Rzeczywisty hallotron ma 4 wyprowadzenia, ten (HAL810) ma 3 nóżki i w rzeczywistości jest całkiem sporym układem pomiarowym napięcia Halla i „wypuszczającym” wynik w postaci sygnału PWM. Sygnał użytkowy jest w postaci współczynnika wypełnienia sygnału PWM i zmienia się od 10% do 90%. W stanie „obojętnym” (czyli w sytuacji braku pola magnetycznego – od ziemskiego niestety nie da się tak łatwo uciec) na wyjściu jest sygnał PWM o wypełnieniu 50%. Realizując pomiar współczynnika PWM można uzyskać informację o wartości i kierunku pola: od obliczonej wartości odjąć 50% i wartości ujemne to przykładowo N, dodatnie → S, wartość odnosząca się do pola to wartość bezwzględna z uzyskanej liczby.
Starzy wyjadacze wiedzą coś na temat efektu Halla, więc mogą pominąć tekst do kolejnej części. Zapewne znajdzie się grupka Czytelników, która chętnie zapozna się z istotnymi cechami hallotrona, więc zapraszam ich do dalszej lektury.
Hallotron to sensor pola magnetycznego wykorzystujący zjawisko Halla wynikające z oddziaływania pola magnetycznego na przewodnik, przez który płynie prąd. Ma najczęściej kształt płytki prostopadłościennej, na której krawędziach umieszczone są cztery elektrody. Dwie z nich służą do doprowadzenia prądu ze źródła zewnętrznego – są to elektrody prądowe, pozostałe dwie elektrody „punktowe” (napięciowe) znajdują się na środku dłuższych krawędzi płytki. Mechanizm zjawiska Halla polega na wykorzystaniu zmiany drogi przepływu prądu w elemencie na skutek oddziaływania pola magnetycznego (siły Lorentza). W wyniku tego oddziaływania na jednym brzegu elementu gromadzą się ładunki dodatnie, a na drugim ujemne. Powstała różnica potencjału jest napięciem Halla i przy okazji miarą natężenia pola magnetycznego.
hall_ef.png

Nie wnikając zbytnio w rachunek wektorowy, to jeżeli przez przewodnik znajdujący się w polu magnetycznym płynie prąd, to przelatujące elektrony są „zaginane” w określonym kierunku (jest taka reguła trzech palców którejś tam ręki – nigdy nie pamiętałem której, ale w iloczynie wektorowym dobrze daje radę korkociąg – reguła korkociągu). Powoduje to większą koncentrację tych żyjątek na jednym końcu. Elektrony to takie żyjątka (niektórzy nawet twierdzą, że złośliwe), które żyją sobie spokojnie w kabelkach. Dopiero jak je ktoś wkurzy to potrafią się odgryźć a zmuszone zewnętrznymi elementami jak przykładowo bateria, migrują w inne miejsca. Więc ta różnica w koncentracji prowadzi do braku równowagi co skutkuje niewielkim napięciem. Jest to właśnie napięcie Halla. Rzecz jasna jest ono dosyć anemiczne, więc dopiero współczesna elektronika potrafiła dać mu więcej siły i stworzyć z tego coś o walorach użytkowych.
To wyjaśnia (mam nadzieję), że klasyczny hallotron ma cztery nóżki.
Zmieniając kierunek pola lub kierunek prądu, napięcie Halla zmienia znak na przeciwny.
hall_ef2.png
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: HAL810 - hallotron

Postautor: gaweł » niedziela 07 lis 2021, 23:00

Parę prostych eksperymentów

Właściwie do zaprezentowania działania układu HAL810 nie są konieczne żadne dodatkowe elementy. Wystarczy podłączyć zasilanie (+5V). Jego pinologia jest następująca:
hal810.png

Przy braku pola magnetycznego układ daje wypełnienie 50%. Na szczęście nie widać by reagował na pole ziemskie. Ucieczka od ziemskiego pola może okazać się niemożliwa do wykonania. No jego czułość nie jest jakoś rewelacyjna, w końcu nie służy do budowy kompasu. Trochę byłby to słaby atut gdy wyniki pomiarów były uzależnione od orientacji geograficznej pomiernika :) .
No więc można za pomocą tego cusia poznać co nieco na temat pola magnetycznego. Mam namagnesowany śrubokręt tak, że śrubki jakoś go się trzymają. W pozycji
IMG_9459.JPG

hallotron mówi, że
MAP001.png

Przy orientacji:
IMG_9460.JPG

oscylek pokazuje:
MAP002.png

Wartość natężenia pola jakoś nie powala (we współpracy z orientacją przestrzenną). To daje jakieś wyobrażenie o kształcie pola wokół śrubokręta. Na jego czubku raczej nie ma bieguna co pozwala na wysnucie pewnych wniosków, że bieguny magnetyczne są z boku.
Można poczynić badania magnesu wyjętego z dysku twardego. Taki magnes (efekt recyklingu):
IMG_9462.JPG

daje następujące pomiary
MAP003.png

Biorąc pod uwagę fakt, że magnesik raczej należy do silnych, to szału raczej nie ma. Sugeruje to, że płaszczyzna hallotronu jest równoległa do wektora pola. Znacząco inaczej to wygląda w innej orientacji
IMG_9463.JPG

Tu oscylek informuje, że
MAP004.png

Prawie się przesterowuje. Gdzie są bieguny magnesu? Zagadka nie jest zbyt skomplikowana.

Na zakończenie, drobny filmik:
hal810.mov
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: HAL810 - hallotron

Postautor: gaweł » środa 10 lis 2021, 17:55

Stabilność pomiarowa

By stworzyć z hallotrona jakieś użyteczne „cóś”, konieczne jest stworzenie jakiegoś układu pomiarowego, którego zadaniem jest uzyskanie wartości liczbowej. Jak zwykle do tego celu najlepiej nadaje się układ prockowy, to on ma odpowiednie możliwości. Jak jest jakiś procek, to w parze z nim musi wystąpić jakiś program (dopiero taka para jest w stanie coś zdziałać). Użyję swego zestawu badawczego bazującego na procku ATMEGA32. Jego środowisko jest odpowiednio wyposażone, ma moduł alfanumeryczny LCD no i oczywista do wejścia przypięty jest hallotron.
IMG_9464.JPG

Tworzę kawałek prostej aplikacji, której zadaniem jest zmierzenie długości stanu logicznego zera i następnie logicznej jedynki. Program jest wręcz banalny i nie wymaga komentarza:

Kod: Zaznacz cały

#include <inttypes.h>
#include <avr/io.h>
#include <avr/iom32.h>
#include <avr/pgmspace.h>
#include "lcdlib.h"

#define nop() __asm__ __volatile__ ("nop")
#define HallPort      PIND
#define HallDirPort   DDRD
#define HallPinPort   2

unsigned char HelloText1 [ ] PROGMEM = "Pomiar hallotronem" ;

static uint32_t HLevelTime ;
static uint32_t LLevelTime ;
static uint32_t TotalTime ;

void LongDelay ( void )
{
  uint16_t Loop ;
  /*---------------------------------*/
  for ( Loop = 0 ; Loop < 0xF000 ; Loop ++ )
  {
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
    nop ( ) ;
  } /* for */ ;
} /* LongDelay */


void WordToStr ( uint8_t * Number ,
                 uint8_t   ConvWidth ,
                 uint8_t   EmptyCh ,
                 uint16_t  Value )
{
  uint8_t Loop ;
  uint8_t LocalBuffer [ 8 ] ;
  uint8_t LastDigit ;
  /*-------------------------------------------------------------------------*/
  if ( ConvWidth > 7 )
  {
    * Number ++ = '!' ;
    * Number = ( uint8_t ) 0 ;
    return ;
  } /* if */ ;
  for ( Loop = 0 ; Loop < ConvWidth ; Loop ++ )
    LocalBuffer [ Loop ] = EmptyCh ;
  LocalBuffer [ ConvWidth ] = 0 ;
  Loop = ConvWidth - 1 ;
  for ( ; ; )
  {
    LastDigit = ( uint8_t ) ( Value % 10 ) ;
    LocalBuffer [ Loop ] = LastDigit + ( uint8_t ) 0x30 ;
    Value = Value / 10 ;
    if ( ( ! Loop ) || ( ! Value ) )
      break ;
    Loop -- ;
  } /* for */ ;
  for ( Loop = 0 ; Loop <= ConvWidth ; Loop ++ )
    * Number ++ = LocalBuffer [ Loop ] ;
} /* WordToStr */


static void InitEnvir ( void )
{
  /*---------------------------------*/
  HallDirPort &= ~ ( ( 1 ) << HallPinPort ) ;
} /* InitEnvir */


static void WaitOnStart ( void )
{
  uint8_t PData ;
  uint8_t Bit ;
  /*---------------------------------*/
  for ( ; ; )
  {
    PData = HallPort ;
    Bit = PData & ( ( 1 ) << HallPinPort ) ;
    if ( Bit )
     break ;
  } /* for */ ;
  for ( ; ; )
  {
    PData = HallPort ;
    Bit = PData & ( ( 1 ) << HallPinPort ) ;
    if ( ! Bit )
     break ;
  } /* for */ ;
} /* WaitOnStart */


static void CountLowLevel ( void )
{
  uint8_t PData ;
  uint8_t Bit ;
  /*---------------------------------*/
  for ( ; ; )
  {
    PData = HallPort ;
    Bit = PData & ( ( 1 ) << HallPinPort ) ;
    if ( Bit )
     break ;
    LLevelTime ++ ;
  } /* for */ ;
} /* CountLowLevel */


static void CountHighLevel ( void )
{
  uint8_t PData ;
  uint8_t Bit ;
  /*---------------------------------*/
  for ( ; ; )
  {
    PData = HallPort ;
    Bit = PData & ( ( 1 ) << HallPinPort ) ;
    if ( ! Bit )
     break ;
    HLevelTime ++ ;
  } /* for */ ;
} /* CountHighLevel */


void LongWordToStr ( uint8_t * Number ,
                     uint8_t   ConvWidth ,
                     uint8_t   EmptyCh ,
                     uint32_t  Value )
{
  uint8_t Loop ;
  uint8_t LocalBuffer [ 14 ] ;
  uint8_t LastDigit ;
  /*-------------------------------------------------------------------------*/
  if ( ConvWidth > 12 )
  {
    * Number ++ = '!' ;
    * Number = ( uint8_t ) 0 ;
    return ;
  } /* if */ ;
  for ( Loop = 0 ; Loop < ConvWidth ; Loop ++ )
    LocalBuffer [ Loop ] = EmptyCh ;
  LocalBuffer [ ConvWidth ] = 0 ;
  Loop = ConvWidth - 1 ;
  for ( ; ; )
  {
    LastDigit = ( uint8_t ) ( Value % 10 ) ;
    LocalBuffer [ Loop ] = LastDigit + ( uint8_t ) 0x30 ;
    Value = Value / 10 ;
    if ( ( ! Loop ) || ( ! Value ) )
      break ;
    Loop -- ;
  } /* for */ ;
  for ( Loop = 0 ; Loop <= ConvWidth ; Loop ++ )
    * Number ++ = LocalBuffer [ Loop ] ;
} /* LongWordToStr */


static void DispData (void )
{
  uint8_t Number [ 12 ] ;
  uint16_t Val ;
  /*---------------------------------*/
  WriteChLCD ( 'L' ) ;
  LongWordToStr ( Number , 5 , ' ' , LLevelTime ) ;
  WriteTextLCD ( Number ) ;
  WriteChLCD ( ' ' ) ;
  WriteChLCD ( 'H' ) ;
  LongWordToStr ( Number ,5 , ' ' , HLevelTime ) ;
  WriteTextLCD ( Number ) ;
  Val = ( uint16_t ) ( 10000 * LLevelTime / TotalTime ) ;
  WordToStr ( Number , 3 , ' ' , Val / 100 ) ;
  WriteTextLCD ( Number ) ;
  WriteChLCD ( '.' ) ;
  WordToStr ( Number , 2 , '0' , Val % 100 ) ;
  WriteTextLCD ( Number ) ;
  WriteChLCD ( '%' ) ;
} /* DispData */


void DemoPause ( void )
{
  uint8_t Loop ;
  /*---------------------------------*/
  for ( Loop = 0 ; Loop < 10 ; Loop ++ )
    LongDelay ( ) ;
  } /* DemoPause */


int main ( void )
{
  LongDelay ( ) ;
  LongDelay ( ) ;
  LongDelay ( ) ;
  LongDelay ( ) ;
  InitEnvir ( ) ;
  InitLCDEnvir ( ) ;
  InitialiseLCD ( ) ;
  ClrScrLCD ( ) ;
  for ( ; ; )
  {
    NewLineLCD ( ) ;
    HLevelTime = 0 ;
    LLevelTime = 0 ;
    WaitOnStart ( ) ;
    CountLowLevel ( ) ;
    CountHighLevel ( ) ;
    TotalTime = HLevelTime + LLevelTime ;
    ClrScrLCD ( ) ;
    WriteTextLCDFlash ( HelloText1 ) ;
    NewLineLCD ( ) ;
    DispData ( ) ;
    DemoPause ( ) ;
  } /* for */ ;
  return ( 0 ) ;
} /* main */

IMG_9466.JPG

Przykładowo czas trwania stanu zera wynosi 2023 „jednostek magicznych” oraz czas trwania jedynki to 4254 „jednostek magicznych”. Te jednostki to liczba obrotów pętli, gdzie jest inkrementowana zmienna tak długo, jak na wejściu trwa logiczne zero. Analogicznie inna pętla inkrementuje inną zmienną do momentu, aż na wejściu pojawi się logiczne zero. Algorytm jest zbudowany w identyczny sposób, co zapewnia rzetelność pomiaru. Program jedzie na zablokowanych przerwaniach, co gwarantuje, że pomiar nie jest zaburzony wtrąceniami obsługi przerwań.
Współczynnik wypełnienia to
form.png

Jak podstawić do tej formuły dane pomiarowe, to wychodzi (przy obcięciu ułamka do dwóch miejsc po przecinku) tak jak pokazuje powyższa fotka (procek nie myli się w rachunkach :-) ).
Zostaje stworzone powtarzalne środowisko badawcze: wszystkie elementy są odpowiednio usztywnione.
IMG_9467.JPG

IMG_9468.JPG

Przekłada się to na stabilność wyników, co pokazuje kawałek filmu.
hall810-m.mov
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: HAL810 - hallotron

Postautor: gaweł » czwartek 11 lis 2021, 00:51

Układ w akcji

Praktyczne rozwiązanie wymaga utworzenia cewki pomiarowej. Robiąc tak trochę „na pałę” (bo nie ma obowiązku wyjść za pierwszym razem) nawinąłem cewkę (25 zwojów). Później się okazało, że trzeba było więcej. Puszczając przez cewkę prąd około 2A, to wypełnienie z hallotrona zmieniło się o kilkanaście procent, czyli nie został wykorzystany w pełni zakres możliwości. Więcej zwojów to większa indukcja magnetyczna czyli większy uzysk dla małych prądów (no chyba, że zależy nam na większej energetyce, to konieczny jest grubszy drut).
IMG_9474.JPG

Hallotron jest umieszczony w środku swoją płaszczyzną skierowaną poprzecznie do cewki i unieruchomiony. Całość zachowuje się jak układ liniowy (cewka powietrzna jest liniowa, HAL810 jest również liniowy).
Teraz do praktycznego wykorzystania zostaje wykorzystana funkcja liniowa za pomocą której można przekładać wartość współczynnika wypełnienia na wartość prądu płynącego przez cewkę (zamieniamy szare na złote).
Jeżeli znane są dwa punkty, to w funkcji liniowej można określić odpowiednie współczynniki i dokonać owej zamiany (szarego na złote).
interp.png

Równanie prostej ma następujące swoje współczynniki
form2.png

Oznacza to, że układ wymaga pewnej kalibracji: należy przez cewkę przepuścić dwa różne prądy i uzyskać odpowiednie dla nich wartości współczynnika wypełnienia i coś takiego zrobiłem. Ponieważ jest to jedynie prezentacja filozofii, to przy pomocy kalkulatora porachowałem je sobie i wstawiłem gotowe dane do programu. Niestety inna cewka to będą inne wartości współczynnika, no chyba że ktoś potrafi wykonać identyczną (jest zbyt wiele zależności, które trudno jest ogarnąć). Mierząc jakiś prąd za pomocą funkcji dokonywana jest transformacja do postaci docelowej.
Finalnie kilka przypadków
IMG_9470.JPG

IMG_9472.JPG

IMG_9473.JPG

Na zakończenie zauważyłem pewne zjawisko (z każdym przypadku przez cewkę nie płynął prąd). Układ był kalibrowany w następującej pozycji:
IMG_9482.JPG

Trzymając cewkę zorientowaną do góry (z płaszczyzną hallotrona równolegle do płaszczyzny stołu) pomiernik pokazał:
IMG_9480.JPG

Prostopadle do stołu i do pozycji kalibracyjnej jest
IMG_9479.JPG

Wydawało mi się, że układ nie reaguje na orientację geograficzną, a tu się okazuje, że niemożliwe staje się możliwe (no niezbadane są drogi jakimi chadzają cząstki elementarne). Cóż, jest to jakaś nowa wiedza poszerzająca dotychczasowe horyzonty...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

SuperGość
Uber Geek
Uber Geek
Posty: 2346
Rejestracja: piątek 04 wrz 2015, 09:03

Re: HAL810 - hallotron

Postautor: SuperGość » czwartek 11 lis 2021, 05:50

Jak zwykle bardzo dobry materiał :)
Aż mi się przypomniały zabawy z czujnikami izolowanymi typu LA50TP jak dobrze pamiętam, które chciałem swego czasu wykorzystać do pomiaru impulsu defi (ale to było lata temu teraz robi się to zupełnie inaczej)

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1260
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: HAL810 - hallotron

Postautor: gaweł » czwartek 11 lis 2021, 11:05

wojtek pisze:Aż mi się przypomniały zabawy z czujnikami izolowanymi typu LA50TP jak dobrze pamiętam, które chciałem swego czasu wykorzystać do pomiaru impulsu defi (ale to było lata temu teraz robi się to zupełnie inaczej)

To może sięgnij do zakamarków pamięci i napisz, to może być bardzo ciekawe i inspirujące ;)

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

SuperGość
Uber Geek
Uber Geek
Posty: 2346
Rejestracja: piątek 04 wrz 2015, 09:03

Re: HAL810 - hallotron

Postautor: SuperGość » czwartek 11 lis 2021, 11:34

To był chyba 2006 lub 2007 rok jak pogrzebałem na dysku to tylko noty katalogowe i jakieś podstawowe aplikacje które sprawdzałem znalazłem. Nawet chyba jeszcze gdzieś mam te przetworniki.


Wróć do „Podstawy elektroniki - teoria i praktyka”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości