精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

STM32單片機--PWM輸出

電子工程師 ? 2018-04-03 08:54 ? 次閱讀

采用定時器2的通道2,使PA1輸出頻率1K,占空比40的PWM波形,用PA8隨意延時取反led燈,指示程序運行

上午花了半天時間熟悉了stm32的PWM模塊。中午利用午飯時間把PWM功能調(diào)試成功。當(dāng)然,很簡單的東西,也許很多前輩估計都不屑一顧的東西。

今天最大的感嘆就是網(wǎng)絡(luò)資源實在是個巨大的寶庫,真的很慶幸,在這個復(fù)雜的社會環(huán)境里,在一個到處充斥著私心、私利的時代,各個網(wǎng)站,各個論壇上的眾多網(wǎng)友都時刻保持著開源的氛圍。學(xué)習(xí)一定要和他人交流,而網(wǎng)絡(luò)提供了這么一個極好的平臺。

廢話少說,言歸正傳。

實現(xiàn)功能:采用定時器2的通道2,使PA1輸出頻率1K,占空比40的PWM波形,用PA8隨意延時取反led燈,指示程序運行。

首先熟悉一下定時器的PWM相關(guān)部分??磮D最明白

其實PWM就是定時器的一個比較功能而已。

CNT里的值不斷++,一旦加到與CCRX寄存器值相等,那么就產(chǎn)生相應(yīng)的動作。這點和AVR單片機很類似。既然這樣,我們要產(chǎn)生需要的PWM信號,就需要設(shè)定PWM的頻率和PWM的占空比。

首先說頻率的確定。由于通用定時器的時鐘來源是PCLK1,而我又喜歡用固件庫的默認設(shè)置,那么定時器的時鐘頻率就這樣來確定了,如下:

AHB(72MHz)→APB1分頻器(默認2)→APB1時鐘信號(36MHz)→倍頻器(*2倍)→通用定時器時鐘信號(72MHz)。

這里為什么是這樣,在RCC模塊學(xué)習(xí)記錄里有詳細記載,不多說。

因此圖中的CK_PSC就是72MHz了。

下面的資料也是網(wǎng)上一搜一大把,我就羅列了:

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

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

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

由此看來,模式1和模式2正好互補,互為相反,所以在運用起來差別也并不太大。我用的是模式一,因此后面的設(shè)定都是按照模式一來設(shè)定的。

PWM的周期是就是由定時器的自動重裝值和CNT計數(shù)頻率決定的。而CNT的計數(shù)時鐘是CK_PSC經(jīng)分頻器PSC得到,因此CNT的時鐘就是CK_PSC/分頻系數(shù)。這個分頻系數(shù)在TIM_TimeBaseStructure.TIM_Prescaler確定。成都網(wǎng)站設(shè)計我設(shè)置的值是72,因此CNT的計數(shù)頻率也就是CK_CNT的頻率為1MHz。

下一步就是確定定時器自動重裝值。因為CNT每自加到ARR寄存器的值時就會自動清零,當(dāng)然前提是設(shè)定為為向上計數(shù)模式,而就是根據(jù)這個溢出事件來改變PWM的周期。所以PWM信號的頻率由ARR的值來確定。我設(shè)置的值是1000-1,即TIM_TimeBaseStructure.TIM_Period = 1000-1;因此PWM的周期是1MHz/1000=1KHz。

接下來就要確定PWM的占空比了。因為CNT在自加到ARR值的過程中會不斷和CRRX的值相比較,一旦二者相等就產(chǎn)生匹配事件,但要注意CNT不會理會這件事,它會繼續(xù)++直到等于ARR。而CRRX的值我設(shè)定為400-1,那么占空比就隨之確定為40%。

好了,下面就是庫函數(shù)的配置了。

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

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

2.設(shè)置GPIO;

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

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

首先是main函數(shù)和全局變量申明,很簡單,不作說明


GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TimOCInitStructure;

int main(void)
{

rcc_cfg();
gpio_cfg();
tim2_cfg();
pwm_cfg();
//
while (1)
{

GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);

delay();


GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);

delay();
}
}

下面是IO口的配置:

void gpio_cfg()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

此處要注意的是PWM輸出口要配置為復(fù)用推挽輸出,原因我也不知道,反正照搬就是了。

下面是TIM配置函數(shù),注釋很清楚了,不作說明:

void tim2_cfg()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
//預(yù)分頻系數(shù)為72,這樣計數(shù)器時鐘為72MHz/72 = 1MHz
TIM_TimeBaseStructure.TIM_Prescaler = 72;
//設(shè)置時鐘分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//設(shè)置計數(shù)器模式為向上計數(shù)模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//設(shè)置計數(shù)溢出大小,每計1000個數(shù)就產(chǎn)生一個更新事件
TIM_TimeBaseStructure.TIM_Period = 1000-1;
//將配置應(yīng)用到TIM2中
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

//禁止ARR預(yù)裝載緩沖器
TIM_ARRPreloadConfig(TIM2, DISABLE);

TIM_Cmd(TIM2, ENABLE);//使能TIMx外設(shè)
}

接下來是關(guān)鍵的PWM的配置函數(shù):

void pwm_cfg()

{

//設(shè)置缺省值

TIM_OCStructInit(&TimOCInitStructure);

//PWM模式1輸出

TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

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

TimOCInitStructure.TIM_Pulse = 400-1;

//TIM輸出比較極性高

TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

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

TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//TIM2的CH2輸出

TIM_OC2Init(TIM2, &TimOCInitStructure);

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

TIM_CtrlPWMOutputs(TIM2,ENABLE);

}

stm32固件庫的輸出比較單元結(jié)構(gòu)體與定時器的時基單元是分開定義的,而PWM模式只是輸出比較結(jié)構(gòu)體成員TimOCInitStructure.TIM_OCMode的一個取值,當(dāng)把此結(jié)構(gòu)體填充完后,還要映射到某個定時器,用TIM_OCXInit函數(shù)實現(xiàn),我用了一個X,說明不止一個這樣的函數(shù),事實上,stm32的通用定時器都有四個通道,每個通道對應(yīng)一個初始化函數(shù),這里真夠糾結(jié)的!最后還要使能該定時器的PWM輸出功能,TIM_CtrlPWMOutputs(TIM2,ENABLE)函數(shù)要注意,是outputs而不是output,說明TIM2不止一個通道嘛!夠復(fù)雜,夠繁瑣的!

下面是輸出比較單元的結(jié)構(gòu)體原型:

typedef struct
{
uint16_t TIM_OCMode;

uint16_t TIM_OutputState;

uint16_t TIM_OutputNState;

uint16_t TIM_Pulse;

uint16_t TIM_OCPolarity;

uint16_t TIM_OCNPolarity;

uint16_t TIM_OCIdleState;

uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;

其中沒有加色的成員是高級定時器才有的,通用定時器就不用管了。

這里還有個TimOCInitStructure.TIM_OCPolarity成員需要注意,它有什么作用呢?在網(wǎng)上查的資料,如下圖:

前面說到pwm有pwm1和pwm2兩種模式,這兩種模式只能控制到OCXREF為止,TIM_OCPolarity 能控制OC1是直接等于OCXREF,還是取反極性!OC1才是最終的PWM信號。

這里有個小插曲,我用示波器去測量PWM信號,發(fā)現(xiàn)信號居然是雙極性的,然后改變TIM_OCPolarity ,再測,還是雙極性,只是倒了個跟頭。還真以為stm32單片機能輸出兩極性的PWM,后面把示波器改為直流檔(之前用的是交流檔),波形才從零電位一下縱向移上去。以后要注意!

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

    關(guān)注

    2266

    文章

    10871

    瀏覽量

    354800
收藏 人收藏

    評論

    相關(guān)推薦

    STM32單片機學(xué)習(xí)筆記(6):PWM波形產(chǎn)生

    利用CubMX生成基于32單片機的HAl庫工程,然后編寫程序在proteus上仿真驗證。本項目最適合沒有開發(fā)板的同學(xué)學(xué)習(xí),零成本利用仿真軟件率先入門STM32單片機。這是第六部分針對STM32
    發(fā)表于 07-19 15:34 ?2152次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>學(xué)習(xí)筆記(6):<b class='flag-5'>PWM</b>波形產(chǎn)生

    單片機PWM控制輸出電路

    電子發(fā)燒友為您提供了單片機PWM控制輸出電路,輸出電路的電流在4~20MA之間。希望對您的工作學(xué)習(xí)有所幫助!
    發(fā)表于 07-09 16:47 ?1.7w次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>PWM</b>控制<b class='flag-5'>輸出</b>電路

    AVR單片機定時器輸出PWM的設(shè)計及注意問題

    本內(nèi)容提供了AVR單片機定時器輸出PWM的設(shè)計及注意問題,根據(jù)PWM的特點,在使用ATmega128的定時/計數(shù)器設(shè)計輸出
    發(fā)表于 11-09 17:39 ?1629次閱讀

    如何利用51單片機輸出PWM

    如何利用51單片機輸出PWM波,控制電機轉(zhuǎn)動速度
    發(fā)表于 12-31 14:26 ?230次下載

    基于STM32單片機進行PWM輸出實驗的詳細資料說明

    本文檔的主要內(nèi)容詳細介紹的是基于STM32單片機進行PWM輸出實驗的詳細資料說明包括了:1.通用定時器PWM概述,2.常用寄存器和庫函數(shù)配置
    發(fā)表于 03-18 08:00 ?18次下載
    基于<b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>進行<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>實驗的詳細資料說明

    使用51單片機輸出PWM波形的程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機輸出PWM波形的程序免費下載。
    發(fā)表于 08-29 17:29 ?66次下載
    使用51<b class='flag-5'>單片機</b><b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>波形的程序免費下載

    使用單片機PWM實現(xiàn)電壓輸出的程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用單片機PWM實現(xiàn)電壓輸出的程序免費下載。
    發(fā)表于 08-19 17:31 ?18次下載
    使用<b class='flag-5'>單片機</b><b class='flag-5'>PWM</b>實現(xiàn)電壓<b class='flag-5'>輸出</b>的程序免費下載

    使用STM32F1單片機實現(xiàn)PWM輸出的源代碼和工程文件免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用STM32F1單片機實現(xiàn)PWM輸出的源代碼和工程文件免費下載。
    發(fā)表于 11-21 17:20 ?32次下載
    使用<b class='flag-5'>STM32</b>F1<b class='flag-5'>單片機</b>實現(xiàn)<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>的源代碼和工程文件免費下載

    實現(xiàn)STC單片機PWM輸出的程序免費下載

      本文檔的主要內(nèi)容詳細介紹的是實現(xiàn)STC單片機PWM輸出的程序免費下載。
    發(fā)表于 06-28 18:00 ?83次下載
    實現(xiàn)STC<b class='flag-5'>單片機</b><b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>的程序免費下載

    基于STM32單片機的小車PWM調(diào)速系統(tǒng)

    基于STM32單片機的小車PWM調(diào)速系統(tǒng)
    發(fā)表于 06-03 09:22 ?40次下載

    STM32單片機PWM輸出學(xué)習(xí)

    STM32單片機PWM輸出學(xué)習(xí)PWM原理:PWM表示脈沖寬度調(diào)制,它是一系列脈沖,這些脈沖將以方
    發(fā)表于 11-11 11:51 ?26次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b><b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>學(xué)習(xí)

    STM32單片機PWM輸出(F103VET6)

    最近在使用單片機進行直流電機的控制,驅(qū)動器使用的L298N,在使用的時候控制一臺直流電機,驅(qū)動器上用三個輸入端子來控制,IN1,IN2是控制方向,使能端子就可以使用PWM來進行速度控制。 在
    發(fā)表于 11-23 18:21 ?0次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>單片機</b>的<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>(F103VET6)

    stm32F051系列 單片機引腳定時器輸出pwm波形控制風(fēng)扇轉(zhuǎn)速

    輸出功能的io。此文章來詳述使用stm32F051R8T6型號單片機,帶有定時器輸出功能的引腳來輸出pw
    發(fā)表于 11-29 14:06 ?15次下載
    <b class='flag-5'>stm32</b>F051系列 <b class='flag-5'>單片機</b>引腳定時器<b class='flag-5'>輸出</b><b class='flag-5'>pwm</b>波形控制風(fēng)扇轉(zhuǎn)速

    基于STM32單片機PWM輸出使用庫文件設(shè)計源代碼

    基于STM32單片機PWM輸出使用庫文件設(shè)計源代碼
    發(fā)表于 04-26 14:56 ?6次下載

    STM32單片機的GPIO輸入、輸出模式與配置方法

    STM32 單片機是一款高性能、低功耗的 32 位微控制器,具有強大的計算能力、靈活的外設(shè)模塊和實現(xiàn)微控制器應(yīng)用所需的社區(qū)支持。在單片機應(yīng)用中,GPIO 輸入輸出模式是必不可少的硬件接
    發(fā)表于 08-15 18:23 ?8062次閱讀