【STM32学习】(19)STM32实现直流电机测转速(霍尔传感器)

最近在学习STM32单片机

本次博文想记录一下32单片机连接霍尔传感器来测量直流电机转速。

材料准备:

1.单片机:STM32L052K8*

2.霍尔传感器

3.直流电机

电路图如下:

其中,单片机和直流电机不用介绍,下面介绍一下霍尔传感器。

主要想说一下霍尔传感器的引脚怎么去看,如下图看:

其他一些性能参数暂时不需要管,一般情况肯定够用的。

下面讲一下测转速的实现原理

霍尔传感器检测到金属时,会出现低电平,当金属块离开时会变成高电平,就是这样循环往复的记录电机转动的圈数。

实现方式用定时器实现,有两种实现方法,这里记录一下:

方法一:

接线:

电机接在PA4口

霍尔传感器接在PA6口

定时器实现10us定时,在回调函数中实现功能。代码如下:

回调函数,实现如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		cnt++;
		if(HAL_GPIO_ReadPin(HUOER_GPIO_Port,HUOER_Pin) == 0  && 0 == flag)
		{
		  count_c++; 
		  flag = 1;
		}
		else if(HAL_GPIO_ReadPin(HUOER_GPIO_Port,HUOER_Pin) == 1)
		{
		  flag = 0;
		}
		if(cnt>=100000) 
		{
			printf("\n\r***1秒钟电机旋转的圈数为:%d 圈****\n\r",count_c);
			count_c = 0;
			cnt = 0; 
		}
	}
}

main函数:

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_USART1_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	printf("\n\r***wantin***\n\r");
  /* USER CODE END 2 */
	HAL_GPIO_WritePin(MOTO_GPIO_Port,MOTO_Pin,GPIO_PIN_SET);
	HAL_TIM_Base_Start_IT(&htim2);
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

	  
  }
  /* USER CODE END 3 */
}

效果如下:

方法二:(该方法不太建议使用),因为在while(1)里面实现的圈数统计,这样不好的原因是以后while(1)中功能增加,会有执行时间误差,不易准确,但只实现测速还是可以的。定时器设置1s

回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == htim2.Instance)
	{
		printf("\n\r***1秒钟电机旋转的圈数为:%d 圈****\n\r",count_c);
		count_c = 0;
	}
}

main函数:

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_USART1_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
	printf("\n\r***wantin***\n\r");
  /* USER CODE END 2 */
	HAL_GPIO_WritePin(MOTO_GPIO_Port,MOTO_Pin,GPIO_PIN_SET);
	HAL_TIM_Base_Start_IT(&htim2);
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
	  
	  if(HAL_GPIO_ReadPin(HUOER_GPIO_Port,HUOER_Pin) == 0  && 0 == flag)
	  {
		  count_c++; 
		  flag = 1;
	  }
	  else if(HAL_GPIO_ReadPin(HUOER_GPIO_Port,HUOER_Pin) == 1)
	  {
		  flag = 0;
	  }
	  
  }
  /* USER CODE END 3 */
}

执行效果如下:

你会发现这两个效果是差不多,因此可以视情况而选择测速方法。

 

  • 22
    点赞
  • 266
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小材大用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值