Skocz do zawartości

STM32F3DISCOVERY PWM ADC i DMA


andzrej

Pomocna odpowiedź

Programuję w STM32F3Discovery licznik dla PWM oraz przetwornik ADC. Mam kłopot z ustawieniem obu na pracę DMA tak aby sygnał ADC w DMA sterował wypełnieniem PWM. Oba nie chcą pracować równocześnie.

Taki program pracuje w pętli pliku main

while(1){

void Turn(void) {
    duty = pomiarADC;
    HAL_Delay(100);
    HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, &duty, 1);
    HAL_Delay(100);
    HAL_ADC_Start_DMA(&hadc1, &pomiarADC, 1);
    HAL_Delay(100);
}

}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

Cóż, tego co zaprezentowałeś nie można nazwać programowaniem z czystym sumieniem. Poza tym nie zamieściłeś całego kodu.

Z logicznego punktu widzenie nie powinno to działać następująco? : uruchomienie ADC w trybie ciągłym (przed pętlą zdarzeń), okresowe sprawdzanie czy wartość ADC różni się od poprzednio pobranej i ewentualna zmiana wypełnienia PWM.

https://www.st.com/resource/en/application_note/dm00157785-stm32f3-series-peripheral-interconnect-matrix-stmicroelectronics.pdf

Popatrz sobie jak są połączone urządzenia peryferyjne i przydziel odpowiednie kanały DMA tak, żeby konfliktu nie było. Jeśli używasz CubeMX to powinien wyświetlić konflikty. Ponadto polecam zapoznać się z dokumentacją funkcji HAL'a bo być może nie zainicjalizowałeś odpowiednio DMA i reszty, wybacz ale nie chce mi się tego znowu czytać za Ciebie.

Cóż STM to nie arduino, niema łatwo 😄 ale pociesze Cię tym, że jak już raz zrobisz to później wystarczy kopiować do kolejnych projektów.

 

Link do komentarza
Share on other sites

Dnia 17.07.2020 o 20:12, andzrej napisał:

Taki program pracuje w pętli pliku main

Ale przecież ten program nic nie robi. Definiuje tylko funkcję, ale nigdzie jej nic nie woła. Ja się dziwię, że to się skompilowało...

Link do komentarza
Share on other sites

Dnia 17.07.2020 o 20:12, andzrej napisał:

Programuję w STM32F3Discovery licznik dla PWM oraz przetwornik ADC. Mam kłopot z ustawieniem obu na pracę DMA tak aby sygnał ADC w DMA sterował wypełnieniem PWM. Oba nie chcą pracować równocześnie.

Taki program pracuje w pętli pliku main


while(1){

void Turn(void) {
    duty = pomiarADC;
    HAL_Delay(100);
    HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, &duty, 1);
    HAL_Delay(100);
    HAL_ADC_Start_DMA(&hadc1, &pomiarADC, 1);
    HAL_Delay(100);
}

}

Poprawiłem program i chodzi jak chciałem.

void Turn(void) {

    HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, &pomiarADC, 1);
    HAL_ADC_Start_DMA(&hadc1, &pomiarADC, 1);

}

@atMegaTona 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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