Skocz do zawartości

PWM - sterowanie prędkością silnika


Pomocna odpowiedź

Napisano

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.

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ść) ).

(edytowany)
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.

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

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?

(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
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 😉

(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
(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
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 😉

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.

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