Skocz do zawartości

Bornhartt

Użytkownicy
  • Zawartość

    13
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Bornhartt

  • Ranga
    2/10

Ostatnio na profilu byli

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

  1. Potwierdzam, wszystko działa W sumie odczułem ulgę, że to nie był jakiś trywialny błąd, ale chyba będę musiał zrezygnować z CUBEIDE na rzecz pewnie SW4 i MXa żeby już takie historie się nie powtórzyły Bardzo dziękuję za rozwiązanie problemu i pozdrawiam
  2. Pomogło przypadkowe ustawienie BOOT 1 na 1, nie wiem czy to jest dobre rozwiązanie i czy mogło być związane z tym przepełnianiem stosu, możecie mi to zjawisko wytłumaczyć jeśli jeszcze macie chęci Tak czy inaczej dziękuję bardzo za poświęcony czas i dużo porad
  3. dwa pierwsze punkty sprawdziłem i to nie był ten problem, ustaliłem, że acos/asin blokuje wykonanie programu jeżeli korzysta z jakiejkolwiek zmiennej float, uint itd. (A=acosf(Az);), dodatkowo wyskoczył mi nowy komunikat, także dotyczący przerwania więc to pewnie jest problem tylko nie mam pojęcia jak go rozwiązać, tematem zajmuję się od niedawna. Mógłbym wrzucić tutaj całą paczkę z projektem
  4. Wyłączając odczyt z ADC obliczenia na arcusach wykonują się bezproblemowo, jeżeli włączę odczyt ADC i usunę arcusy to nadal reszta obliczeń wykonuje się. Jeżeli CPU i DMA konkurują tylko o dostęp do rejestrów to CPU powinno w tym czasie wykonywać obliczenia, dobrze rozumiem? Naprawdę nie wiem gdzie może znajdować się błąd, ale czy jest możliwość wykonania odczytu ADC po wykonaniu obliczeń na arcusach, a nie w trybie continuous? W sieci nie mogę znaleźć żadnego poradnika jak to wykonać Dziękuję za odpowiedzi, pozdrawiam
  5. Prosiłbym tylko o odpowiedź czy to możliwe, że DMA może zawiesić wykonywanie obliczeń i czy wydłużenie odczytu danych do np. 100 ms załatwi sprawę ? (wyzwalanie za pomocą licznika) EDIT: program zawiesza się na obliczeniach arcusów i w tym tkwi sęk
  6. Pojawia się taki "błąd", a program niby nie przerywa się, ale nie wykonuje danych obliczeń
  7. Dzień dobry, Korzystam z STM32F103C8, oprogramowanie CUBEIDE, debugowanie st-link v2. Problem polega na tym, że dobrze działające DMA w circular mode zawiesza program gdy dodaję do niego 4 linie obliczeń (sinusy, cosinusy, arcusy), #include <math.h> wpisałem. obliczenia z wyłączoną konwersją również wykonują się poprawnie /* USER CODE BEGIN 0 */ void set_coordinate (void) { ST=hour+(4*(18-15)); D = 23.45f*sinf(360*((284.f+day_of_year)/365)*rad)*rad;//////////////////////////////////blad Height = asinf(sinf(D)*sinf(W)+cosf(D)*cosf(W)*cosf((15*(hour-12))*rad))*rad;// nie dochodzi do tych obliczen A = acosf((sinf(D)-sinf(Height)*sinf(W))/(cosf(Height)*cosf(W)))*deg; H=Height*deg; } /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1, adc_val, 4); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // set_coordinate(); motor_rad_1 = adc_val[0]/13.65;//podzielic przez zakres 4095/300 stopni motor_rad_2 = adc_val[1]/13.65; } /* USER CODE END 3 */ } hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 4; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } /* Enable DMA controller clock */ static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); } Z kodu wyciąłem tylko najważniejsze rzeczy, mogę zamieścić dodatkowo screeny z konfiguracji ADC,DMA Nie wyskakuje żaden błąd, tylko program zawiesza się na liniach obliczeń. Dlaczego obliczenia zawieszają program? Czy to nie jest tak, że DMA nie korzysta z procesora? Moim pomysłem byłoby zastosowanie wyzwalania konwersji przez licznik, wykonywanie jej co 200 ms, ale nie wiem, czy ma to sens, drugim pomysłem jest odczyt ADC zaraz po obliczeniach, ale nie mam pojęcia jak się do tego zabrać. z góry dziękuję za odpowiedź
  8. Wszystko działało poprawnie, niestety podłączyłem do płytki stykowej również GND i to nie pozwalało na poprawną pracę silnika, temat zamknięty i dziękuję Wam za pomoc i porady
  9. Używam STM32F103C8 (BluePill) Testowałem diodą LED i multimetrem, wraz ze zmianą stanu multimetr wskazywał 3,3 i 0 V A w którym miejscu wstawić te dwie linijki? Tam gdzie jest konfiguracja pinu?
  10. GPIO_InitStruct.Pin = GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); Kod konfiguracji pinu. wstawiając breakpointy i przeglądając ODR można zauważyć, że stan na pinie zmienia się, ale w ciągłym działaniu kodu już wystawia tylko stan wysoki, próbowałem dla pinów a10-a12 również, z tym samym rezultatem
  11. Używam gołego mostka, a w sterowaniu ręcznym chodziło mi o to, że przykładam 3,3 V do wejść sterujących i silnik działa poprawnie. W specyfikacji mostka jest opisane wejście enable i dwa wejścia sterujące lewo prawo, jeżeli zasilimy enable 3,3 V to sterujące też możemy zasilić tym napięciem do poprawnego działania mostka. Zrobiłem test, w którym podaję napięcie 3,3V na enable a do STM podłączyłem jedynie jedno wejście sterujące na pin, który w stanie wysokim wystawia 3,3 V, silinik obraca się ale pin nie przechodzi w stan niski i to jest problem którego nie potrafię rozwiązać Albo z drugiej strony, dlaczego kod który przedstawiłem nie zmienia stanu na wyjściu PINu?
  12. Dzień dobry, Jest to mój pierwszy wpis na forum, szukałem wcześniej podobnego tematu ale go nie znalazłem, tak więc zakładam nowy. Steruję silnikiem DC za pomocą sterownika L293D, połączenie jest poprawne, steruję "ręcznie" silnikiem , więc od tej strony wszystko działa, problem pojawił się przy programowaniu STMki. Korzystając z kursu STM32 F1 HAL #4 porty GPIO próbuję wystawić sygnał sterujący silnikiem lecz pozostaje on w stanie wysokim. Jeżeli zmienię PIN na diodę LED PC13 to ta działa poprawnie. Co zrobić aby dany PIN zmieniał swój stan? while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET); HAL_Delay(500); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET); HAL_Delay(500); } /* USER CODE END 3 */ }
×
×
  • Utwórz nowe...