Skocz do zawartości

MR1979

Użytkownicy
  • Zawartość

    10
  • Rejestracja

  • Ostatnio

Reputacja

9 Neutralna

O MR1979

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Gdynia

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Wyrazistość obrazu nie zależy od siły podświetlania. Poeksperymentuj z kontrastem. Poszukaj linijki: lcd_cmd(0x80 | 0x2f); //Ustawienie kontrastu i zmień 0x2f na inna wartość, np: lcd_cmd(0x80 | 0x3f); //Ustawienia kontrastu Pozdrawiam, Marek
  2. @atMegaTona Chcę wszystko zaprojektować i zbudować sam. W celach edukacyjnych. Nie chcę kupować gotowych modułów. STM6600 lub coś podobnego chcę dodać w późniejszym etapie bo wydaje mi się ciekawym układem i daje między innymi następujące możliwości: + Włączenie układu jednym przyciskiem (krótkie wciśnięcie) + Wysłanie przerwania do mikrokontrolera gdy krótko wciśniemy przycisk POWER (np w celu zapisania danych do EEPROM przed wyłączeniem) + Możliwość wywołania hard reset długim przytrzymaniem przycisku POWER (przydatne gdy układ się zawiesi a urządzenie jest zabudowane i nie ma łatwej możliwości odłączenia baterii) + Automatyczne wyłączenie układu gdy poziom baterii spadnie poniżej dozwolonego + Możliwość kontroli stanu zasilania przez mikrokontroler + Możliwość wywołania wyłączenia zasilania układu z poziomu mikrokontrolera Tak więc możliwości są duże i chciałbym się tym układem pobawić. Na razie w celach edukacyjnych.
  3. Jeszcze wracając do pierwszego postu. Rozważam dwie opcje: 1. Przetwornica DC/DC połączona równolegle z ładowaniem oraz baterią: + Łatwiejsza konstrukcja - Wciąż nie jestem pewien czy takie połączenie jest prawidłowe (jak zachowa się logika układu ładującego gdy będzie ładował baterię i zasilał przetwornicę jednocześnie ?) 2. Przetwornica odłączana MOSFETem w momencie podłączenia zasilania USB: + W momencie podłączenia zasilania przetwornica i ładowarka działają niezależnie (jestem pewien że logika ładowarki będzie działać prawidłowo) - Prąd zasilania przetwornicy oraz ładowarki sumują się więc istnieje ryzyko przeciążenia portu USB. Może jakiś bardziej doświadczony kolega skomentuje?
  4. @Gieneq Możliwe że nie wyraziłem moich zamiarów jasno. Pisząc moduł miałem na myśli część układu zasilania który chcę zbudować. Nie chcę kupować gotowych modułów zasilania. Wracając do projektu.... Przeglądałem ofertę w sieci i wstępnie wybrałem następujące układy ([+] zalety [-] wady): 1. Charger IC - TP4056 + Dostępny w ilościach detalicznych + Łatwa w montażu obudowa SOP-8 + Wymaga niewielu dodatkowych elementów do działania + Można płynnie zmieniać prąd ładowania zależnie od potrzeb nawet do 1A + Możliwość kontroli temp baterii (opcjonalnie) + Niska cena - Nie wiem jak z jakością tego układu, mało znany chiński producent 2. DC/DC Converter - LTC3440EMS + Dostępny w ilościach detalicznych + Łatwa w montażu obudowa MSOP-10 + Wymaga niewielu dodatkowych elementów do działania + Napięcie wejściowe 2,5 - 5,5V + Napięcie wyjściowe 2,5 - 5,5V (można dowolnie zmieniać zależnie od potrzeb) + Prąd wyjściowy do 600mA + Możliwość kontroli układu przez wejście ~SHDN (shut down) 3. Power button controller - Tu wciąż szukam układu. Na razie znalazłem dwa: STM6600 + dostępny w ilościach detalicznych + wiele ciekawych opcji w połączeniu z mikrokontrolerem - bez Hot Air raczej nie przylutuję - nigdzie w sklepach nie znalazłem przejściówki TDFN12 -> DIP do prototypowania (może ktoś widział? ma na sprzedaż?) - wysoka cena MAX16054 + Łatwa do lutowania obudowa SOT23 - w ilościach detalicznych praktycznie niedostępny w Polsce - dużo mniejsze możliwości niż STM6600 - wysoka cena (wyższa nawet niż STM6600)
  5. Witam! Planuję zaprojektować zasilanie 3,3V do przyszłych budowanych układów. Wymagania: - Max prąd na wyjściu 250mA - Bateria Li-Po 3,7V - Ładowanie przez USB - Możliwie mały - czyli układy SMD - Możliwy do ręcznego polutowania bez Hot Air - Max prąd pobierany z USB - 500mA. (Wiem, że prawidłowo układ powinien pobierać 100mA a później dokonać identyfikacji portu USB i przełączyć się na 500mA, ale na początek nie chcę komplikować układu). Zamierzam skorzystać z jedno-układowych modułów ładowania z USB oraz przetwornicy DC/DC (step up/down). Nigdy nie budowałem ładowarki USB i zasilania z baterią w jednym urządzeniu, dlatego na początek chciałbym potwierdzić ogólny układ blokowy (w załączniku). Czy rzeczywiście wystarczy równolegle połączyć moduł ładowarki, baterię i przetwornicę? Czy tak podłączony układ ładujący będzie działać prawidłowo w czasie gdy jednocześnie będziemy zasilać odbiornik? Myślałem jeszcze nad drugą opcją, żeby na czas podłączenia zasilania USB, przetwornicę odciąć od baterii (np tranzystorem MOSFET) i zasilać bezpośrednio. Tylko jak wtedy ograniczyć max prąd pobierany z USB.
  6. Dzięki! Jak tylko wymyślę jak sterować głośnikiem (obsługa DAC) to dodam loop z Dr Dre - "The Next Episode" do zwycięskiej planszy Przy kodowaniu PCM 8bit/8kHz dla 5s wyjdzie jakieś dodatkowe 40kB.
  7. Mając wyświetlacz od starej dobrej Nokii musiałem napisać grę w węże Poniżej rezultat:
  8. W zadaniu gdzie kopiowane są dane z pamięci do pamięci można jeszcze przyspieszyć cały proces 4-krotnie przez kopiowanie bloków po 4 bajty jednocześnie (DMA_PDATAALIGN_WORD zamiast DMA_PDATAALIGN_BYTE). Trzeba tylko pamiętać żeby zmieną BUFFER_SIZE podzielić przez 4 (przesunąć logicznie o 2 bity w prawo). Fragmenty kodu przed zmianą: void copy_dma() { HAL_DMA_Start(&dma, (uint32_t)src_buffer, (uint32_t)dst_buffer, BUFFER_SIZE); HAL_DMA_PollForTransfer(&dma, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); } dma.Instance = DMA1_Channel1; dma.Init.Direction = DMA_MEMORY_TO_MEMORY; dma.Init.PeriphInc = DMA_PINC_ENABLE; dma.Init.MemInc = DMA_MINC_ENABLE; dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; dma.Init.MemDataAlignment = DMA_PDATAALIGN_BYTE; dma.Init.Mode = DMA_NORMAL; dma.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&dma); Fragmenty kodu po zmianie: void copy_DMA(void) { HAL_DMA_Start(&dma, (uint32_t)src_buffer, (uint32_t)dst_buffer, (BUFFER_SIZE >> 2)); HAL_DMA_PollForTransfer(&dma, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); } dma.Instance = DMA1_Channel1; dma.Init.Mode = DMA_NORMAL; dma.Init.Direction = DMA_MEMORY_TO_MEMORY; dma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; dma.Init.MemInc = DMA_MINC_ENABLE; dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; dma.Init.PeriphInc = DMA_PINC_ENABLE; dma.Init.Priority = DMA_PRIORITY_HIGH; HAL_DMA_Init(&dma); Mam nadzieję że komuś się ta informacja przyda. Pozdrawiam
  9. Zamiast pisać: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); } Można napisać: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } Zrobiłem też mały eksperyment i postanowiłem sprawdzić jaka jest największa częstotliwość wywołania przerwania TIM2_IRQHandler. Okazuje się że nie za duża (też zależy do jakich zastosowań). Przy taktowaniu 64MHz udało mi się uzyskać stabilne 90kHz (czyli przerwanie wywoływane z częstotliwością 180kHz bo na pełen okres w przebiegu prostokątnym potrzeba dwóch wywołań) Dalsze zmniejszanie wartości Init.Prescaller lub Init.Period powodowało że układ oscylował z częstotliwością około 98KHz i wartość ta nie korespondowała z teoretyczną wartością wyliczoną dla zadanej konfiguracji Prescaller/Period. W przypadku sprzętowego PWM można podkręcić timer nawet do 4MHz (dla 64MHz zegara). Nawet przy tak dużej częstotliwości otrzymamy w miarę regularny sygnał prostokątny. Na oscyloskopie jednak widać już dość znaczący wpływ "signal overshoot" na poziomie 0.7V. Do większości zastosowań wystarczy jednak PWM o częstotliwości rzędu kHz. Pozdrawiam
  10. Witam, Również miałem podobny odczyt ADC=65. Debugger pokazał że nie udało się zainicjować przetwornika (HAL_ADC_Init(&adc); zwracał wartość HAL_ERROR). Sprawdziłem kod źródłowy, a nawet zrobiłem copy/paste ze strony kursu. Wciąż ten sam rezultat. Ostatecznie wygenerowałem kod inicjacji przetwornika z CubeMX i niespodzianka... wszystkie parametry zainicjowane w taki sam sposób. Była jednak mała różnica która rzuciła się w oczy. Otóż w kodzie generowanym przez CubeMX wszystkie zmienne konfiguracyjne (np ADC_HandleTypeDef) są zerowane podczas deklaracji. Dodanie "= {0}" do deklaracji ADC_HandleTypeDef rozwiązało problem. Wygląda na to że przy deklaracji zmiennej wcale nie ma gwarancji że wszystkie jej wartości będą wynosić 0. Warto więc o to zadbać. Poza tym bardzo fajny kurs. Pozdrawiam, Marek.
×
×
  • Utwórz nowe...