国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年02月15日(星期六)

2020年02月15日 | STM32單片機(jī)--PWM輸出

發(fā)布者:快樂陽(yáng)光 來源: eefocus關(guān)鍵字:STM32  單片機(jī)  PWM輸出 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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


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


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


廢話少說,言歸正傳。

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


首先熟悉一下定時(shí)器的PWM相關(guān)部分。看圖最明白

其實(shí)PWM就是定時(shí)器的一個(gè)比較功能而已。

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


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

AHB(72MHz)→APB1分頻器(默認(rèn)2)→APB1時(shí)鐘信號(hào)(36MHz)→倍頻器(*2倍)→通用定時(shí)器時(shí)鐘信號(hào)(72MHz)。

這里為什么是這樣,在RCC模塊學(xué)習(xí)記錄里有詳細(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-在向上計(jì)數(shù)時(shí),一旦TIMx_CNT=TIMx_CCR1時(shí)通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)。

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


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


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


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


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


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


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

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

2.設(shè)置GPIO;

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

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


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


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,這樣計(jì)數(shù)器時(shí)鐘為72MHz/72 = 1MHz
  TIM_TimeBaseStructure.TIM_Prescaler = 72;
  //設(shè)置時(shí)鐘分割
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  //設(shè)置計(jì)數(shù)器模式為向上計(jì)數(shù)模式
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  //設(shè)置計(jì)數(shù)溢出大小,每計(jì)1000個(gè)數(shù)就產(chǎn)生一個(gè)更新事件
  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固件庫(kù)的輸出比較單元結(jié)構(gòu)體與定時(shí)器的時(shí)基單元是分開定義的,而PWM模式只是輸出比較結(jié)構(gòu)體成員TimOCInitStructure.TIM_OCMode的一個(gè)取值,當(dāng)把此結(jié)構(gòu)體填充完后,還要映射到某個(gè)定時(shí)器,用TIM_OCXInit函數(shù)實(shí)現(xiàn),我用了一個(gè)X,說明不止一個(gè)這樣的函數(shù),事實(shí)上,stm32的通用定時(shí)器都有四個(gè)通道,每個(gè)通道對(duì)應(yīng)一個(gè)初始化函數(shù),這里真夠糾結(jié)的!最后還要使能該定時(shí)器的PWM輸出功能,TIM_CtrlPWMOutputs(TIM2,ENABLE)函數(shù)要注意,是outputs而不是output,說明TIM2不止一個(gè)通道嘛!夠復(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;


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


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

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


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

關(guān)鍵字:STM32  單片機(jī)  PWM輸出 引用地址:STM32單片機(jī)--PWM輸出

上一篇:基于STM32的數(shù)字PDA系統(tǒng)軟件系統(tǒng)設(shè)計(jì)
下一篇:單片機(jī)STM32時(shí)鐘圖文理解

推薦閱讀

機(jī)器人控制系統(tǒng)是機(jī)器人的大腦,是決定機(jī)器人功能和性能的主要因素。工業(yè)機(jī)器人控制技術(shù)的主要任務(wù)就是控制工業(yè)機(jī)器人在工作空間中的運(yùn)動(dòng)位置、姿態(tài)、軌跡、操作順序及動(dòng)作的時(shí)間等,具有編程簡(jiǎn)單、軟件菜單操作、友好的人機(jī)交互界面、在線操作提示和使用方便等特點(diǎn)。目前機(jī)器人的應(yīng)用工程由單臺(tái)機(jī)器人工作站向機(jī)器人生產(chǎn)線發(fā)展,機(jī)器人控制器的聯(lián)網(wǎng)技術(shù)使...
AlphaGo戰(zhàn)勝人類頂尖圍棋選手,讓人工智能(AI)一下走進(jìn)大眾視野,刷滿了存在感,而就在喧囂與熱鬧之后,AI市場(chǎng)逐漸變得冷靜,AI技術(shù)從實(shí)驗(yàn)室走向各類應(yīng)用場(chǎng)景,變得看得見摸得著。就拿剛過去的春節(jié)來說,其實(shí)就是一個(gè)縮影,AI早已滲透到生活的方方面面,改變著人們最關(guān)心的四個(gè)字:衣食住行。“太好了,我終于搶到了過年回家的票”在外打拼的務(wù)工人員春...
四川省2020年“兩會(huì)”推遲了。受新冠肺炎的影響,原定于2月3日開幕的會(huì)議還不知道何時(shí)重啟。不過,隔壁重慶1月11日召開“兩會(huì)”時(shí),已經(jīng)幫四川喊出了今年的一大工作重點(diǎn):深化川渝合作,推動(dòng)成渝地區(qū)雙城經(jīng)濟(jì)圈建設(shè)。 2020年1月3日,在中央財(cái)經(jīng)委員會(huì)第六次會(huì)議上,“推動(dòng)成渝地區(qū)雙城經(jīng)濟(jì)圈建設(shè)”的提法首次出現(xiàn),然后很快成為川渝兩省市一月份各級(jí)各...
日本當(dāng)?shù)貢r(shí)間2月13日11時(shí)8分,日本發(fā)生規(guī)模7.3強(qiáng)震,震中位在福島縣外海,震源深度55公里,根據(jù)研判,此次日本7.3級(jí)地震是2011年3月11日發(fā)生的日本9級(jí)大地震的余震。 據(jù)介紹,觀測(cè)到震度6強(qiáng)的地區(qū)包括宮城縣藏王町、福島縣相馬市、國(guó)見町、新地町。觀測(cè)到震度6弱的地區(qū)包括宮城縣石卷市、巖沼市、登米市、福島縣的福島市、郡山市、須賀市、南相馬市等。地...

史海拾趣

問答坊 | AI 解惑

誰能幫幫我啊,不生感激

誰有Tektronix  tds2024的中文說明書和安立8801的說明書啊,發(fā)我一份好嗎liuhanzhang@smoben.com…

查看全部問答∨

如何打造行業(yè)領(lǐng)軍企業(yè)

效益是企業(yè)賴以生存的前提,創(chuàng)新是企業(yè)發(fā)展的動(dòng)力,創(chuàng)新活動(dòng),是市場(chǎng)拉動(dòng)和技術(shù)推動(dòng)兩者的匯聚點(diǎn)。在過去的計(jì)劃經(jīng)濟(jì)時(shí)代,重慶川儀和當(dāng)時(shí)很多國(guó)營(yíng)企業(yè)一樣,技術(shù)開發(fā)嚴(yán)重脫離市場(chǎng)、脫離生產(chǎn),看似研發(fā)成果不斷,但真正形成產(chǎn)品并賺回真金白銀的卻不 ...…

查看全部問答∨

初始化網(wǎng)卡問題

EBOOT中的 CS8900: MAC Address: 11:11:11:11:11:11 ERROR: Probe: EISA Number Error. ERROR: InitEthDevice: Failed to initialize Ethernet controller. ERROR: OEMPlatformInit: Failed to initialize Ethernet controller. 這個(gè)錯(cuò)誤一般 ...…

查看全部問答∨

關(guān)于6410訪問SPI總線的問題,請(qǐng)高手指教

小弟把三星的SPI總線驅(qū)動(dòng)編譯進(jìn)了內(nèi)核,(開發(fā)板提供了源碼但是沒有加入內(nèi)核)。然后用WriteFile函數(shù)發(fā)送測(cè)試數(shù)據(jù),可以看到SPI口輸出正常,但是用ReadFile讀取SPI口時(shí),一直讀回0. SPI的讀取時(shí)序如下圖,我先用 WriteFile(hSPI, &cBuffer_out, 1, ...…

查看全部問答∨

LM3S8962學(xué)習(xí)(二) -- 按鍵與中斷

讀按鍵的值,可以通過函數(shù)GPIOPinRead來完成   如何實(shí)現(xiàn)中斷呢?主要有以下幾個(gè)步驟需要做   1. 先定義一個(gè)LED和一個(gè)KEY #define LED GPIO_PIN_0#define KEY GPIO_PIN_0   2. 在startup_rvmdk.S 文件中增加PORT_E的中斷服務(wù) ...…

查看全部問答∨

st32怎樣測(cè)正負(fù)信號(hào)?

我需要測(cè)小于零的信號(hào),我看過手冊(cè),是不是在參考電壓端口用一個(gè)正負(fù)的參考電源?可STM32內(nèi)部只有一個(gè)1.2v的正電源,可怎樣找到一個(gè)負(fù)電源?。縿e的單片機(jī)一般這樣解決辦法是采用的雙端輸入,STM32有沒有類視的設(shè)置???請(qǐng)大家給一個(gè)解決方案…

查看全部問答∨

【求助】請(qǐng)幫忙選個(gè)MOS管做開關(guān)管

要求條件是:通過電壓為5V電流最大值是2A,有著方面得經(jīng)驗(yàn)得DX幫忙?。。。。? 先謝謝了?。。。?! 把你們經(jīng)常用的型號(hào)告訴我好嗎???…

查看全部問答∨

我的車庫(kù)門搖控器上的LSD2262 芯片壞了...

請(qǐng)問貴網(wǎng)站的LSD2262 芯片能替換上去嗎..!!!直接取下焊上就能用嗎!!!先謝謝!!!我是菜鳥…

查看全部問答∨

人人都愛易電源——轉(zhuǎn)發(fā)有禮!

人人都愛易電源——轉(zhuǎn)發(fā)有禮! 活動(dòng)主題:人人都愛易電源——轉(zhuǎn)發(fā)有禮!活動(dòng)時(shí)間:10月11日—28日 活動(dòng)鏈接:https://bbs.eeworld.com.cn/thread-352431-1-1.html…

查看全部問答∨

學(xué)習(xí)很累!

哎,研究生生活馬上過去一半了,回望著一年確實(shí)學(xué)到了不少東西,感覺自己能力提高了些許,但是還是很多細(xì)節(jié)的方面需要加強(qiáng),繼續(xù)努力,加油!…

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

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved