Skocz do zawartości

PWM - sterowanie prędkością silnika


skibos

Pomocna odpowiedź

Witam,

są to dopiero moje początki z STM32 Nucleo więc na wstępie proszę o wyrozumiałość. Posiadam model Nucleo 32 F042K6 oraz mostek L298n. Na mostku znajduje się 6 pinów ( ENA, In1, In2, In3, In4, ENB). Powiem na przykładzie arduino, gdy na ENA i ENB jest zworka prędkość jest albo 100% albo 0% w zależności od stanów. Gdy wyjmę zworki podłączałem te 2 piny do analogowych ( ENA, ENB), In'y do cyfrowych i wywoływałem funkcje w arduino:
 

void forward(){
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ENA, 200); //wartosc od 100 do 255

digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(ENB, 200);
}


Było wszystko w porządku i właśnie o takie coś mi chodzi.
Gdy znów wpiąłem zworki, podłączyłem 4 piny operujące stanami do Nucleo napisałem w STM Workbench, że silniki mają się kręcić do przodu oba też było dobrze:
 

int main(void)
{

HAL_Init();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef gpio;
gpio.Pin = (GPIO_PIN_0 |  GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_1);
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);

while (1)
{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}
}

Problem jest taki że nie mogę poradzić sobie z ustawieniem prędkości obrotowej w nucleo na tych dwóch pinach. Dodam że TIM2 Kanał 1 jest na pinie PA0 natomiast TIM2 kanał 1 jest na pinie PA6. Korzystałem z wielu poradników jednak w internecie nic konkretnego ( co byłoby dla mnie zrozumiałe ) nie znalazłem. Proszę o jakieś konkretne rozwiązania. Chciałbym sterować w zakresie mniej więcej takim jak arduino, albo najlepiej od 0 do 100.

Link do komentarza
Share on other sites

Działa bo najpierw bawiłem się tym mostkiem w arduino i wszystko działało, następnie zacząłem czytać właśnie ten kurs i tym sposobem stworzyłem ten kod w workbenchu który również działa bo go testowałem. Gdy podłączyłem do stma i na te dwa piny z PWM dałem zworki, wgrałem kod to z 100% szybkością kręciły się do przodu. Czytałem ten artykuł który wkleiłeś jednakże wiele mi on nie mówi. Z której dokładnie części powinienem skorzystać aby uzyskać możliwość sterowania prędkością  od np. 1 do 100 jednostek? Rozumiem, że ta część kodu jest stała:
 

 GPIO_InitTypeDef gpio;
 gpio.Mode = GPIO_MODE_AF_PP;
 gpio.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8; // deklaruje sobie piny odpowiedzialne za pwm w moim przypadku są to dwa
 gpio.Pull = GPIO_NOPULL;
 gpio.Speed = GPIO_SPEED_FREQ_HIGH;
 HAL_GPIO_Init(GPIOB, &gpio);
 
 __HAL_RCC_TIM4_CLK_ENABLE();// w moim przypadku tim3 i tim2 i wszędzie na takie coś zmieniam
 tim4.Instance = TIM4;
 tim4.Init.Period = 1000 - 1; // jakie wartości tu dać żeby działało w stosunku 1-100 jednostek prędkość silnika 
 tim4.Init.Prescaler = 8 - 1; // jakie wartości tu dać żeby działało w stosunku 1-100 jednostek prędkość silnika 
 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_PWM2;
 oc.Pulse = 100;
 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); // dla mnie znów tim3 i tim 2 kanał 1

HAL_TIM_PWM_Start(&tim4, TIM_CHANNEL_1);

pytanie co mam dać tu:

while (1)
{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}

aby uzyskać to co w arduino  ( patrz AnalogWrite(pin, wartość) ).

Link do komentarza
Share on other sites

5 godzin temu, skibos napisał:

Działa bo najpierw bawiłem się tym mostkiem w arduino i wszystko działało, następnie zacząłem czytać właśnie ten kurs i tym sposobem stworzyłem ten kod w workbenchu który również działa bo go testowałem. Gdy podłączyłem do stma i na te dwa piny z PWM dałem zworki, wgrałem kod to z 100% szybkością kręciły się do przodu. Czytałem ten artykuł który wkleiłeś jednakże wiele mi on nie mówi. Z której dokładnie części powinienem skorzystać aby uzyskać możliwość sterowania prędkością  od np. 1 do 100 jednostek? Rozumiem, że ta część kodu jest stała:
 

pytanie co mam dać tu:


while (1)
{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

}

aby uzyskać to co w arduino  ( patrz AnalogWrite(pin, wartość) ).

Cześć,
kod, który przedstawiłeś w pierwszym pości znacząco różnił się od tego w ostatnim i nie miał prawa działać.

doczytaj co robi makro: __HAL_TIM_SET_COMPARE

masz to opisane w tym odcinku kursu.

Pozdrawiam

Edytowano przez Treker
Poprawiłem formatowanie.
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@skibos, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
7 godzin temu, skibos napisał:

Gdy wyjmę zworki podłączałem te 2 piny do analogowych ( ENA, ENB), In'y do cyfrowych i wywoływałem funkcje w arduino

Jeśli chodzi o Twój główny problem, to @FlyingDutch już Cię naprowadził. Ja się tylko "przyczepię" do cytowanego fragmentu, aby nie wprowadzać początkujących w błąd. Mianem pinów analogowych w przypadku Arduino nazywa się piny A0-A5 (w Arduino UNO), które mogą być wykorzystywane do pomiaru napięcia wejściowego. Są one połączone z przetwornikiem ADC, stąd nazwa tych wyprowadzeń. W przypadku mostka H na piny ENA i ENB należy podawać sygnał PWM, który "nieszczęśliwie" w Arduino generuje się poleceniem analogWrite. Nie ma ono jednak nic wspólnego z pinami analogowymi A0-A5. To tak tylko dla formalności 😉 

  • Lubię! 1
Link do komentarza
Share on other sites

#include "stm32f0xx.h"

TIM_HandleTypeDef tim3;
TIM_HandleTypeDef tim2;



int main(void)
{
HAL_Init();


__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();


GPIO_InitTypeDef gpio;
gpio.Pin = (GPIO_PIN_0 |  GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_1);
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);


gpio.Pin = GPIO_PIN_6 | GPIO_PIN_0;
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio);

__HAL_RCC_TIM3_CLK_ENABLE();
 tim3.Instance = TIM3;
 tim3.Init.Period = 99;
 tim3.Init.Prescaler = 4999;
 tim3.Init.ClockDivision = 0;
 tim3.Init.CounterMode = TIM_COUNTERMODE_UP;
 tim3.Init.RepetitionCounter = 0;
 tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
 HAL_TIM_PWM_Init(&tim3);

__HAL_RCC_TIM2_CLK_ENABLE();
  tim2.Instance = TIM2;
  tim2.Init.Period = 99;
  tim2.Init.Prescaler = 4999;
  tim2.Init.ClockDivision = 0;
  tim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  tim2.Init.RepetitionCounter = 0;
  tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  HAL_TIM_PWM_Init(&tim2);

 TIM_OC_InitTypeDef oc;
 oc.OCMode = TIM_OCMODE_PWM1;
 oc.Pulse = 100;
 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(&tim3, &oc, TIM_CHANNEL_1);

 oc.OCMode = TIM_OCMODE_PWM2;
 oc.Pulse = 100;
 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(&tim2, &oc, TIM_CHANNEL_1);

 HAL_TIM_PWM_Start(&tim3, TIM_CHANNEL_1);
 HAL_TIM_PWM_Start(&tim2, TIM_CHANNEL_1);







while (1)
{

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, 20); // dawałem tu i niżej różne pary wartości np. 0.1 i 0.8 , 20 i 80, 100 i 400.. nadal nie dziala

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&tim2, TIM_CHANNEL_1, 80);

}

}

Co mam tu źle ? Próbowałem te makro użyć i w środku While i przed Whilem jednak efekt jest nadal  taki sam, silniki kręcą się na 100% swojej mocy.

Link do komentarza
Share on other sites

Elektronikę masz na gotowym shieldzie? Jeśli nie to proponowałbym na początku wykorzystać dokładnie te same piny i liczniki, które były użyte w kursie. Mam wrażenie, że jednak wklejasz i zmieniasz to trochę na chybił-trafił. Próbowałeś najpierw uruchomić dokładnie ten przykład, który był w kursie?

Link do komentarza
Share on other sites

(edytowany)

Próbowałem jednakże nie działa to tak jak powinno. Może zacznę od początku. Posiadam:

- mostek L298N - https://botland.com.pl/sterowniki-silnikow-moduly/3164-l298n-dwukanalowy-sterownik-silnikow-modul-12v2a.html?search_query=l298n&results=6

- STM32 F042K6 - https://www.st.com/en/evaluation-tools/nucleo-f042k6.html

Kwestia podłączenia:

Na płytce od mostka są piny ENA, In1, In2, In3, In4, ENB. Domyślnie na ENA i ENB są zworki żeby silniki zachowywały prędkość 100% na stanie wysokim i 0% na stanie niskim. In'y podłączam sobie do PB0, PB7, PB6, PB1. Czy na ENA i ENB mają być nadal zworki ? Czy mam je wyjąć i podpiąć do losowych dwóch pinów ? Czy mam je wyjąć i podpiąć do 2 timerów czyli np Tim2 i Tim3 na pinach PA0 i PA6 (kanały pierwsze ). Czy Mam wyjąć zworki i nigdzie nie podpinać tych dwóch pinów?

Ps. na arduino podpinałem In'y do dowolnych 4 pinów cyfrowych i ENA i ENB do dowolnych 2 analogowych.

Edytowano przez skibos
Link do komentarza
Share on other sites

4 godziny temu, skibos napisał:

Ps. na arduino podpinałem In'y do dowolnych 4 pinów cyfrowych i ENA i ENB do dowolnych 2 analogowych.

Przypominam: nie do analogowych, tylko do pinów mogących generować sygnał PWM. Piny analogowe to zupełnie coś innego 😉

4 godziny temu, skibos napisał:

Na płytce od mostka są piny ENA, In1, In2, In3, In4, ENB. Domyślnie na ENA i ENB są zworki żeby silniki zachowywały prędkość 100% na stanie wysokim i 0% na stanie niskim. In'y podłączam sobie do PB0, PB7, PB6, PB1. Czy na ENA i ENB mają być nadal zworki ?

Dla pierwszego testu załóż zworki na ENA i ENB i spróbuj napisać program, który będzie kontrolował kierunek obrotów silnika.

4 godziny temu, skibos napisał:

Czy mam je wyjąć i podpiąć do losowych dwóch pinów ? Czy mam je wyjąć i podpiąć do 2 timerów czyli np Tim2 i Tim3 na pinach PA0 i PA6 (kanały pierwsze ).

Absolutnie nie do losowych. Musisz podpiąć je do pinów, które mogą generować sygnał PWM.

4 godziny temu, skibos napisał:

Czy Mam wyjąć zworki i nigdzie nie podpinać tych dwóch pinów?

Jak tak zrobisz to sterownik będzie "wyłączony" i silniki nigdy się nie będą kręciły.

4 godziny temu, skibos napisał:

STM32 F042K6

Dopiero teraz zauważyłem, że to inny mikrokontroler niż używany w kursie. Biblioteki HAL powinny gwarantować większą lub mniejszą kompatybilność, ale lepiej zachować ostrożność.

Proponowałbym przejść kolejno przez 3 scenariusze:

  1. Założone zworki i sterowanie kierunkami dwóch silników przez STMa z maksymalną prędkością.
  2. Zdjęcie zworek, podłączenie ENA i ENB do kolejnych pinów STMa i sterowanie ich cyfrowo 0/1. Będziesz mógł wtedy za pomocą STMa sterować kierunkiem silników, a zmieniając stan wyjść ENA/ENB będziesz mógł włączać i wyłączać każdy silnik.
  3. Spróbuj uruchomić PWM i połączyć to z powyższym programem.

Nie rób wszystkiego na raz, bo się pogubisz. Działaj krok, po kroku - wtedy najwięcej się nauczysz 😉

Link do komentarza
Share on other sites

(edytowany)

Ok. Napisałem program do punktu drugiego jak napisałeś.

 

#include "stm32f0xx.h"



int main(void)
{
HAL_Init();


__HAL_RCC_GPIOB_CLK_ENABLE();


GPIO_InitTypeDef gpio;
gpio.Pin = (GPIO_PIN_0 |  GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5);
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);


while (1)
{
forward();


}
}
/* FUNKCJE OBSŁUGUJĄCE KIERUNEK SILNIKÓW */
void forward(){ 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
 	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void backward(){
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void left(){ 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
  
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
  	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void right(){ 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
  	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
  	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}

Ustalilem sobie w voidach kierunki i stanami powłączałem ENA i ENB na wszystkie voidy ( tak potrzebuje ). Działa ten kod. Teraz jeszcze jedno pytanie czy pin obsługujący PWM'a to pin TIM1 / TIM2 / TIM3 ?

@edit

Założyłem że tak i ustawiłem ENA jako tim3 i jest to na pinie PA6 ( 1 kanał ), natomiast ENB na tim1 i jest na pinie PA8 ( 1 kanał ). Dla testu wziąłem tylko voida z forward. Co się okazało ? Że jeden z silników działa na 100% a drugi nawet nie wystartował. Błąd w wartościach ?

 

#include "stm32f0xx.h"
  
TIM_HandleTypeDef tim3;
TIM_HandleTypeDef tim1;

int main(void)
{
HAL_Init();


__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();


GPIO_InitTypeDef gpio;
gpio.Pin = GPIO_PIN_0 |  GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_1;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);

gpio.Pin = GPIO_PIN_6 | GPIO_PIN_8;
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio);

__HAL_RCC_TIM3_CLK_ENABLE();
 tim3.Instance = TIM3;
 tim3.Init.Period = 99;
 tim3.Init.Prescaler = 4999;
 tim3.Init.ClockDivision = 0;
 tim3.Init.CounterMode = TIM_COUNTERMODE_UP;
 tim3.Init.RepetitionCounter = 0;
 tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
 HAL_TIM_PWM_Init(&tim3);

__HAL_RCC_TIM2_CLK_ENABLE();
  tim1.Instance = TIM1;
  tim1.Init.Period = 99;
  tim1.Init.Prescaler = 4999;
  tim1.Init.ClockDivision = 0;
  tim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  tim1.Init.RepetitionCounter = 0;
  tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  HAL_TIM_PWM_Init(&tim1);

  TIM_OC_InitTypeDef oc;
  oc.OCMode = TIM_OCMODE_PWM1;
  oc.Pulse = 100;
  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(&tim3, &oc, TIM_CHANNEL_1);
  HAL_TIM_PWM_ConfigChannel(&tim1, &oc, TIM_CHANNEL_1);

  HAL_TIM_PWM_Start(&tim3, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&tim1, TIM_CHANNEL_1);


while (1)
{
forward();

}
}
void forward(){
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
	__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, 300); // znów kombinowałem z różnymi wartościami w tym i następnym jednak bez efektu

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	__HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_1, 80);
}

wspomnę tylko jeszcze że interesuję mnie np. prędkość od 1 do 100% możliwości silnika
 

Edytowano przez skibos
Link do komentarza
Share on other sites

(edytowany)

Próbowałem również podłączyć do TIM1 kanał 1 na pinie PA8 i TIM1 kanał 4 na pinie PA11. Niestety żaden z silników nie wystartował.

 

#include "stm32f0xx.h"



int main(void)
{
HAL_Init();


__HAL_RCC_GPIOB_CLK_ENABLE();


GPIO_InitTypeDef gpio;
gpio.Pin = (GPIO_PIN_0 |  GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5);
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &gpio);


while (1)
{
forward();


}
}
/* FUNKCJE OBSŁUGUJĄCE KIERUNEK SILNIKÓW */
void forward(){ 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
 	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void backward(){
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void left(){ 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
  
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
  	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}
void right(){ 
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
  	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
  	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}

czy jest ktoś w stanie pomóc przerobić mi ten kod żeby działał w nim pwm ? piny PB0, PB7, PB6, PB1 to kolejno iny1,2,3,4. TIM 1 kanał 1 znajduje się na pinie PA8 (ENA) , TIM 1 kanał 4 znajduję  się na pinie PA11 (ENB). Po podłączeniu ich na Output do pinów PB4 i PB5 można było włączać i wyłączać dany silnik. Rozumiem, że będzie dopisane to:

__HAL_RCC_GPIOA_CLK_ENABLE();
gpio.Pin = GPIO_PIN_8|GPIO_PIN_11;
gpio.Mode = GPIO_MODE_AF_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &gpio);

bo musi być i usunięte HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET) oraz z PIN5 bo zostanie przez coś zastąpione ( co ? ), jednak co dalej ?

@edit

przed chwilą wgrałem pierwszy kod z poradnika zmieniłem tylko numer pinu i podłączyłem diodę, niestety nie zadziałało. dioda się nie świeciła przez 1 sekundę i nie gasła.

Edytowano przez skibos
Link do komentarza
Share on other sites

Dnia 1.11.2018 o 14:27, skibos napisał:

przed chwilą wgrałem pierwszy kod z poradnika zmieniłem tylko numer pinu i podłączyłem diodę, niestety nie zadziałało.

Widocznie niestety czegoś zabrakło (w końcu używasz innego układu niż był w kursie) - ja niestety tutaj nie pomogę, nie zajmowałem się F0 wcześniej - może ktoś inny Ci doradzi 😉

Link do komentarza
Share on other sites

18 godzin temu, Treker napisał:

Widocznie niestety czegoś zabrakło (w końcu używasz innego układu niż był w kursie) - ja niestety tutaj nie pomogę, nie zajmowałem się F0 wcześniej - może ktoś inny Ci doradzi 😉

na F446RE również próbowałem i również nic.

Link do komentarza
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.