概述
在步進電機控制過程中,為了實現精確的位置和速度控制,經常需要輸出指定數量的脈沖。這就需要使用定時器功能來生成PWM脈沖信號。本文將詳細介紹如何利用STM32CUBEMX配置定時器以輸出指定數量的PWM脈沖。
定時器是STM32微控制器的一個重要功能模塊,可用于生成各種定時和計數操作。通過合理配置定時器的參數和模式,我們可以實現精確的脈沖輸出。
最近在弄ST的課程,需要樣片的可以加群申請:615061293 。
樣品申請
https://www.wjx.top/vm/PpC1kRR.aspx
視頻教學
https://www.bilibili.com/video/BV1k94y1C7Gw/
完整代碼下載
https://download.csdn.net/download/qq_24312945/88184732
STM32CUBEMX配置
一種比較簡單的方式是利用定時器中斷來產生固定數量的脈沖。在這種方法中,我們可以將定時器配置為PWM輸出模式,并在PWM輸出的中斷中進行計數操作。當計數達到設定的脈沖個數后,我們可以停止PWM輸出,從而實現精確控制。下面以定時器1的通道4為例,介紹具體的步驟:
在STM32CUBEMX中,選擇定時器1,并將其配置為PWM輸出模式。確保選擇了正確的定時器通道(通道4)。
配置定時器1的時鐘源和預分頻因子。根據應用的要求和系統時鐘頻率,選擇適當的時鐘源和預分頻因子,以獲得所需的脈沖頻率。將定時器1的時鐘源和預分頻因子配置為適合您的應用的值。
PWM頻率計算如下所示。
在上述配置中,將定時器1的預分頻系數設置為48-1,自動重載值設置為1000-1。根據這些配置,PWM的頻率可以計算為48,000,000 / ((48-1+1) * (1000-1+1)) = 1000Hz,即1kHz。
在定時器中,通道的 "pulse"(脈沖)是指定時器輸出的信號的一種特性。每個定時器通道都可用于生成脈沖信號,而 "pulse" 通常指的是單個脈沖的持續時間。在這種設置中,我們將脈沖的占空比配置為50%,因此設置為500-1。
當PWM脈沖完成時,我們需要觸發一個回調函數。HAL_TIM_PWM_PulseFinishedCallback函數是用于在非阻塞模式下處理PWM脈沖完成的回調函數。
為了觸發HAL_TIM_PWM_PulseFinishedCallback回調函數,需要啟用Capture Compare Interrupt中斷。
產生固定數量的PWM
首先,可以定義一個全局變量,該變量用于控制輸出脈沖的個數。通過操作該變量,我們可以在程序中靈活地控制所需的脈沖數量。
/* USER CODE BEGIN 0 */
void MX_GPIO_Init_mode3(void);
uint16_t STSPIN220_PwmNum;
uint8_t STSPIN220_flag=0;//電機完成步數標志位
uint8_t STSPIN220_Dir_flag=0;//方向
/* USER CODE END 0 */
首先,使用MX_TIM1_Init()初始化定時器1。
接下來,當需要輸出脈沖時,將所需的脈沖數量賦值給變量STSPIN220_PwmNum。
最后,使用HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_4)啟動定時器1的PWM中斷輸出。
STSPIN220_PwmNum = 20;
MX_TIM1_Init();
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
HAL_TIM_PWM_PulseFinishedCallback回調函數的實現部分。
在函數內部,如果STSPIN220_PwmNum的值為0,即已經輸出了所需的脈沖個數,那么通過調HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_4)停止定時器1的PWM中斷輸出,以達到停止脈沖輸出的目的。
其次對全局變量STSPIN220_PwmNum進行遞減操作,表示完成了一個脈沖的輸出就進行減1。接著,通過條件判斷if (STSPIN220_PwmNum == 0),檢查是否已經輸出了指定數量的脈沖。
這段代碼的作用是在每次PWM波形周期完成時,更新全局變量STSPIN220_PwmNum的值,并在達到指定的脈沖數量后停止PWM中斷輸出。通過這種方式,可以實現精確控制輸出脈沖個數的功能。
/* USER CODE BEGIN 4 */
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(STSPIN220_PwmNum==0)
{
HAL_TIM_PWM_Stop_IT(&htim1,TIM_CHANNEL_4);
STSPIN220_flag=1;//電機完成步數標志位
}
STSPIN220_PwmNum--;
}
/* USER CODE END 4 */
產生波形如下所示,可以看到有20個脈沖。
電機設置
這里使用的電機為步進角為18°,1:30的減速比,在這種情況下,如果步進電機的步進角為18°,減速比為1:30,那么旋轉一周所需的脈沖數量可以計算為:
旋轉一周所需脈沖 = (360 / 步進角) * 減速比 * 細分數
其中,步進角以度為單位,減速比是相對于電機輸出軸和實際應用中的旋轉軸之間的比率,細分數表示步進電機驅動器將一個步進角分割成多少個微步。
根據這個公式來計算出所需的脈沖數量,從而實現旋轉一周的控制。
STSPIN220初始化
STSPIN220修改后初始化如下所示。
/* USER CODE BEGIN 2 */
MX_GPIO_Init_mode3();
HAL_Delay(100);
STSPIN220_SetStepMode(0);//mode1-mode4都關閉
STSPIN220_enable(0);//使能操作 1使能0失能
STSPIN220_Stby(1);//低功耗模式 1開啟低功耗0關閉低功耗
HAL_Delay(100);
STSPIN220_SetStepMode(2);//細分操作
STSPIN220_Stby(0);//低功耗模式 1開啟低功耗0關閉低功耗,加載mode
HAL_Delay(100);//等待電平穩定
STSPIN220_setDirection(0);//0反1正
HAL_Delay(100);//等待電平穩定
STSPIN220_enable(1);//使能操作 1使能0失能
HAL_Delay(100);
STSPIN220_PwmNum = 600*2;//步進角為18°,1:30的減速比,細分2則需要走(360/18)*30*2為一圈
MX_TIM1_Init();
// HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
/* USER CODE END 2 */
主程序
實現電機循環正轉1圈反轉1圈代碼如下所示。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(STSPIN220_flag)
{
HAL_Delay(1000);
// STSPIN220_Stby(1);//低功耗模式 1開啟低功耗0關閉低功耗
STSPIN220_flag=0;
if(STSPIN220_Dir_flag==0)
{
STSPIN220_Dir_flag=1;
STSPIN220_setDirection(1);//0反1正
HAL_Delay(100);
STSPIN220_PwmNum = 600*2;//步進角為18°,1:30的減速比,細分2則需要走(360/18)*30*2為一圈
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
}
else
{
STSPIN220_Dir_flag=0;
STSPIN220_setDirection(0);//0反1正
HAL_Delay(100);
STSPIN220_PwmNum = 600*2;//步進角為18°,1:30的減速比,細分2則需要走(360/18)*30*2為一圈
HAL_TIM_PWM_Start_IT(&htim1,TIM_CHANNEL_4);
}
}
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
審核編輯:湯梓紅
-
PWM
+關注
關注
114文章
5186瀏覽量
213939 -
步進電機
+關注
關注
150文章
3111瀏覽量
147486 -
定時器
+關注
關注
23文章
3248瀏覽量
114800 -
電機驅動器
+關注
關注
16文章
645瀏覽量
64680
發布評論請先 登錄
相關推薦
評論