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

基于STM32CUBEMX驅(qū)動(dòng)低壓步進(jìn)器電機(jī)驅(qū)動(dòng)器STSPIN220(1)----套件概述

基于STM32CUBEMX驅(qū)動(dòng)低壓步進(jìn)器電機(jī)驅(qū)動(dòng)器STSPIN220(2)----驅(qū)動(dòng)STSPIN220

stm32用定時(shí)器通過驅(qū)動(dòng)器控制多個(gè)步進(jìn)電機(jī) 精選資料下載
Stm32CubeMx基本定時(shí)器的概念
LL庫如何實(shí)現(xiàn)STM32使用定時(shí)器主從模式輸出指定數(shù)量脈沖?
怎樣使用定時(shí)器輸出指定個(gè)數(shù)的PWM脈沖
【MCU】基于STM32CubeMX定時(shí)器中斷實(shí)現(xiàn)LED閃爍

STM32CUBEMX配置教程(十三)STM32的定時(shí)器觸發(fā)的固定頻率DAC輸出(使用DMA)

STM32 CubeMX學(xué)習(xí):3. 定時(shí)器閃爍LED

【STM32Cube_12】使用通用定時(shí)器產(chǎn)生PWM驅(qū)動(dòng)蜂鳴器

STM32CubeMX_定時(shí)器中斷_PWM

基于HAL庫定時(shí)器中斷的閉環(huán)步進(jìn)電機(jī)驅(qū)動(dòng)與精準(zhǔn)控制脈沖數(shù)

基于定時(shí)器中斷的ULN2003驅(qū)動(dòng)器/步進(jìn)電機(jī)驅(qū)動(dòng)程序

用STM32定時(shí)器中斷產(chǎn)生PWM控制步進(jìn)電機(jī)

評(píng)論