你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何用微控制器旋转直流电机

[复制链接]
点点&木木 发布时间:2019-3-21 09:10
本帖最后由 点点&木木 于 2019-4-12 11:55 编辑

这个项目是根据我对微控制器课程的分配。它可以从键盘上汲取电机直流轮。
1.jpg


这个项目中使用的东西
硬件组件
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,将改变第二个电机的旋转。当我做这个项目时,我想在键盘上添加按钮,以增加和减少电机的旋转。


原理图
组态
2.jpg


加1
3.jpg


加2
4.jpg


加3
5.jpg



加4
6.jpg



加5
7.jpg



电路板
8.jpg



代码

/**
******************************************************************************
  *@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****/


收藏 评论1 发布时间:2019-3-21 09:10

举报

1个回答
lmyyjx 回答时间:2019-4-24 19:43:02
好资料

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版