Skocz do zawartości

STM32 generowanie przebiegów do sterowania torami podczerwieni


padus

Pomocna odpowiedź

Potrzebuję zrobić potrójną barierę podczerwoną. Mniej więcej wygląda to tak:

cała płytka:

2.thumb.jpg.32c9bdb8122c4b81230ab3804a09f906.jpg

D2, D3, D4 to potrójny nadajnik podczerwieni, częstotliwość nośna 38kHz.

3.thumb.jpg.064f3ebfa8f3353aadb5ce14952473e0.jpg

Trzy odbiorniki podczerwieni:

4.thumb.jpg.2e95903a898b5059d67d54cb9933b9c2.jpg

Piny RX1, RX2 oraz RX3 są analizowane przez mikrokontroler i załączają silnik 24DC.

Komplet obejmuje zasilacz 24/4 DC, sterowanie na atmega328p oraz płytkę z podczerwienią:

1.thumb.jpg.4694b005c4465bc40ce173db517182fa.jpg

 

Jest to wersja 4.0a więc przerabiałem już dużo innych opcji w stylu czujniki odbiciowe, pojedynczy tor itd. i obecne rozwiązanie wydaje się w pełni sprostać moim wymaganiom. W tej chwili działa to tak, że na raz świecą 3 diody LED. Do generowania impulsów jest używany poczciwy '555. Czujniki jak "widzą" diody to mają wyjścia ustawione na zero, jeżeli jakiś obiekt je zasłania to wtedy mam jedynkę.

 

Wszystko działa jak należy ale przerobiłem właśnie kurs z nukleo STM32L476RG i zastanawiam się nad tym czy w ramach testu nie zagonić do tego STM32. Znalazłem taki całkiem sympatyczny układ za 8zł i postaram się to na nim ruszyć. Chciałbym zlikwidować płytkę z atmega328p oraz '555 i całe sterowanie wsadzić do STM32. I tutaj mam dylemat.

Chcę sterować diodami na zasadzie multipleksowania, tzn. na raz świeci tylko jedna dioda. Coś jak na poniższym rysunku:

Screenshot_1.thumb.jpg.99733f7cc7178b44fa0eeacb217b8572.jpg

 

Mam taki pomysł aby utworzyć tabelę typu:

 

static const uint16_t init_table[] = {

0x01,          //led1

0x00,         //przerwa

0x02,         //led2

0x00,         //przerwa

0x04,         //led3

0x00,         //przerwa

};

i zagonić DMA aby cyklicznie wyrzucał to na port.

 

Próbowałem to zrobić tak:

- uruchomiłem TIM

- dla danego TIM uruchomiłem DMA

- wyłączyłem przerwania od DMA

- ustawiłem kierunek Memory to peripheral

No i teraz muszę podać adres bufora, 6 danych i gdzie to ma być wysyłane, tylko nie mam pojęcia jak to zrobić i czy się da ?

 

 

 

Edytowano przez padus
Link do komentarza
Share on other sites

Udało się.

Zastosowałem dodatkowo jeden scalak za 50 groszy i działa.

1.thumb.jpg.755660a966ba40ec5768ea8185b90e0f.jpg

 

Tutaj jest film pokazujący jak działa układ przy zwolnionym zegarze.

 

Wszystko dzieje się sprzętowo. Wykorzystuję dwa kanały licznika TIM3 w trybie PWM. Jedyne linie kodu to:

  HAL_TIM_Base_Start_IT(&htim3);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

Reszta to ustawienia w CubeMX.

Dodatkowy scalak to 74HC00, który robi prosty dekoder.

2.thumb.jpg.5159afb1cd068bb7aaea1e98a3e51bcc.jpg

 

 

 

 

 

Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.