利用串口上位機對直流電機進行調速。
這里選用到的芯片是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的原因。
接下來,連接串口,打開調試工具,選對波特率,即可輸入上述字符(大寫)來對電機進行控制。
注:這里寫的內容都十分簡單,主要是為了體現控制邏輯,並非適用於電機與電機驅動板。
