【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 */
}

執行效果如下:

你會發現這兩個效果是差不多,因此可以視情況而選擇測速方法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章