|
本帖最后由 点点&木木 于 2019-4-12 11:55 编辑 这个项目是根据我对微控制器课程的分配。它可以从键盘上汲取电机直流轮。
这个项目中使用的东西 硬件组件 Arm Mbed stm32f407vg × 1 直流电机(通用) × 1 Adafruit RGB背光LCD -16x2 × 1 键盘 × 1 介绍 这个项目是关于如何控制两个电机DC,以便两个电机DC不能一起工作。从程序中,我制定了程序,以便电机可以轮流旋转。对于键盘,我使用键盘4x4。从键盘上有字母表。但它只是A,B,C和D.对于这个项目,通常情况下电机状态是停止的。当我在键盘上按A时,第一个电机将旋转。当我在键盘上按B时,第二个电机将旋转。当我在键盘上按下C键时,第一个电机的旋转将会改变。更改为tgeleft或更改为左侧。据lcd显示。当我按下键盘上的D键时,当我按下C时,它就不动了。但是,对于键盘上的D,将改变第二个电机的旋转。当我做这个项目时,我想在键盘上添加按钮,以增加和减少电机的旋转。 原理图 组态
加1
加2
加3
加4
加5
电路板
代码 /** ****************************************************************************** *@file : main.c *@brief : Main program body ****************************************************************************** **This notice applies to any and all portions of this file *that are not between comment pairs USER CODE BEGIN and *USER CODE END. Other portions of this file, whether *inserted by the user or by software development tools *are owned by their respective copyright owners. * *COPYRIGHT(c) 2018 STMicroelectronics * *Redistribution and use in source and binary forms, with or withoutmodification, *are permitted provided that the following conditions are met: * 1. Redistributions of sourcecode must retain the above copyright notice, * this list of conditions andthe following disclaimer. * 2. Redistributions in binaryform must reproduce the above copyright notice, * this list of conditions andthe following disclaimer in the documentation * and/or other materialsprovided with the distribution. * 3. Neither the name ofSTMicroelectronics nor the names of its contributors * may be used to endorse orpromote products derived from this software * without specific priorwritten permission. * *THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "ASIS" *AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR *SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER *CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, *OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE *OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes------------------------------------------------------------------*/ #include "main.h" #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ // #definePB1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_8) // #definePBFR1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_9) // #definePBINC1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_10) // #definePBDEC1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_11) // #definePB2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_12) // #definePBFR2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_13) // #definePBINC2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14) // #definePBDEC2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_15) #include"lcd_character.h" #include"keypad_4x4.h" #define KANANMOTOR11HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET) #define KANANMOTOR10HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET) #define KIRIMOTOR11HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET) #define KIRIMOTOR10 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET) #define KANANMOTOR21HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET) #define KANANMOTOR20HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET) #define KIRIMOTOR21HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET) #define KIRIMOTOR20HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET) /* USER CODE END Includes */ /* Private variables---------------------------------------------------------*/ TIM_HandleTypeDef htim2; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ /* USER CODE END PV */ /* Private function prototypes-----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef*htim); /* USER CODE BEGIN PFP */ /* Private function prototypes-----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** *@brief The application entry point. * *@retval None */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCUConfiguration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flashinterface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ lcd_init(); keypad_init(); /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGINSysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim2); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { // if(keypad_get_key_value()=='A') // { // TIM2->CCR3=90; // KANANMOTOR11; // KIRIMOTOR10; // HAL_Delay(5000); // // KANANMOTOR10; // KIRIMOTOR10; // HAL_Delay(1000); // // KIRIMOTOR11; // KANANMOTOR10; // HAL_Delay(5000); // } while(keypad_get_key_value()=='A')//START STOP MOTOR 1 { TIM2->CCR3=90; KANANMOTOR11; KIRIMOTOR10; HAL_Delay(500); KANANMOTOR20; KIRIMOTOR20; lcd_gotoxy(0,0); lcd_puts(" Start Motor 1 "); lcd_gotoxy(0,1); lcd_puts(" Motor 1 left "); if(keypad_get_key_value()=='A') { TIM2->CCR3=90; KANANMOTOR10; KIRIMOTOR10; HAL_Delay(500); KANANMOTOR20; KIRIMOTOR20; lcd_gotoxy(0,0); lcd_puts(" Stop Motor 1 "); lcd_gotoxy(0,1); lcd_puts(" "); } } while(keypad_get_key_value()=='B')//START STOP MOTOR 2 { TIM2->CCR4=90; KANANMOTOR21; KIRIMOTOR20; HAL_Delay(500); KANANMOTOR10; KIRIMOTOR10; lcd_gotoxy(0,0); lcd_puts(" Start Motor 2 "); lcd_gotoxy(0,1); lcd_puts(" Motor 2 left "); if(keypad_get_key_value()=='B') { TIM2->CCR4=90; KANANMOTOR20; KIRIMOTOR20; HAL_Delay(500); KANANMOTOR10; KIRIMOTOR10; lcd_gotoxy(0,0); lcd_puts(" Stop Motor 2 "); lcd_gotoxy(0,1); lcd_puts(" "); } } while(keypad_get_key_value()=='C')//KANAN KIRI MOTOR 1 { TIM2->CCR3=90; KANANMOTOR10; KIRIMOTOR11; HAL_Delay(500); KANANMOTOR20; KIRIMOTOR20; lcd_gotoxy(0,0); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" Motor 1 right "); if(keypad_get_key_value()=='C') { TIM2->CCR3=90; KANANMOTOR11; KIRIMOTOR10; HAL_Delay(500); KANANMOTOR20; KIRIMOTOR20; lcd_gotoxy(0,0); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" Motor 1 left "); } } while(keypad_get_key_value()=='D')//START STOP MOTOR 2 { TIM2->CCR4=90; KANANMOTOR20; KIRIMOTOR21; HAL_Delay(500); KANANMOTOR10; KIRIMOTOR10; lcd_gotoxy(0,0); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" Motor 2 kanan "); if(keypad_get_key_value()=='D') { TIM2->CCR4=90; KANANMOTOR21; KIRIMOTOR20; HAL_Delay(500); KANANMOTOR10; KIRIMOTOR10; lcd_gotoxy(0,0); lcd_puts(" "); lcd_gotoxy(0,1); lcd_puts(" Motor 2 kiri "); } } // if(ready==1) // { // if(keypad_get_key_value()=='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; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } /**Configure the Systick interrupt time */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /**Configure the Systick */ HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* TIM2 init function */ static void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler= 249; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 111; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_Base_Init(&htim2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if(HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if(HAL_TIM_PWM_Init(&htim2) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if(HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) !=HAL_OK) { _Error_Handler(__FILE__, __LINE__); } 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_3) !=HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if(HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) !=HAL_OK) { _Error_Handler(__FILE__, __LINE__); } HAL_TIM_MspPostInit(&htim2); } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE,GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pins : PE8 PE9 PE10 PE11 */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : PE12 PE13 PE14 PE15 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : PB12 PB13 PB14 PB15 */ GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; 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 : PA8 PA9 */ GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |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(GPIOD, &GPIO_InitStruct); /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** *@brief This function is executed in caseof error occurrence. *@param file: The file name as string. *@param line: The line in file as anumber. *@retval None */ void _Error_Handler(char *file, int line) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HALerror return state */ while(1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** *@brief Reports the name of the sourcefile and the source line number * where the assert_paramerror has occurred. *@param file: pointer to the source filename *@param line: assert_param error linesource number *@retval None */ void assert_failed(uint8_t* file, uint32_tline) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the filename 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) COPYRIGHTSTMicroelectronics *****END OF FILE****/ |
| 好资料 |
微信公众号
手机版