最近在学习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 */
}
执行效果如下:
你会发现这两个效果是差不多,因此可以视情况而选择测速方法。
作者:xiaocaidayong