Skocz do zawartości

STM32F3DISCOVERY PWM ADC i DMA


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 to post
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 to post
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 to post
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 to post
Share on other sites

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.