Skocz do zawartości

aldenham

Użytkownicy
  • Zawartość

    5
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

aldenham wygrał w ostatnim dniu 28 sierpnia

aldenham ma najbardziej lubianą zawartość!

Reputacja

2 Neutralna

O aldenham

  • Ranga
    2/10

Ostatnio na profilu byli

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

  1. @Elvis Myślę, że do tak prostych podstaw nie muszę się cofać Rozumiem, co oznacza operator przypisania i wiem, czym różni się np. od operatora ==. Poza tym jakoś dotarłem do tego momentu w kursie rozwiązując wszystkie wcześniejsze zadania, czyli coś tam musiałem umieć zaprogramować. Dotarłem trochę dalej w moich przemyśleniach i wykoncypowałem, żeby rzeczywiście przypisać wartość do oc.Pulse w pętli while(1) (nie wiem, dlaczego wcześniej tak nie zrobiłem). Kod wygląda teraz tak i działa częściowo: tim4.Instance = TIM4; tim4.Init.Period = 1000 - 1; tim4.Init.Prescaler = 8 - 1; tim4.Init.ClockDivision = 0; tim4.Init.CounterMode = TIM_COUNTERMODE_UP; tim4.Init.RepetitionCounter = 0; tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&tim4); TIM_OC_InitTypeDef oc; oc.OCMode = TIM_OCMODE_PWM1; oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCNPolarity = TIM_OCNPOLARITY_LOW; oc.OCFastMode = TIM_OCFAST_ENABLE; oc.OCIdleState = TIM_OCIDLESTATE_SET; oc.OCNIdleState = TIM_OCNIDLESTATE_RESET; oc.Pulse = pulseval2; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_2); oc.Pulse = pulseval3; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_3); oc.Pulse = pulseval4; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_4); pulseval1 = 0; while (1) { while(pulseval1 <= 999) { pulseval1++; } oc.Pulse = pulseval1; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_1); } Skupiłem się tutaj póki co tylko na kanale 1 i nie usuwałem kodu dla pozostałych kanałów. Pewnie działałoby to też bez zmiennej pulseval1, ale stwierdziłem, że bezpieczniej jest sterować jej wartością, a później przypisać jej wartość do oc.Pulse i dalej wstawić do kanału 1. Rzeczywiście taki kod uruchamia diodę, ale nie powoduje "łagodnego narastania". Wygląda to tak, jakby oc.Pulse osiągało od razu wypełnienie graniczne z pętli, czyli tutaj wartość 999 (na razie dla testu pętla miała liczyć tylko w górę). while(pulseval1 <= 999) Na pewno mam gdzieś prosty błąd, którego nie widzę, a jest oczywisty dla Ciebie @Elvis, czy kogokolwiek z większym doświadczeniem, niż moje. Będę wdzięczny za podpowiedź, nie rozwiązanie (chciałbym dojść do tego w pewnym stopniu sam).
  2. Ok, to jak rozwiązać zadanie 7.4? Próbowałem przypisać do oc.Pulse wartość zmiennej 32 bitowej (np. pulseval1) i sterować jej wartością w pętli od 0 do 999, ale to nie działa. Umieściłem zmienną pulseval1 wewnątrz while(1), ale wartość oc.Pulse się nie aktualizuje. Czego mi brakuje? Bo przypisanie wartości (ale stałej) do zmiennej pulseval1 poza while(1) zmienia wartość oc.Pulse. Poniżej fragment kodu, który nie działa. TIM_OC_InitTypeDef oc; oc.OCMode = TIM_OCMODE_PWM1; oc.Pulse = pulseval1; oc.OCPolarity = TIM_OCPOLARITY_HIGH; oc.OCNPolarity = TIM_OCNPOLARITY_LOW; oc.OCFastMode = TIM_OCFAST_ENABLE; oc.OCIdleState = TIM_OCIDLESTATE_SET; oc.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_1); oc.Pulse = pulseval2; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_2); oc.Pulse = pulseval3; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_3); oc.Pulse = pulseval4; HAL_TIM_PWM_ConfigChannel(&tim4, &oc, TIM_CHANNEL_4); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_4); while (1) { pulseval1 = 500; } } Czy da się w ogóle dynamicznie zmienić wartość oc.Pulse z pętli while(1) korzystając ze sprzętowego PWM?
  3. @MR1979 Kolego, dziękuję bardzo za tego posta - miałem dokładnie taką samą sytuację i wyzerowanie adc pomogło.
  4. @Elvis Dzięki za porady. Z tym \0 oczywiście byłem świadomy, tylko niezbyt wyraźnie napisałem, o co mi chodzi. Stwierdziłem, że trochę szkoda zajmować się rozwiązaniem, z którego w przyszłości i tak nie będę korzystał, bo przeniosę pewnie kod na DMA
  5. Witam Niestety również mam problem z zadaniem #5.2. Na pewno mam zbyt małą wiedze nt. programowania w C, a szczególnie nt. STM32, ale dotychczas wszystkie zadania wykonywałem bez problemu. 1) Po pierwsze nurtuje mnie jedna rzecz - w instrukcji HAL w opisie funkcji HAL_UART_Receive podane są takie instrukcje. (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout) Wychodzi na to, że w przykładzie zmienna value musi być typu uint8_t i tak rzeczywiście jest. Zastanawia mnie, jak to jest, że w instrukcji switch oczekiwany jest znak (char), a w funkcji deklarowany jest int (uint8_t). Czy jest to rzutowanie? To w takim razie dlaczego jeśli próbuję odczytać z value łańcuch znaków, kompilator pokazuje type mismatch jeszcze przed próbą kompilacji? Zastosowanie strcmp(value, moja_zmienna_tablicowa_typu_char) również jest dla kompilatora błędna, bo traktuje value jako uint8_t. Kod napisany przez kolegę Wierczewskiego nie powinien się skompilować (nie sprawdzałem), bo zadeklarował value jako char, podczas gdy HAL_UART_Receive oczekiwało w tym miejscu zmiennej typu uint8_t. 2) To jak w końcu napisać tę funkcję tak, żeby zadziałała? Czy ilość danych do odbioru (uint16_t Size w dokumentacji HAL) powinna być ustawiona na 3 (lub 4) zamiast 1, jeśli chcę odebrać łańcuch o długości 4 znaków? Nie oczekuję gotowego rozwiązania, ale liczę na "ciekawą" podpowiedź
×
×
  • Utwórz nowe...