Skocz do zawartości

STM32F3DISCOVERY PWM ADC i DMA


Pomocna odpowiedź

Napisano (edytowany)

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

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.

 

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

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 

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