色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32如何實現可調頻率、 占空比的PWM波形,且可指定輸出脈沖個數?

黃工的嵌入式技術圈 ? 來源:網站整理 ? 2020-03-12 11:04 ? 次閱讀

讀者朋友“*imYan*”問:

pwm實現頻率可調和占空比可調后怎么來實現輸出10個脈沖呢?我這邊看有門控或者單脈沖加重復計數,黃老師平時用的什么方法?

我的回答:

使用兩個TIM定時器:一個輸出可調頻率、占空比的PWM,一個對輸出PWM脈沖計數(計時)。

1.門控方式能實現,但需要復雜的配置和計算,不推薦

2.脈沖計數是比較實際,也是比較簡單的方式;

對輸出PWM脈沖計數(計時)方法有多種:

1.IO中斷計數,或同步定時中斷計數:用另外一個定時器,按照相同頻率中斷計數(類似IO中斷);

2.由PWM頻率和脈沖個數,計算輸出全部所需的時間,使用定時中斷,關閉輸出PWM;

3.利用定時器外部脈沖觸發(外部時鐘模式2功能),計數個數為所需脈沖個數(10個脈沖),則關閉輸出PWM;

STM32定時器

STM32的TIM定時器少則五六個,多則二十個。 可能許多初學者覺得:那么多定時器用的完嗎? 那么多不是浪費嗎?

這么說吧,STM32的定時器功能非常強大,之所以有那么多定時器,原因在于使用定時器的地方有許多,本文要講的這個例子只是很基礎的一個例子。

當然,可能很多人想問:利用阻塞延時,控制IO高低變化輸出PWM這種方式就行啦,也很簡單。其實,這種方法的弊端很大。

1.輸出的PWM可能存在誤差;

2.對整個系統的實時性可能有影響;

所以不建議使用該方法。

Ⅱ幾種實現方法

使用兩個定時器配合輸出可調頻率、占空比的PWM波形,且可指定輸出脈沖個數的方法和原理其實不難。

輸出PWM的方法就是使用TIM定時器自帶有的PWM模式即可完成。主要難點在于還要控制指定輸出脈沖的個數。

對于如何控制輸出指定脈沖個數,下面大概說下三種方法:

1.脈沖中斷計數法

IO中斷,或者定時器同步(脈沖)中斷。

定時器同步(脈沖)中斷簡單的說,就是利用定時器同時產生一個相同頻率(或者說波形)的中斷信號,在中斷里面對其累計,累加個數為指定輸出波形個數則關閉PWM波形的輸出,同時關閉中斷計數。

比如:我輸出10個波形,10次中斷(每次+1)之后,關閉輸出。

它的原理,大致如下圖:

此方法建議在輸出高頻PWM時不要使用,頻繁中斷對系統實時性也是有一定影響。建議低于1KHz的PWM才使用此方法。

2.定時中斷法

基于上面第一種,不適合高頻PWM脈沖中斷。經過思考,我們是否可以將多次中斷的時間累加,只響應一次中斷。

原理就是把定時的時間設定為單個脈沖的n倍(n個脈沖),只使用一次中斷。

它的原理,大致如下圖:

看圖片中的提示,建議這個地方使用一個32位的定時器,這個值可能很大。

3.脈沖觸發法

此方法可以避免上面兩種方法中不足的地方, 相對上面兩對實用性更強。電路上面,需要將PWM輸出的波形,連接到另一個定時器的ETR引腳。

它的原理沒什么特殊的,就是和我們常用的定時更新中斷類似,只是輸入信號改成PWM脈沖波形(默認為內部時鐘CK_INT 如:36M)。

下面章節我就以該方法(第3種方法),PWM波形作為定時器的輸入時鐘的方式,用代碼給大家講述一下。

Ⅲ外部時鐘源模式2實現方法

上面說過,使用PWM作為另一個定時器的輸入時鐘,即可達到對PWM計數的功能。

請參看手冊中TIM定時器時鐘選擇章節。

1.輸出PWM配置

/************************************************函數名稱 : PWM_TIM_Configuration功 能 : PWM輸出定時器配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/ void PWM_TIM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* 時鐘配置 */ RCC_APB1PeriphClockCmd(PWM_TIM_CLK, ENABLE); RCC_AHB1PeriphClockCmd(PWM_TIM_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = PWM_TIM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(PWM_TIM_GPIO_PORT, &GPIO_InitStructure); /* 映射配置 */ GPIO_PinAFConfig(PWM_TIM_GPIO_PORT, PWM_TIM_SOURCE, PWM_TIM_AF); /* 時基配置 */ TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRESCALER; //預分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //定時周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分頻因子 TIM_TimeBaseInit(PWM_TIMx, &TIM_TimeBaseStructure); /* PWM模式配置 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能輸出 TIM_OCInitStructure.TIM_Pulse = 0xFFFF; //脈寬值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性 PWM_TIM_OCxInit(PWM_TIMx, &TIM_OCInitStructure); TIM_Cmd(PWM_TIMx, DISABLE);}

初始化頻率和占空比填充的值是最大值,即TIM_Period = 0xFFFF;TIM_Pulse = 0xFFFF;實際沒有使能定時器(輸出的配置見下面函數接口)

2.選擇外部時鐘,定時中斷配置

/************************************************函數名稱 : CNT_TIM_Configuration功 能 : 計時定時器配置參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/ void CNT_TIM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 時鐘配置 */ RCC_APB1PeriphClockCmd(CNT_TIM_CLK, ENABLE); RCC_AHB1PeriphClockCmd(CNT_TIM_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = CNT_TIM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CNT_TIM_GPIO_PORT, &GPIO_InitStructure); /* 映射配置 */ GPIO_PinAFConfig(CNT_TIM_GPIO_PORT, CNT_TIM_SOURCE, CNT_TIM_AF); /* NVIC配置 */ NVIC_InitStructure.NVIC_IRQChannel = CNT_TIM_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = CNT_TIM_Priority; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 使用外部時鐘源 */ TIM_ETRClockMode2Config(CNT_TIMx, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0); /* 時基配置 */ TIM_TimeBaseStructure.TIM_Prescaler = 0; //預分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //定時周期 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分頻因子 TIM_TimeBaseInit(CNT_TIMx, &TIM_TimeBaseStructure); TIM_ClearFlag(CNT_TIMx, TIM_FLAG_Update); TIM_ITConfig(CNT_TIMx, TIM_IT_Update, ENABLE); //使能"更新"中斷 TIM_Cmd(CNT_TIMx, DISABLE);}

和常規的不同點在于: 使用外部時鐘源

TIM_ETRClockMode2Config(CNT_TIMx, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);

注意檢測(捕獲)極性TIM_ExtTRGPolarity_Inverted,一般PWM都是高電平為脈沖波形,下降沿才算一個波形的計數。

3.輸出PWM函數接口

/************************************************函數名稱 : PWM_Output功 能 : 輸出PWM參 數 : Frequency --- 頻率 Dutycycle --- 占空比(12代表占空比為12%) NumPulse --- 脈沖個數返 回 值 : 無作 者 : strongerHuang*************************************************/ void PWM_Output(uint32_t Frequency, uint32_t Dutycycle, uint32_t NumPulse){ uint32_t pwm_period; uint32_t pwm_pulse; /* 輸出PWM */ pwm_period = PWM_CK_CNT/Frequency - 1; //計算出計數周期(決定輸出的頻率) pwm_pulse = (pwm_period + 1)*Dutycycle / 100; //計算出脈寬值(決定PWM占空比) TIM_Cmd(PWM_TIMx, DISABLE); //失能TIM TIM_SetCounter(PWM_TIMx, 0); //計數清零 TIM_SetAutoreload(PWM_TIMx, pwm_period); //更改頻率 PWM_TIM_SetComparex(PWM_TIMx, pwm_pulse); //更改占空比 TIM_Cmd(PWM_TIMx, ENABLE); //使能TIM /* 脈沖個數計時 */ TIM_Cmd(CNT_TIMx, DISABLE); TIM_SetCounter(CNT_TIMx, 0); TIM_SetAutoreload(CNT_TIMx, NumPulse-1); //設置中斷更新數 TIM_ClearFlag(CNT_TIMx, TIM_FLAG_Update); TIM_Cmd(CNT_TIMx, ENABLE);}

void PWM_Output(uint32_t Frequency, uint32_t Dutycycle, uint32_t NumPulse);

我們只需要調用該函數接口就可以實現指定個數PWM輸出了。中途不用軟件參數,輸出結束時自動響應定時中斷,關閉定時器。

中斷接口函數

/************************************************函數名稱 : CNT_TIM_IRQHandler功 能 : 計時中斷參 數 : 無返 回 值 : 無作 者 : strongerHuang*************************************************/ void CNT_TIM_IRQHandler(void){ if(TIM_GetITStatus(CNT_TIMx, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(CNT_TIMx, TIM_IT_Update); TIM_Cmd(PWM_TIMx, DISABLE); //關閉PWM輸出 TIM_Cmd(CNT_TIMx, DISABLE); //關閉計數 }}

Ⅳ實際效果和代碼

為方便大家,提供了一個簡單裸機程序:

int main(void){ System_Initializes(); while(1) { LED_TOGGLE(); //LED變化 Delay(5); //延時(約240ms) PWM_Output(1000, 20, 10); //1KHz, 20%占空比, 10個脈沖 }}

main函數中實現效果:間隔240ms(軟件延時不精確)輸出10個PWM波形

波形具體情況:輸出1KHz, 20%占空比, 10個脈沖精確的PWM波形

下載地址(STM32F401為例工程,STM32其他芯片類似):

鏈接:https://pan.baidu.com/s/10GPPxCky8SZmU9S9pleqJg

密碼:4jf3

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5181

    瀏覽量

    213799
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355743
  • 輸出脈沖
    +關注

    關注

    0

    文章

    4

    瀏覽量

    6349
收藏 人收藏

    評論

    相關推薦

    PWM波形的特性與優化

    脈沖的平均值,進而控制負載的平均功率。 2. 占空比 占空比(Duty Cycle)是PWM波形中一個周期內高電平時間與整個周期時間的比值。
    的頭像 發表于 11-29 09:13 ?395次閱讀

    PWM調頻的區別 基于PWM的電源管理方案

    的基本原理是通過調節脈沖信號的占空比(即高電平時間占總時間的比例)來控制輸出電壓或電流的大小。它利用一系列寬度不同的脈沖信號來模擬所需的電壓或電流
    的頭像 發表于 11-28 16:42 ?335次閱讀

    如何選擇合適的PWM頻率

    脈沖寬度調制(PWM)是一種廣泛使用的信號處理技術,它通過調整脈沖的寬度來控制輸出電壓或電流的平均值。在電機控制、LED調光、電源管理等領域,PWM
    的頭像 發表于 11-18 15:27 ?948次閱讀

    pwm與spwm波,載波、參考波與輸出波形的關系

    存在著密切的關系。 一、PWM波的基本原理與關系 1. PWM波的基本原理 PWM是一種利用微處理器的數字信號輸出來對模擬電路進行控制的技術。它通過改變
    的頭像 發表于 08-14 16:58 ?2015次閱讀

    pwm頻率對電機有什么影響

    PWM脈沖寬度調制)是一種廣泛應用于電機控制領域的技術,通過調整脈沖占空比實現對電機的精確控制。P
    的頭像 發表于 08-08 16:12 ?3635次閱讀

    PLC輸出pwm信號怎么看頻率

    一、PWM信號的基本概念 脈沖寬度調制(PWM) :PWM是一種對模擬信號進行數字控制的方法。它通過改變脈沖的寬度來控制信號的
    的頭像 發表于 08-08 15:32 ?973次閱讀

    STM32F103ZET6能否實現同時實現占空比和相位可調呢,是不是只能實現其中一個

    STM32F103ZET6能否實現同時實現占空比和相位可調呢,是不是只能實現其中一個,我現在想要
    發表于 06-06 15:02

    一文帶你了解PWM原理、頻率占空比

    會下降。也就是,在一定的頻率下,通過不同的占空比 即可得到不同的輸出模擬電壓。pwm就是通過這種原理實現D/A轉換的。總結:
    發表于 03-27 14:12

    使用定時器控制pwm發送脈沖,如何能夠同時控制頻率脈沖個數

    大神門,使用定時器控制pwm發送脈沖,如何能夠同時控制頻率脈沖個數。因為需要精準控制步進電機轉動角度,還有速度,需要這個功能。并且
    發表于 03-14 07:02

    pwm如何產生指定個數脈沖,而不占用cpu?

    pwm如何產生指定個數脈沖,而不占用cpu?目前我能想到的辦法是:1.定時器產生一次中斷,在中斷函數里計數。這種方法頻繁中斷,影響cpu效率。并且當所產生的
    發表于 03-14 06:34

    什么是PWM和SPWM波形?兩者的區別在哪?

    和SPWM波形以及它們之間的區別。 首先,我們來了解PWM波形PWM是一種將模擬信號轉換為數字信號的方法。它通過改變脈沖信號的
    的頭像 發表于 02-05 16:36 ?3918次閱讀

    pwm占空比和電壓的關系 pid輸出pwm占空比怎么聯系

    PWM(脈寬調制)指的是通過改變周期內的高電平時長來調整信號的占空比占空比是指高電平時長與周期時長的比值,常用百分比來表示。PWM的主要應用是在調速控制、電源控制以及通信傳輸等領域。
    的頭像 發表于 02-02 17:17 ?6657次閱讀

    GTM怎么輸出指定脈沖數的PWM呢?

    我們都知道GTM生成獨立的可調占空比可調周期PWM,或帶死區的互補PWM,那么怎么
    發表于 01-26 08:08

    pwm頻率占空比的計算公式

    和應用。 一、PWM的基本原理 PWM是一種將模擬信號轉化為數字信號的技術,通過調整數字信號的脈沖寬度來控制輸出電平的高低。基本原理如下: 1.1
    的頭像 發表于 12-28 11:40 ?2w次閱讀

    怎么實現dsp芯片輸出占空比固定的pwm波形

    實現DSP芯片輸出占空比固定的PWM波形需要以下步驟:定義占空比、設置計時器、計算周期和持續時間
    的頭像 發表于 12-26 17:28 ?2685次閱讀
    主站蜘蛛池模板: 午夜伦yy44880影院| bl高h文合集| 日本韩国欧美一区| 精品夜夜澡人妻无码AV蜜桃| 啊灬啊别停灬用力啊在线观看视频 | 精品无人区麻豆乱码1区2 | 拉菲娱乐主管高工资q39709| 高清不卡伦理电影在线观看| 在线a亚洲视频| 性xxxx18公交车| 人人爽久久久噜噜噜丁香AV| 久久精品一本到东京热| 国产人妻XXXX精品HD电影| RUNAWAY韩国动漫免费网| 亚洲一区免费香蕉在线| 无码AV毛片色欲欧洲美洲| 欧美激情视频二区| 看80后操| 久久re热线视频精品99| 国产精品一区二区AV交换| 办公室里呻吟的丰满老师电影| 主播蜜汁丝袜精品自拍| 亚洲综合无码一区二区| 午夜一区欧美二区高清三区| 日本午夜精品久久久无码| 免费在线看视频| 快播黄色电影| 久久re热在线视频精99| 狠狠色狠狠色综合日日32| 国产精品女主播主要上线| 叮当成人社区| 成人无码国产AV免费看| JIZZ学生13| hdsex老太婆70| 99热在线免费播放| 97无码人妻精品1国产精东影业| 一二三四在线播放免费观看中文版视频| 亚洲精品123区在线观看| 亚洲成a人片777777久久| 小sao货ji巴cao死你视频| 无遮18禁在线永久免费观看挡|