用上位機來對直流電機進行調速(HAL庫)


利用串口上位機對直流電機進行調速。

這里選用到的芯片是STM32F407VET6,直流電機為TT馬達,還有L298N驅動板

我們需要明白,L298N的工作原理是:給定一個工作電壓,再提供占空比不同的PWM波,就可以產生不同大小的電壓來控制電機的旋轉。所以我們需要讓STM32芯片生成可調占空比的PWM波,而調整占空比的方式就是通過串口收發數據來修改。

那么先進行配置:
下面分別為RCC與SYS,還有TIM1的配置。

打開TIM1的兩處通道設置為pwm是因為需要控制正反轉。

還需要打開串口一並開啟中斷

時鍾樹配置則168Hz拉滿,這里就不放圖了。值得注意的是,需要看清自己的晶振大小,cube初始生成25Hz的晶振,而實際上很多開發板都只有8Hz。

下面進行程序的編譯。

首先為了方便,我們先對printf與scanf進行重定向,具體方式請參考我之前的隨筆。

變量的定義(其中as為pwm波的初始占空比預設):

/* USER CODE BEGIN PV */
	uint8_t Receive_date;
	uint16_t as=60;
	int x=1,y=0;
/* USER CODE END PV */

打開串口接收中斷並給初始占空比輸出pwm波:

  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,&Receive_date,1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);

  /* USER CODE END 2 */

在下方編寫串口中斷回調部分的程序:

/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	
	if(huart->Instance == USART1)
	{
		if(Receive_date=='N')
		{
			if((as-3)>=45)
			{
				as=as-3;
				if(y==0)
				{
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,as);
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
				}
				if(y==1)
				{
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,as);
				
				}
			}
		}
		if(Receive_date=='M')
		{
			if((as+3)<=75)
			{
				as=as+3;
				if(y==0)
				{
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,as);
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
				}
				if(y==1)
				{
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
					__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,as);
				
				}
			}
		}
		if(Receive_date=='S')
		{
			if(y==0)
			{
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,as);
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
			}
			if(y==1)
			{
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,as);
			
			}
		}
		if(Receive_date=='P')
		{
			__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
			__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
		}
		if(Receive_date=='K')
		{
			__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
			__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
			x=1;
		}
	}
	HAL_UART_Receive_IT(&huart1,&Receive_date,1);

}
/* USER CODE END 4 */

其中“N”為減速,“M”為加速,“S”為啟動,“P”為停止,“K”為反轉。變量x用作標志位,返回到while中進行反轉程序,而變量y則是為了記住正反轉狀態。

下面是主函數while中的反轉程序:

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(x==1)
		{
			HAL_Delay(500);
			if(y==0)
			{
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,as);
				y=1;
			}
			else if(y==1)
			{
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,as);
				__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
				y=0;
			}
			x=0;
		}
  }
  /* USER CODE END 3 */

反轉前先給半秒鍾的延時,因為突然反轉可能會燒壞驅動板,所以需要一個停滯,而中斷中切不可延時,所以這也是將反轉程序寫在while的原因。

接下來,連接串口,打開調試工具,選對波特率,即可輸入上述字符(大寫)來對電機進行控制。

注:這里寫的內容都十分簡單,主要是為了體現控制邏輯,並非適用於電機與電機驅動板。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM