【STM32学习】(19)STM32实现直流电机测转速(霍尔传感器) |
您所在的位置:网站首页 › 霍尔编码器电机原理图 › 【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 */ }执行效果如下: 你会发现这两个效果是差不多,因此可以视情况而选择测速方法。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |