91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32如何實(shí)現(xiàn)可調(diào)頻率、 占空比的PWM波形,且可指定輸出脈沖個(gè)數(shù)?

黃工的嵌入式技術(shù)圈 ? 來源:網(wǎng)站整理 ? 2020-03-12 11:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

讀者朋友“*imYan*”問:

pwm實(shí)現(xiàn)頻率可調(diào)和占空比可調(diào)后怎么來實(shí)現(xiàn)輸出10個(gè)脈沖呢?我這邊看有門控或者單脈沖加重復(fù)計(jì)數(shù),黃老師平時(shí)用的什么方法?

我的回答:

使用兩個(gè)TIM定時(shí)器:一個(gè)輸出可調(diào)頻率、占空比的PWM,一個(gè)對輸出PWM脈沖計(jì)數(shù)(計(jì)時(shí))。

1.門控方式能實(shí)現(xiàn),但需要復(fù)雜的配置和計(jì)算,不推薦。

2.脈沖計(jì)數(shù)是比較實(shí)際,也是比較簡單的方式;

對輸出PWM脈沖計(jì)數(shù)(計(jì)時(shí))方法有多種:

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

2.由PWM頻率和脈沖個(gè)數(shù),計(jì)算輸出全部所需的時(shí)間,使用定時(shí)中斷,關(guān)閉輸出PWM;

3.利用定時(shí)器外部脈沖觸發(fā)(外部時(shí)鐘模式2功能),計(jì)數(shù)個(gè)數(shù)為所需脈沖個(gè)數(shù)(10個(gè)脈沖),則關(guān)閉輸出PWM;

STM32定時(shí)器

STM32的TIM定時(shí)器少則五六個(gè),多則二十個(gè)。 可能許多初學(xué)者覺得:那么多定時(shí)器用的完嗎? 那么多不是浪費(fèi)嗎?

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

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

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

2.對整個(gè)系統(tǒng)的實(shí)時(shí)性可能有影響;

所以不建議使用該方法。

Ⅱ幾種實(shí)現(xiàn)方法

使用兩個(gè)定時(shí)器配合輸出可調(diào)頻率、占空比的PWM波形,且可指定輸出脈沖個(gè)數(shù)的方法和原理其實(shí)不難。

輸出PWM的方法就是使用TIM定時(shí)器自帶有的PWM模式即可完成。主要難點(diǎn)在于還要控制指定輸出脈沖的個(gè)數(shù)。

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

1.脈沖中斷計(jì)數(shù)法

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

定時(shí)器同步(脈沖)中斷簡單的說,就是利用定時(shí)器同時(shí)產(chǎn)生一個(gè)相同頻率(或者說波形)的中斷信號(hào),在中斷里面對其累計(jì),累加個(gè)數(shù)為指定輸出波形個(gè)數(shù)則關(guān)閉PWM波形的輸出,同時(shí)關(guān)閉中斷計(jì)數(shù)。

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

它的原理,大致如下圖:

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

2.定時(shí)中斷法

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

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

它的原理,大致如下圖:

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

3.脈沖觸發(fā)法

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

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

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

Ⅲ外部時(shí)鐘源模式2實(shí)現(xiàn)方法

上面說過,使用PWM作為另一個(gè)定時(shí)器的輸入時(shí)鐘,即可達(dá)到對PWM計(jì)數(shù)的功能。

請參看手冊中TIM定時(shí)器時(shí)鐘選擇章節(jié)。

1.輸出PWM配置

/************************************************函數(shù)名稱 : PWM_TIM_Configuration功 能 : PWM輸出定時(shí)器配置參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/ void PWM_TIM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* 時(shí)鐘配置 */ 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); /* 時(shí)基配置 */ TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRESCALER; //預(yù)分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù) TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //定時(shí)周期 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;實(shí)際沒有使能定時(shí)器(輸出的配置見下面函數(shù)接口)

2.選擇外部時(shí)鐘,定時(shí)中斷配置

/************************************************函數(shù)名稱 : CNT_TIM_Configuration功 能 : 計(jì)時(shí)定時(shí)器配置參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/ void CNT_TIM_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 時(shí)鐘配置 */ 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); /* 使用外部時(shí)鐘源 */ TIM_ETRClockMode2Config(CNT_TIMx, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0); /* 時(shí)基配置 */ TIM_TimeBaseStructure.TIM_Prescaler = 0; //預(yù)分頻值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù) TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //定時(shí)周期 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);}

和常規(guī)的不同點(diǎn)在于: 使用外部時(shí)鐘源

TIM_ETRClockMode2Config(CNT_TIMx, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);

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

3.輸出PWM函數(shù)接口

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

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

我們只需要調(diào)用該函數(shù)接口就可以實(shí)現(xiàn)指定個(gè)數(shù)PWM輸出了。中途不用軟件參數(shù),輸出結(jié)束時(shí)自動(dòng)響應(yīng)定時(shí)中斷,關(guān)閉定時(shí)器。

中斷接口函數(shù)

/************************************************函數(shù)名稱 : CNT_TIM_IRQHandler功 能 : 計(jì)時(shí)中斷參 數(shù) : 無返 回 值 : 無作 者 : 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); //關(guān)閉PWM輸出 TIM_Cmd(CNT_TIMx, DISABLE); //關(guān)閉計(jì)數(shù) }}

Ⅳ實(shí)際效果和代碼

為方便大家,提供了一個(gè)簡單裸機(jī)程序:

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

main函數(shù)中實(shí)現(xiàn)效果:間隔240ms(軟件延時(shí)不精確)輸出10個(gè)PWM波形

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

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

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

密碼:4jf3

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    116

    文章

    5867

    瀏覽量

    225566
  • STM32
    +關(guān)注

    關(guān)注

    2309

    文章

    11161

    瀏覽量

    373380
  • 輸出脈沖
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6490
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    脈沖/頻率計(jì)數(shù)采集模塊:高速脈沖+頻率,支持?jǐn)嚯姳4?/a>

    脈沖/頻率計(jì)數(shù)采集模塊是工業(yè)里專門 “數(shù)脈沖、測頻率” 的小硬件,相當(dāng)于給傳感器、電機(jī)、流量計(jì)裝了一個(gè)高精度計(jì)數(shù)器 + 測速儀。 一、主要功能 脈沖
    的頭像 發(fā)表于 03-04 16:06 ?43次閱讀

    脈沖寬度調(diào)制技術(shù)詳解,如何學(xué)習(xí)

    脈沖寬度調(diào)制(Pulse Width Modulation,簡稱PWM)是一種通過改變脈沖信號(hào)的寬度來控制模擬電路的技術(shù)。這種技術(shù)利用數(shù)字信號(hào)來控制模擬電路,通過調(diào)節(jié)脈沖
    的頭像 發(fā)表于 02-02 12:07 ?311次閱讀
    <b class='flag-5'>脈沖</b>寬度調(diào)制技術(shù)詳解,如何學(xué)習(xí)

    【瑞薩RA × Zephyr開發(fā)板評(píng)測】+動(dòng)態(tài)調(diào)節(jié)PWM占空比測試

    GTPR 設(shè)置的值)/下溢 ? 周期計(jì)數(shù)功能完成 本設(shè)計(jì)在每個(gè)周期溢出時(shí)產(chǎn)生中斷,進(jìn)一步調(diào)節(jié)占空比,使用P213引腳作為PWM輸出端口,生成動(dòng)態(tài)可調(diào)節(jié)
    發(fā)表于 01-20 19:18

    8路脈沖輸出模塊:占空比輸出可調(diào),助力工業(yè)自動(dòng)化

    脈沖輸出模塊是工業(yè)自動(dòng)化控制系統(tǒng)中精準(zhǔn)控制執(zhí)行機(jī)構(gòu)的關(guān)鍵組件,作為PLC、PAC、運(yùn)動(dòng)控制器的擴(kuò)展單元,它能將數(shù)字控制信號(hào)轉(zhuǎn)換為定頻、定寬、定數(shù)的脈沖序列,實(shí)現(xiàn)對電機(jī)轉(zhuǎn)速、執(zhí)行機(jī)構(gòu)位置
    的頭像 發(fā)表于 01-15 17:52 ?1121次閱讀

    LAT1202+TIM DMA burst 輸出變頻 PWM 波形應(yīng)用筆記

    客戶需要 MCU 輸出一組變頻的 PWM 波形來控制外圍器件,并且不同頻率脈沖個(gè)數(shù)也不同。
    發(fā)表于 01-11 17:22 ?0次下載

    工業(yè)自動(dòng)化精準(zhǔn)控制:8路PWM模塊(頻率可調(diào)+RS485/CAN隔離通訊)

    PWM 脈沖輸出模塊是基于脈沖寬度調(diào)制技術(shù)的工業(yè)級(jí)信號(hào)發(fā)生設(shè)備,核心功能是生成高頻、可編程、占空比可調(diào)
    的頭像 發(fā)表于 01-04 16:44 ?366次閱讀

    如何通過PWM脈沖控制電機(jī)?

    領(lǐng)域。 PWM脈沖是一種脈沖寬度調(diào)制技術(shù),通過調(diào)節(jié)脈沖的高低電平時(shí)間比例來控制電路的平均電平值,來對輸出
    發(fā)表于 11-28 06:58

    【RA-Eco-RA6M4開發(fā)板評(píng)測】PWM輸出

    通道詳情 PWM 輸出就是對外輸出脈寬(即占空比可調(diào)的方波信號(hào), 信號(hào)頻率由周期設(shè)定寄存器 G
    發(fā)表于 11-09 21:30

    RVMCU課堂「16」: 手把手教你玩轉(zhuǎn)RVSTAR—PWM使用篇

    的規(guī)則對各脈沖的寬度進(jìn)行調(diào)制,既可改變逆變電路輸出電壓的大小,也改變輸出頻率。其中,一個(gè)周期內(nèi)脈沖
    發(fā)表于 10-31 06:38

    請問怎么用HRTIM輸出可變占空比PWM?

    現(xiàn)在可以輸出單路PWM,但可變占空比PWM不知道怎么配置。請大佬幫助!
    發(fā)表于 07-25 08:16

    【沁恒CH585開發(fā)板免費(fèi)試用體驗(yàn)】PWM 輸出

    PWM4~PWM11)或6 路 16 位 PWM 輸出PWM4~PWM9),
    發(fā)表于 07-05 23:16

    開關(guān)電源三種控制模式:PWM/PFM/PSM

    輕負(fù)載時(shí)效率高,通過改變頻率調(diào)整輸出。PSM結(jié)合了PWM和PFM的特點(diǎn),輕負(fù)載時(shí)效率高開關(guān)損耗與輸出功率成正比?,F(xiàn)代電源控制器常采用
    發(fā)表于 06-09 16:11

    求助大佬我使用STM32F030F4P6 的PA3引腳輸出PWM波形

    查看數(shù)據(jù)手冊復(fù)用是AF0,TIM15_CH2(2),但是發(fā)現(xiàn)沒有辦法輸出PWM波形實(shí)現(xiàn)呼吸燈效果 實(shí)際嘗試PA3引腳讓LED燈亮滅閃爍是可以實(shí)現(xiàn)
    發(fā)表于 03-20 23:13

    【瑞薩RA2L1入門學(xué)習(xí)】01. PWM 呼吸燈

    是通過改變信號(hào)的脈沖寬度來實(shí)現(xiàn)對信號(hào)的控制。它由一個(gè)固定頻率的周期性方波和一個(gè)可調(diào)節(jié)的占空比組成。占空比
    發(fā)表于 03-07 11:43

    stm32同一個(gè)定時(shí)器不同的通道,可以不同時(shí)的輸出pwm波形嗎?

    請問,stm32的同一個(gè)定時(shí)器,不同的通道,可以不同時(shí)的輸出pwm波形嗎?比如tim1的ch1輸出,延時(shí)幾毫秒后tim1的ch2
    發(fā)表于 03-07 08:20