黄工无刷电机学习
直播中

张娜

7年用户 978经验值
私信 关注
[问答]

GPIO端口常用的模式有哪几种?有何用处

12v直流减速电机该怎么去配置?
GPIO端口常用的模式有哪几种?有何用处?

回帖(1)

张帆

2021-10-14 17:09:31
  直流有刷电机正反转控制
  首先我们得了解电机的种类
  
  我们这个小项目用的是12v直流减速电机,减速比是30 的
  1.电机正反转 cube配置教程
  第一次使用会详细讲解怎么配置,以后的一些基础配置,就不重复说明了。
  首先选用stm32f407ZGT6
  
  选定需要设置的pin脚会出现下图所示
  
  PA10在这个项目中是用来做正反转控制赋予高低电平的,是输出引脚,所以我们把PA10设置为GPIO_OUTPUT,下图所示
  
  工具选择:MDK-ARM
  
  代码.c和.h文件分开
  
  生成代码
  
  GPIO的端口常用的模式有以下几种:
  1.输入浮空
  2.输入上拉
  3.输入下拉
  4.模拟输入模式
  5.具有上拉或下拉的功能的开漏输出
  6.具有上拉或下拉的功能的推挽输出
  7.具有上拉或下拉的功能的复用功能推挽
  8.具有上拉或下拉的功能的复用功能开漏
  手册里写的太繁琐了,我就用通俗的语言来描述一下,上面几种模式的用处
  1.输入浮空,顾名思义,就是悬浮在空中,不上拉,不下拉,如果没有接外围设备,其电平是不确定的
  2.输入上拉,电压输入=数字地,并且有30~50欧姆的电阻
  3.输入下拉,电压输入=数字电源,并且有30~50欧姆的电阻
  4.模拟功能,当stm32进行AD(模数)转换时,需要将端口设置为模拟输入模式,该模式需要配合ADC外设使用,否则没有意义
  5.开漏输出,通用输出是普通用途的输出模式,GPIO是由一个PMOS管和NMOS管组合的反相器驱动,开漏电路中的“漏”是指MOS管的漏极(D),实际只用到NMOS管
  6.推挽输出,推挽输出具有驱动能力,GPIO是由一个PMOS管和NMOS管组合的反相器驱动,开漏电路中的“漏”是指MOS管的漏极(D),实际只用到NMOS管
  7.复用推挽,就是在开漏输出的模式下加了复用功能
  8.复用开漏,就是在推挽输出的模式下加了复用功能
  关键代码解读:
  typedef struct
  {
  uint32_t Pin; /GPIO引脚选择
  uint32_t Mode; / GPIO引脚模式
  uint32_t Pull; / GPIO 引脚上,下拉配置
  uint32_t Speed; / GPIO 引脚最大输出速度
  uint32_t Alternate; / GPIO 引脚复用
  }GPIO_InitTypeDef;
  ***这是C语言结构体的定义,如果不熟悉请自行翻阅资料
  GPIO编程流程分析
  GPIO端口时钟
  初始化GPIO引脚(为结构体成员赋值,然后调用HAL_GPIO_Init函数完成初始化设置
  根据项目要求控制引脚输出高低电平
  //引脚初始化
  void MX_GPIO_Init(void)
  {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  //等同于GPIO_InitTypeDef GPIO_ InitStruct;
  /* GPIO Ports Clock Enable /
  __HAL_RCC_GPIOA_CLK_ENABLE();
  //因为我们要是用GPIOA_10,所以我们要使能GPIOA时钟
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
  //PA10 电平拉低
  GPIO_InitStruct.Pin = GPIO_PIN_10;
  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);
  }
  void HAL_GPIO_WritePin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
  {
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));
  if(PinState != GPIO_PIN_RESET)
  {
  GPIOx-》BSRR = GPIO_Pin;
  }
  else
  {
  GPIOx-》BSRR = (uint32_t)GPIO_Pin 《《 16U;
  }
  }
  HAL_GPIO_WritePin函数有三个形参,第一个为GPIO_TypeDef类似指针变量,用于指定端口,如GPIOA.GPIOB…….GPIOI 赋值,第二个为GPIO_Pin,指定引脚,如GPIO_PIN_0 ,GPIO_PIN_1 ………GPIO_PIN_15 赋值;第三个为引脚状态,可用GPIO_PIN_SET或者GPIO_PIN_RESET赋值,分别对应指定引脚输出高低电平。
  电机正反转控制就是通过两个引脚的电平的控制,下一步就是通过pwm控制电机的速度。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分