最近在學習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 */
}
執行效果如下:
你會發現這兩個效果是差不多,因此可以視情況而選擇測速方法。