logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32G030F6P6 - projekt prostownika - problem z HardFault_Handler oraz NMI_Handler

RoMeK19 04 Kwi 2023 17:17 960 6
REKLAMA
  • #1 20524857
    RoMeK19
    Poziom 3  
    Posty: 94
    Ocena: 2
    Witam,
    Jakiś czas temu na forum pytałem o koncepcję prostownika mikroprocesorowego. Od tamtego czasu zacząłem działać i stworzyłem płytkę, wlutowałem komponenty i zacząłem pisać program i testować układy. Wszystko szło dobrze dopóki nie rozbudowałem programu i zacząłem testy pod obciążeniem. W aplikacji wykorzystuję 3 wejścia ADC do pracy z DMA: pomiar prądu (wzmacniacz (INA180A1), napięcia na wyjściu(dzielnik), oraz potencjometr do ustawienia prądu ładowania. Odczyty są w miarę okej, dane zapisuję w tablicy. Na tej podstawie zmniejszam lub zwiększam PWM tak by U_odczyt nie przekroczyło 14,8V oraz jednocześnie nie było przekroczenia I_odczyt ustawionego na podstawie I_zadane z potencjometru. Wszystko działało w miarę ok, do czasu gdy nie zwiększę prądu do 4-5A. Wtedy układ się zawiesza i wpada w HardFault_Handler lub czasem NMI_Handler. Wykluczyłem problemy z zasilaniem, na sztywno Potencjometr->PWM wszystko chodzi bez zarzutu. Próbowałem szukać przyczyny i modyfikować kod, debugować ale bezskutecznie, jestem tylko hobbystą i dopiero co zacząłem przygodę z CortexM0. Poniżej zrzuty rejestrów w momencie wykrycia HardFault przez CubeIDE oraz kod w funkcji main. Proszę o pomoc w namierzeniu problemu bo próbuję od kilku dni i nic nie mogę wymyśleć. Z góry dziękuję.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    STM32G030F6P6 - projekt prostownika - problem z HardFault_Handler oraz NMI_Handler STM32G030F6P6 - projekt prostownika - problem z HardFault_Handler oraz NMI_Handler STM32G030F6P6 - projekt prostownika - problem z HardFault_Handler oraz NMI_Handler STM32G030F6P6 - projekt prostownika - problem z HardFault_Handler oraz NMI_Handler
  • REKLAMA
  • #2 20525172
    trol.six
    Poziom 31  
    Posty: 1650
    Pomógł: 151
    Ocena: 381
    RoMeK19 napisał:
    Wykluczyłem problemy z zasilaniem, na sztywno Potencjometr->PWM wszystko chodzi bez zarzutu.

    Może by tak zasymulować potencjometrami sygnały U i I?
    .
  • REKLAMA
  • #3 20527616
    _lazor_
    VIP Zasłużony dla elektroda
    Posty: 3795
    Pomógł: 259
    Ocena: 1130
    Wywala sie zawsze w tym samym miejscu w kodzie?
  • REKLAMA
  • #4 20528507
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    volatile uint16_t adc_value[6];
    U_odczyt = adc_value[0];
    I_odczyt = adc_value[1];
    I_zadane = adc_value[2];
    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_value, 3);

    typy zmiennych ogarnij najpierw.
  • #5 20530469
    RoMeK19
    Poziom 3  
    Posty: 94
    Ocena: 2
    Jeśli chodzi o typy zmiennych to zmiana tablicy na typ uint32_t nic nie daje i powoduje tylko błędny zapis danych z ADC. Zresztą we wszystkich przykładach dotyczących ADC i DMA w stm32 widziałem rozwiązane to w ten sposób, a w Cortexie M3 zawsze działało to bez zarzutu. Co do momentu pojawiania się ErrorHander to jest on niestety losowy. Może zbyt wcześnie odrzuciłem opcję, że to wina zasilania. Po eksperymentalnym dodaniu 5x 100nF na linii 3,3V oraz zmianą 4,7uF na 100uF problem ustąpił i przy prądzie wyjściowym 6A wszystko chodzi jak trzeba. Zmieniłem także częstotliwosć kluczowania na ok 7,5 kHz na próbę. Obawiam się jednak, że przy próbie wejścia na 8-10A problem może wrócić. Pomiar linii 3,3V przed dodaniem kondensatorów wskazał na szpilki sięgające do 3,6V przy wyższych prądach co w zasadzie łapie się w granicach, w których producent deklaruje poprawną pracę urządzenia: 2-3,6V. Pytanie co jeszcze mogę poprawić jeśli chodzi o filtrację linii 3,3V bo wszystko obecnie wskazuje, że tu leży problem? Może koralik ferrytowy za stalilizatorem liniowym 3,3V?
  • REKLAMA
  • #6 20530820
    _lazor_
    VIP Zasłużony dla elektroda
    Posty: 3795
    Pomógł: 259
    Ocena: 1130
    Ja bym założył źle zaprojektowany PCB. Przy większych prądach i impulsowym przełączaniu trzeba uwzględniać pasożytnicze wartości ścieżek.
  • #7 20532714
    miszcz310
    Poziom 25  
    Posty: 717
    Pomógł: 46
    Ocena: 178
    RoMeK19 napisał:
    Pomiar linii 3,3V przed dodaniem kondensatorów wskazał na szpilki sięgające do 3,6V przy wyższych prądach co w zasadzie łapie się w granicach, w których producent deklaruje poprawną pracę urządzenia: 2-3,6V. Pytanie co jeszcze mogę poprawić jeśli chodzi o filtrację linii 3,3V bo wszystko obecnie wskazuje, że tu leży problem? Może koralik ferrytowy za stalilizatorem liniowym 3,3V?

    Nie wiem czym to mierzysz, ale jak masz zmierzone w impulsie 3,6 V to może on mieć więcej niż 3.6V. Trudno coś doradzić jeżeli nie mamy projektu płytki. Koralik oczywiście nie zaszkodzi (raczej). Mógłbyś jeszcze dodać po prostu jakiś filtr na zasilaniu procka (jakiś T albo pi z elementami RLC). Pytanie też jak masz rozwiązane sterowanie wyjściem z procesora, czy masz tam jakieś snubbery, czy robisz to przez jakiś gate-driver...

Podsumowanie tematu

✨ Użytkownik pracuje nad projektem prostownika mikroprocesorowego z wykorzystaniem STM32G030F6P6. Po rozbudowie programu i testach pod obciążeniem (4-5A) występują problemy z HardFault_Handler i NMI_Handler. W aplikacji używane są 3 wejścia ADC do pomiaru prądu (INA180A1), napięcia oraz ustawienia prądu ładowania. Problemy z zawieszaniem się układu zostały częściowo rozwiązane przez dodanie kondensatorów filtrujących na linii 3,3V, co poprawiło stabilność przy prądzie 6A. Użytkownik rozważa dalsze poprawki w filtracji oraz projektowaniu PCB, aby uniknąć problemów przy wyższych prądach.
Wygenerowane przez model językowy.
REKLAMA