娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月16日(星期一)

2020年06月16日 | STM32學(xué)習(xí)筆記(5):通用定時器PWM輸出

發(fā)布者:boyhxz 來源: eefocus關(guān)鍵字:STM32  通用定時器  PWM輸出 手機看文章 掃描二維碼
隨時隨地手機看文章

1.TIMER輸出PWM基本概念

脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬度的控制。一般用來控制步進電機的速度等等。


STM32的定時器除了TIM6和TIM7之外,其他的定時器都可以用來產(chǎn)生PWM輸出,其中高級定時器TIM1和TIM8可以同時產(chǎn)生7路的PWM輸出,而通用定時器也能同時產(chǎn)生4路的PWM輸出。


1.1PWM輸出模式

STM32的PWM輸出有兩種模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位確定的(“110”為模式1,“111”為模式2)。模式1和模式2的區(qū)別如下:

110:PWM模式1-在向上計數(shù)時,一旦TIMx_CNTTIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。

111:PWM模式2-在向上計數(shù)時,一旦TIMx_CNTTIMx_CCR1時通道1為有效電平,否則為無效電平。

由此看來,模式1和模式2正好互補,互為相反,所以在運用起來差別也并不太大。

而從計數(shù)模式上來看,PWM也和TIMx在作定時器時一樣,也有向上計數(shù)模式、向下計數(shù)模式和中心對齊模式,關(guān)于3種模式的具體資料,可以查看《STM32參考手冊》的“14.3.9 PWM模式”一節(jié),在此就不詳細贅述了。


1.2PWM輸出管腳

PWM的輸出管腳是確定好的,具體的引腳功能可以查看《STM32參考手冊》的“8.3.7定時器復(fù)用功能重映射”一節(jié)。在此需要強調(diào)的是,不同的TIMx有分配不同的引腳,但是考慮到管腳復(fù)用功能,STM32提出了一個重映像的概念,就是說通過設(shè)置某一些相關(guān)的寄存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這些重映像的管腳也是由參考手冊給出的。比如說TIM3的第2個通道,在沒有重映像的時候,指定的管腳是PA.7,如果設(shè)置部分重映像之后,TIM3_CH2的輸出就被映射到PB.5上了,如果設(shè)置了完全重映像的話,TIM3_CH2的輸出就被映射到PC.7上了。


1.3PWM輸出信號

PWM輸出的是一個方波信號,信號的頻率是由TIMx的時鐘頻率和TIMx_ARR預(yù)分頻器所決定的,具體設(shè)置方法在前面一個學(xué)習(xí)筆記中有詳細的交代。而輸出信號的占空比則是由TIMx_CRRx寄存器確定的。其公式為“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通過向CRR中填入適當?shù)臄?shù)來輸出自己所需的頻率和占空比的方波信號。


2.TIMER輸出PWM實現(xiàn)步驟

1.設(shè)置RCC時鐘;

2.設(shè)置GPIO時鐘;

3.設(shè)置TIMx定時器的相關(guān)寄存器;

4.設(shè)置TIMx定時器的PWM相關(guān)寄存器。


第1步設(shè)置RCC時鐘已經(jīng)在前文中給出了詳細的代碼,在此就不再多說了。需要注意的是通用定時器TIMx是由APB1提供時鐘,而GPIO則是由APB2提供時鐘。注意,如果需要對PWM的輸出進行重映像的話,還需要開啟引腳復(fù)用時鐘AFIO。


第2步設(shè)置GPIO時鐘時,GPIO模式應(yīng)該設(shè)置為復(fù)用推挽輸出GPIO_Mode_AF_PP,如果需要引腳重映像的話,則需要用GPIO_PinRemapConfig()函數(shù)進行設(shè)置。


第3步設(shè)置TIMx定時器的相關(guān)寄存器時,和前一篇學(xué)習(xí)筆記一樣,設(shè)置好相關(guān)的TIMx的時鐘和技術(shù)模式等等。具體設(shè)置參看“TIMER基本定時功能”的學(xué)習(xí)筆記。


第4步設(shè)置PWM相關(guān)寄存器,首先要設(shè)置PWM模式(默認情況下PWM是凍結(jié)的),然后設(shè)置占空比(根據(jù)前面所述公式進行計算),再設(shè)置輸出比較極性:當設(shè)置為High時,輸出信號不反相,當設(shè)置為Low時,輸出信號反相之后再輸出。最重要是是要使能TIMx的輸出狀態(tài)和使能TIMx的PWM輸出使能。


相關(guān)設(shè)置完成之后,就可以通過TIM_Cmd()來打開TIMx定時器,從而得到PWM輸出了。


3.TIMER輸出PWM源代碼

由于我現(xiàn)在手上的奮斗開發(fā)板是將PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要進行引腳重映像。打開TIM3之后,PWM輸出,使得LED點亮,通過改變PWM_cfg()中的占空比可以調(diào)節(jié)LED的亮度。


#include "stm32f10x_lib.h"


void RCC_cfg();

void GPIO_cfg();

void TIMER_cfg();

void PWM_cfg();

//占空比,取值范圍為0-100

int dutyfactor = 50;


int main()

{

int Temp;

RCC_cfg();

GPIO_cfg();

TIMER_cfg();

PWM_cfg();


//使能TIM3計時器,開始輸出PWM

TIM_Cmd(TIM3, ENABLE);


while(1);

}


void RCC_cfg()

{

//定義錯誤狀態(tài)變量

ErrorStatus HSEStartUpStatus;


//將RCC寄存器重新設(shè)置為默認值

RCC_DeInit();


//打開外部高速時鐘晶振

RCC_HSEConfig(RCC_HSE_ON);


//等待外部高速時鐘晶振工作

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

//設(shè)置AHB時鐘(HCLK)為系統(tǒng)時鐘

RCC_HCLKConfig(RCC_SYSCLK_Div1);


//設(shè)置高速AHB時鐘(APB2)為HCLK時鐘

RCC_PCLK2Config(RCC_HCLK_Div1);


//設(shè)置低速AHB時鐘(APB1)為HCLK的2分頻

RCC_PCLK1Config(RCC_HCLK_Div2);


//設(shè)置FLASH代碼延時

FLASH_SetLatency(FLASH_Latency_2);


//使能預(yù)取指緩存

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


//設(shè)置PLL時鐘,為HSE的9倍頻8MHz * 9 = 72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


//使能PLL

RCC_PLLCmd(ENABLE);


//等待PLL準備就緒

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);


//設(shè)置PLL為系統(tǒng)時鐘源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


//判斷PLL是否是系統(tǒng)時鐘

while(RCC_GetSYSCLKSource() != 0x08);

}


//開啟TIM3的時鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

//開啟GPIOB的時鐘和復(fù)用功能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);


}


void GPIO_cfg()

{

GPIO_InitTypeDef GPIO_InitStructure;



//部分映射,將TIM3_CH2映射到PB5

// GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);


//選擇引腳5

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

//輸出頻率最大50MHz

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

//復(fù)用推挽輸出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


GPIO_Init(GPIOB,&GPIO_InitStructure);

}


void TIMER_cfg()

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


//重新將Timer設(shè)置為缺省值

TIM_DeInit(TIM3);

//采用內(nèi)部時鐘給TIM3提供時鐘源

TIM_InternalClockConfig(TIM3);

//預(yù)分頻系數(shù)為0,即不進行預(yù)分頻,此時TIMER的頻率為72MHz

TIM_TimeBaseStructure.TIM_Prescaler = 0;

//設(shè)置時鐘分割

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

//設(shè)置計數(shù)器模式為向上計數(shù)模式

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

//設(shè)置計數(shù)溢出大小,每計7200個數(shù)就產(chǎn)生一個更新事件,即PWM的輸出頻率為10kHz

TIM_TimeBaseStructure.TIM_Period = 7200 - 1;

//將配置應(yīng)用到TIM3中

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

}


void PWM_cfg()

{

TIM_OCInitTypeDef TimOCInitStructure;

//設(shè)置缺省值

TIM_OCStructInit(&TimOCInitStructure);

//PWM模式1輸出

TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

//設(shè)置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%

TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;

//TIM輸出比較極性高

TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//使能輸出狀態(tài)

TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//TIM3的CH2輸出

TIM_OC2Init(TIM3, &TimOCInitStructure);

//設(shè)置TIM3的PWM輸出為使能

TIM_CtrlPWMOutputs(TIM3,ENABLE);

}

關(guān)鍵字:STM32  通用定時器  PWM輸出 引用地址:STM32學(xué)習(xí)筆記(5):通用定時器PWM輸出

上一篇:STM32固件庫實現(xiàn)led亮滅閃爍和音頻發(fā)生器設(shè)計
下一篇:STM32自學(xué)筆記——定時器及PWM輸出

推薦閱讀

大約是從兩三年前開始,CES?這個被半導(dǎo)體充斥的電子展會,開始被越來越多的汽車廠商盯上。不論你是車迷還是數(shù)碼迷,“CES 變車展”這樣的驚訝,應(yīng)該已經(jīng)不再陌生。?和每年年初在拉斯維加斯舉辦的 CES 國際大展同源,亞洲版本 CES Asia 落在了中國魔都上海。在今年初的 CES 2018 上,奔馳發(fā)布了全新操作系統(tǒng) MBUX,拜騰、小鵬分別帶來了最新版...
據(jù)消息稱,在幾日前,廈門大學(xué)附屬第一醫(yī)院院長姜杰教授、胸外科于修義主任用達芬奇機器人給一位患者做了肺癌切除手術(shù)。 在手術(shù)中,醫(yī)生先在患者的胸部開了3個不到1厘米寬的操作孔、1個約3厘米的輔助操作口,再將機器人的機械臂放置在胸腔內(nèi),人體胸腔通過攝像頭形成的三維影像可以被放大10-15倍。 姜杰教授坐在操縱臺上,通過控制桿來操作,應(yīng)用比手...
前言我使用51,STC這一類的單片機做控制好幾年,一直是使用現(xiàn)成的程序,在其上修修改改,以達到需求動作目的即可。從來都是不求甚解。想法既是如此,會用即可,了解那么多做什么。此次又在做一項目,里面用到I2C通訊。本來是直接復(fù)制粘貼了事,卻沒想對里面的一個小小的延時函數(shù)起了興趣,由于本人是基礎(chǔ)功底只有5戰(zhàn)斗力的渣渣,寫寫畫畫了一天才搞了個大體...
近日,“2021世界半導(dǎo)體大會”在南京國際博覽中心舉辦,本屆大會由中國半導(dǎo)體行業(yè)協(xié)會、中國電子信息產(chǎn)業(yè)發(fā)展研究院,江蘇省工業(yè)和信息化廳以及南京江北新區(qū)管理委員會聯(lián)合主辦。由賽迪顧問股份有限公司、江蘇省半導(dǎo)體行業(yè)協(xié)會、南京江北新區(qū)產(chǎn)業(yè)技術(shù)研創(chuàng)園以及南京潤展國際展覽有限公司共同承辦。大會以“創(chuàng)新求變,同‘芯’共贏”為主題,聚焦行業(yè)發(fā)展新...

史海拾趣

問答坊 | AI 解惑

如果將電腦ATX電源改裝成可調(diào)的直流穩(wěn)壓電源?

手頭有一個ATX2.0的電腦電源,如果將其改裝成可調(diào)的直流穩(wěn)壓電源???   我想配1個11檔的波段開關(guān)來選擇輸出電壓,有無典型的電路圖,從哪里下手改呢?取樣電阻在哪里呢?…

查看全部問答∨

基于ZigBee網(wǎng)絡(luò)的無線智能照明系統(tǒng)設(shè)計

目前市場上有多種智能家居情景照明的解決方案,其中利用ZigBee技術(shù)組網(wǎng)配合MCU控制的方案因其成本低、功耗低和易于實現(xiàn)等優(yōu)點得到廣泛應(yīng)用。本文提出了一種利用ZigBee技術(shù)組建無線網(wǎng)絡(luò)配合ARM9內(nèi)核MCU,利用TCP/IP協(xié)議進行通信,可以對家居中每一盞 ...…

查看全部問答∨

陰極射線管的掃描原理

偶爾重看圖形化書想到的問題: 陰極射線管的刷新頻率大約為50赫茲,在逐行掃描過程中,它每秒掃描整個屏幕50次;假定一個時刻只有一個電子束,屏幕大小為1000*1000即1M個點,那么1M個點全部掃描完的時間為20毫秒,即每個點掃描時間為0.02微秒,陰 ...…

查看全部問答∨

EVC中2個線程序 頻繁new delete會不會造成內(nèi)存碎片

new 與 delete 有無內(nèi)存碎片的管理功能機制?望高手賜教!…

查看全部問答∨

用過SIL9135,9134芯片的進來幫幫

我現(xiàn)在要使用SIL9135這個芯片去做視頻處理,可是我現(xiàn)在對這個芯片主要能進行的操作還沒個大概的了解。哪位做過的,說說看你們用這個一般都是處理些啥,如何控制?…

查看全部問答∨

為什么wince的release版本能編譯通過,而debug版本就報錯!

請問各位高手,PB5.0 在編譯系統(tǒng)時,release版本能通過,而debug版本卻有報錯,是什么原因。另外,在編譯系統(tǒng)之前,需要配置那些參數(shù)才能使用wince 提供一些遠程工具,在網(wǎng)上找了很長時間也沒有找到,謝謝!…

查看全部問答∨

短信二次開發(fā),設(shè)置短信自動提示

短信二次開發(fā),設(shè)置短信自動提示,指令A(yù)T+CNMI指令不支持?老返回error,各位可有此經(jīng)歷?…

查看全部問答∨

fat32根目錄跨簇的問題

在windows fat32文件系統(tǒng)中,建立目錄項超過一個簇時,windows不能顯示新簇中的文件夾或文件(我自己的程序可以)。而且這個時候在windows上建立新文件的話,其回將原來分配的簇修改掉: 如:我建立文件并分配新簇后,fat表如下: F8 FF FF 0F&nb ...…

查看全部問答∨

基于ARm7 ucos ii系統(tǒng)下TCP/IP并發(fā)訪問

哪位仁兄做過ucos ii系統(tǒng)下的TCP/IP并發(fā)訪問的相關(guān)研究,我有幾個問題想要請教。…

查看全部問答∨

單片機開發(fā)設(shè)計廣泛的應(yīng)用領(lǐng)域

           單片機設(shè)計廣泛應(yīng)用于儀器儀表、家用電器、醫(yī)用設(shè)備、航空航天、專用設(shè)備的智能化管理及過程控制等領(lǐng)域,大致可分如下幾個范疇。下面就由卓躍教育為您做一個介紹。      ...…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 松桃| 云南省| 兴海县| 恩施市| 沙雅县| 赫章县| 诏安县| 若羌县| 威海市| 甘肃省| 沅江市| 西宁市| 启东市| 恩施市| 三河市| 隆子县| 镇赉县| 汶上县| 海丰县| 凤冈县| 太谷县| 周宁县| 竹山县| 县级市| 凌云县| 江孜县| 桐梓县| 桃江县| 咸丰县| 平潭县| 开封县| 婺源县| 右玉县| 桐乡市| 岱山县| 灵璧县| 建湖县| 农安县| 怀来县| 曲阳县| 绿春县|