Skocz do zawartości

skibos

Użytkownicy
  • Zawartość

    11
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O skibos

  • Ranga
    2/10

Ostatnio na profilu byli

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

  1. skibos

    STM32 F042K6 kontrola PWM

    Tak na arduino wszystko działa perfekcyjnie, stby ustawiony na wysoki zaraz na początku. /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ TIM_HandleTypeDef htim2; UART_HandleTypeDef huart2; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); static void MX_TIM2_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // stby /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET); // ain1 bin1 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_7, GPIO_PIN_RESET); // ain2 bin2 __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 200); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 200); /*for (int pwm=0;pwm<=255;pwm++) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_7, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm); HAL_Delay(10); } HAL_Delay(400); for (int pwm=255;pwm>=0;pwm--) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_7, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, pwm); HAL_Delay(10); } HAL_Delay(400);*/ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48; RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } } /** * @brief TIM2 Initialization Function * @param None * @retval None */ static void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 5; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 254; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */ /* USER CODE END TIM2_Init 2 */ HAL_TIM_MspPostInit(&htim2); } /** * @brief USART2 Initialization Function * @param None * @retval None */ static void MX_USART2_UART_Init(void) { /* USER CODE BEGIN USART2_Init 0 */ /* USER CODE END USART2_Init 0 */ /* USER CODE BEGIN USART2_Init 1 */ /* USER CODE END USART2_Init 1 */ huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN USART2_Init 2 */ /* USER CODE END USART2_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); /*Configure GPIO pins : PA4 PA5 PA6 PA7 */ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; 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); /*Configure GPIO pin : PB0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(char *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ w za komentowanej pętli też sprawdzałem również nie działa.
  2. skibos

    STM32 F042K6 kontrola PWM

    Podłączyłem diodę, napisałem fora żeby wypełnienie sygnału rosło od 0 do 100%, a następnie malało od 100% do 0%. Działa to bo dioda się płynnie rozjaśnia i gaśnie. Jednakże po przełączeniu się na silniki i mostek TB6612FNG nie działa to jak dioda. Korzystam z CubeMX i generalnie tylko dopisałem to i dioda działała tak jak miała: /* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); /* USER CODE END 2 */ for: for (int pwm=0;pwm<=255;pwm++) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm); HAL_Delay(10); } HAL_Delay(400); for (int pwm=255;pwm>=0;pwm--) { __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm); HAL_Delay(10); } HAL_Delay(400); Czy trzeba coś jeszcze dopisać aby odnośnie PWM'a żeby silniki ruszyły ? Oczywiście stany zadeklarowałem ain1 i bin1 na SET ( wysoki ) natomiast ain2 i bin2 na RESET ( czyli niski ) co powinno dawać nam ruch silników zgodny ze wskazówkami zegara, jednak silniki stoją w miejscu i nie ruszają się.
  3. Witam. Chciałbym uzyskać częstotliwość PWM około 31250Hz. Jakie wartości Prescaler, Period oraz Pulse powinienem przypisać aby otrzymać taką częstotliwość. Dodam że chciałbym zarządzać wypełnieniem w zależności od warunku instrukcji warunkowej z wykorzystaniem makra _HAL_TIM_SET_COMPARE, jednakże chciałbym aby były to wartości od 0 do 100 odpowiadające od 0% do 100% wypełnienia. Czy da rade coś takiego zrobić ? Załączam screen z konfiguracji zegarów z MX Cube. Czy zegary są ustawione dobrze ? Dodam że zależy mi na tym aby układ przeliczał wartości z czujników szybciej niż arduino aczkolwiek wolałbym w pełni wykorzystać potencjał tego STMa. edit Poczytałem troszeczkę, zmieniłem ustawienie zegarów na 48 MHz. Podzieliłem częstotliwość zegara czyli 48000000 Hz przez częstotliwość którą chcę otrzymać czyli 31250Hz i wyszło mi 1536 ( 1535+1) czyli wyszedł mi Prescaler ? Jeśli nie to prosiłbym o dokładne wytłumaczenie, jeśli tak to uważam że nadal nie wiem jak ustawić wartość Period i Pulse. @edit 2 skorzystałem z tego wzoru FREQ = TIM_CLK/(ARR+1)(PSC+1)(CKD+1) i po podstawieniu wyszło 0.. Stwierdziłem więc że wezmę sobie Period z zakresu od 0 do 255 jak w arduino, czyli 31250=48000000/(254+1)(PSC+1)(0+1) 31250*255*(PSC+1)=48000000 PSC+1=48000000/7968750 PSC=5 według tego rozumowania przy Prescaler=5, Period=254 otrzymam częstotliwość PWM o wartości 31250Hz tak ? I w Pulse ustawiam wartość początkową z zakresu od 0 do 255 i w kodzie mogę zmieniać wartość _HAL_TIM_SET_COMPARE z zakresu od 0 do 255 ?
  4. skibos

    PWM - sterowanie prędkością silnika

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

    PWM - sterowanie prędkością silnika

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

    PWM - sterowanie prędkością silnika

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

    PWM - sterowanie prędkością silnika

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

    PWM - sterowanie prędkością silnika

    #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.
  9. skibos

    PWM - sterowanie prędkością silnika

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