Skocz do zawartości

skibos

Użytkownicy
  • Zawartość

    15
  • 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. Tak wiem, Piny odpowiadające za czujniki zadeklarowałem jako przerwania, przerwania zostały włączone w cubemx. Chodzi o kwestię programową aby program w kółko wykonywał funkcję left() tzn. robot kręcił się w lewo a gdy zobaczy przeszkodę na przednim czujniku przerwanie tak jakby zatrzyma te kręcenie i dopóki będzie na czujniku stan niski to będzie wykonywał funkcję forward(), identycznie z czujnikiem prawym tylko funkcja right(). Jeśli stan urośnie z niskiego na wysoki na przerwaniu to funkcja znów wróci do pierwotnego działania tzn kręcenia w lewo ( wykonywania funkcji left()).
  2. Witam, czy jest ktoś mi w stanie objaśnić idee przerwań w stm32? Mam czujniki które zmieniają stan pinu z wysokiego na niski kiedy czujnik będzie widział jakiś obiekt, jeśli nie pin będzie w stanie wysokim. Mam napisane funkcje do mostka ustawiające odpowiednio stany pinów aby silniki jechały w odpowiednim kierunku te funkcje to: forward(), right(), left(). Chciałbym aby cały czas wykonywała się funkcja left(), natomiast gdy czujnik zauważy przeszkodę tzn. pin zmieni się ze stanu wysokiego na niski to program się przerwał i jeśli np. zauważy czujnik przedni to wykonał funkcję forward(), jeśli stan zmieni się na wysoki na tym pinie to żeby znów wykonywała się funkcja left(). Jednakże nie chce aby wykonywało się to ifami bo to ciągłe obciążenie procesora poprzez sprawdzanie stanu pinu milion razy na minute tylko przerwaniami gdzie funkcja wykona się tylko wtedy kiedy nastąpiło przerwanie na pinie a jak przerwania na tym pinie już nie będzie to żeby funkcja wróciła to programu głównego. Testowałem już miliony rozwiązań jednak wciąż nie doszedłem do właściwej odpowiedzi. Podczas dodawania do pętli głównej programu left() oraz ustawienie przerwań na callbacku, przerwania się nie wykonują tzn cały czas wykonuje się program główny niezależnie od stanu na pinach czujników. Kod: /* 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 */ int przodprawo, przodlewo, lewo, prawo; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); static void MX_USART2_UART_Init(void); /* USER CODE BEGIN PFP */ void forward(); void left(); void right(); /* 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_TIM2_Init(); MX_USART2_UART_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); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ left(); } /* 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_3, 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 pins : PB0 PB3 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_3; 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); /*Configure GPIO pins : przod_lewo_Pin przod_prawo_Pin */ GPIO_InitStruct.Pin = przod_lewo_Pin|przod_prawo_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : prawo_Pin lewo_Pin */ GPIO_InitStruct.Pin = prawo_Pin|lewo_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); } /* USER CODE BEGIN 4 */ void forward(){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 70); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 70); } void left(){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 70); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 70); } void right(){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 70); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 70); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == przod_prawo_Pin || GPIO_Pin == przod_lewo_Pin){ forward(); } if(GPIO_Pin == prawo_Pin){ right(); } if(GPIO_Pin == lewo_Pin){ left(); } } /* 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****/
  3. No niestety chyba tak jak to napisałeś nie działa. Znalazłem coś takiego: void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET){ if (PIN==1) {//Rising so pressed /* do something */ } if (PIN==0) {//Falling so released /* do something else */ } EXTI_ClearITPendingBit(EXTI_Line0); } } jednak jak to zaimplementować pod te konkretne piny ? Dodam że czujnik jeśli wykryje obiekt daje na pinie stan niski , jeśli nic nie wykrywa pozostaje na stanie wysokim. Do tego wszystkiego chciałbym później jeszcze móc się odwoływać poprzez przyciski z np taktykami tzn. jeśli wcisne przycisk to jak nie ma przerwania na żadnym pinie to jedź sobie w lewo, jak nastąpi to rób instrukcje z przerwań na określonych pinach. W skrócie chce zamienić while(1){ przodprawo = HAL_GPIO_ReadPin(GPIOA, przod_prawo_Pin); przodlewo = HAL_GPIO_ReadPin(GPIOA, przod_lewo_Pin); prawo = HAL_GPIO_ReadPin(GPIOB, prawo_Pin); lewo = HAL_GPIO_ReadPin(GPIOB, lewo_Pin); if(przodprawo == 0 || przodlewo == 0){ forward(); } else if(prawo == 0){ right(); } else if(lewo == 0){ left(); } else{ left(); } } ciągłe sprawdzanie stanu i ifów na przerwania i kontrolować nimi tak jak w while(1) mogę manewrować ifami.
  4. /* 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_TIM2_Init(void); static void MX_USART2_UART_Init(void); /* USER CODE BEGIN PFP */ void forward(); void left(); void right(); /* 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_TIM2_Init(); MX_USART2_UART_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); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* 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); /*Configure GPIO pins : przod_lewo_Pin przod_prawo_Pin */ GPIO_InitStruct.Pin = przod_lewo_Pin|przod_prawo_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : prawo_Pin lewo_Pin */ GPIO_InitStruct.Pin = prawo_Pin|lewo_Pin; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI4_15_IRQn); } /* USER CODE BEGIN 4 */ void forward(){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 70); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 70); } void left(){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 70); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 70); } void right(){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 70); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 70); } void HAL_GPIO_EXTI_callback(uint16_t GPIO_Pin) { if(GPIO_Pin == przod_prawo_Pin || GPIO_Pin == przod_lewo_Pin){ forward(); } if(GPIO_Pin == prawo_Pin){ right(); } if(GPIO_Pin == lewo_Pin){ left(); } } /* 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****/ owa funkcja steruje silnikami, jeśli na czujnikach przednich wykryje przerwanie to jedzie do przodu, jak na lewym czujniku to jedzie w lewo jak na prawym to jedzie w prawo. Od kilku godzin kombinuje lecz nie mogę rozgryźć jak zrobić jeśli przerwanie istnieje na określonych czujnikach to rób to co jest teraz tzn. void HAL_GPIO_EXTI_callback(uint16_t GPIO_Pin) { if(GPIO_Pin == przod_prawo_Pin || GPIO_Pin == przod_lewo_Pin){ forward(); } if(GPIO_Pin == prawo_Pin){ right(); } if(GPIO_Pin == lewo_Pin){ left(); } } a jeśli przerwanie zniknie z czujnika tzn. stan zmieni się z niskiego na wysoki i na żadnym innym czujniku nie wykryje przerwania w tym samym czasie przerwania to jedź w lewo ( funkcja left() ). Chodzi mniej więcej o to żeby to wszystko robiło się przez cały czas tzn. zapętlało się było w while(1){} Precyzując chodzi o to żeby program działał tak że jeśli wykryje przerwanie to zrób funkcję przypisaną do pinu na którym nastąpiło przerwanie (czyli to co w voidzie powyżej ) , w każdym innym przypadku po prostu użyj funkcji left()
  5. 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.
  6. 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ę.
  7. 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 ?
  8. na F446RE również próbowałem i również nic.
  9. 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.
  10. 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
  11. 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.
  12. #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.
  13. 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ść) ).
  14. 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.
×
×
  • Utwórz nowe...