STM32定時(shí)器產(chǎn)生PWM徹底應(yīng)用_第1頁(yè)
STM32定時(shí)器產(chǎn)生PWM徹底應(yīng)用_第2頁(yè)
STM32定時(shí)器產(chǎn)生PWM徹底應(yīng)用_第3頁(yè)
STM32定時(shí)器產(chǎn)生PWM徹底應(yīng)用_第4頁(yè)
STM32定時(shí)器產(chǎn)生PWM徹底應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、這次學(xué)習(xí)STM32花了很長(zhǎng)時(shí)間,一個(gè)禮拜多,也有頗多收獲,學(xué)習(xí)過程也 有頗多曲折。這次的任務(wù)是:用 STM32的一個(gè)定時(shí)器在四個(gè)通道上產(chǎn)生四路頻 率可調(diào)占空比可調(diào)的 PWM 波??吹竭@個(gè)題,我先看STM32的數(shù)據(jù)手冊(cè),把STM32的定時(shí)器手冊(cè)看完就花 了一天,但是看了一遍任然不知道所云,就看庫(kù)函數(shù),略有點(diǎn)理解,就想一哈 把這個(gè)程序調(diào)出來(lái),于是就花了一天多時(shí)間仿照網(wǎng)上別人的程序來(lái)寫,花了一 天多寫出來(lái)調(diào)試,結(jié)果行不通,做了無(wú)用功,于是靜下心來(lái)想想,還是一步一 步的來(lái)。我先用STM32的通用定時(shí)器用PWM模式產(chǎn)生四路相同占空比,不同頻率 的 PWM 波,配置如下:RCC_APB1PeriphClo

2、ckCmd(RCC_APB1Periph_TIM2,ENABl使能/ TIM2 時(shí)鐘 TIMn ternalClockCo nfig(TIM2); 使用內(nèi)部時(shí)鐘TIM_BaseInitStructure.TIM_Prescaler=3; /設(shè)置 TIM 時(shí)鐘頻率除數(shù)的預(yù)分頻值 TIM_Basel nitStructure.TIM_Cou nterMode二TIM_Cou nterMode_Up; 選擇計(jì)數(shù)器模 式TIM_BaseInitStructure.TIM_Period=1799;設(shè)置下一個(gè)更新事件裝入活動(dòng)的自 動(dòng)重裝載寄存器周期的值TIM_BaseI nitStructure.TIM_

3、ClockDivisio n=0;/設(shè) 置時(shí)鐘分割TIM_TimeBaseInit(TIM2,&TIM_BaseInitStructure);/ 通道 1TIM_OCI ni tStructure.TIM_OCMode二TIM_OCMode_PWM1;/選擇定時(shí)器模式 TIM_OCI ni tStructure.TIM_OutputState二TIM_OutputState_E nable;/選擇輸出比較狀 態(tài) TIM_OCInitStructure.TIM_OutputNState二TIM_OutputNState_Disable;/選擇互補(bǔ) 輸出比較狀態(tài)TIM_OC In itStruct

4、ure.TIM_Pulse二CCR1_Val;設(shè)置了待裝入捕獲比較器的脈沖 值 TIM_OCInitStructure.TIM_OCPolarity二TIM_OCPolarity_High;設(shè)置輸出極性 TIM_OC In itStructure.TIM_OCNPolarity二TIM_OCNPolarity_Low;設(shè) 置互補(bǔ)輸出極性TIM_OCI ni tStructure.TIM_OCIdleState二TIM_OCIdleState_Set 選 擇空閑狀態(tài)下得非 工作狀態(tài)TIM_OCI nitStructure.TIM_OCNIdleState二TIM_OCNIdleState_Res

5、et選擇互補(bǔ) 空閑狀態(tài)下得非工作狀態(tài)TIM_OC1Init(TIM2,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);/ 通道 2TIM_OCI ni tStructure.TIM_Pulse二CCR2_Val;設(shè)置了待裝入捕獲比較器的脈沖 值 TIM_OC2Init(TIM2,&TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);/ 通道 3TIM_OCI ni tStructure.TIM_Pulse二CCR3_

6、Val;設(shè)置了待裝入捕獲比較器的脈沖 值 TIM_OC3Init(TIM2,&TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);/ 通道 4TIM_OCI ni tStructure.TIM_Pulse二CCR4_Val;設(shè)置了待裝入捕獲比較器的脈沖 值 TIM_OC4Init(TIM2,&TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);TIM_Cmd(TIM2, ENABLE);TIM_CtrlPWMOutputs(

7、TIM2,ENABLE);用 pwm 模式輸出的頻率和占空比是固定的,不可調(diào),要想輸出頻率可調(diào), 占空比可調(diào),必須得使用比較輸出模式。這點(diǎn)資料是在STM32全國(guó)巡回研討會(huì)上看到的,如圖:所以,接下來(lái)我就寫了一個(gè)程序通過輸出比較模式產(chǎn)生一路 PWM 波,這個(gè)波的頻率和占空比都由自己確定,函數(shù)配置如下:TIM_BaseInitStructure.TIM_Prescaler=3; /設(shè)置 TIM 時(shí)鐘頻率除數(shù)的預(yù)分頻值 (18M)TIM_Basel nitStructure.TIM_Cou nterMode二TIM_Cou nterMode_Up; 選擇計(jì)數(shù) 器模式TIM_BaseInitStruc

8、ture.TIM_Period=1800;/設(shè)置下一個(gè)更新事件裝入活動(dòng) 的自動(dòng)重裝載寄存器周期的值TIM_BaseI nitStructure.TIM_ClockDivisio n=0;/設(shè) 置時(shí)鐘分割TIM_TimeBaseInit(TIM2,&TIM_BaseInitStructure);/ 通道 1TIM_OCI ni tStructure.TIM_OCMode二TIM_OCMode_Toggle;選 擇定時(shí)器模式 TIM_OCI ni tStructure.TIM_OutputState二TIM_OutputState_E nable;/選擇輸出比較狀 態(tài) TIM_OCInitStru

9、cture.TIM_OutputNState二TIM_OutputNState_Disable;/選擇互補(bǔ) 輸出比較狀態(tài)TIM_OC In itStructure.TIM_Pulse二CCR1_Val1;設(shè)置了待裝入捕獲比較器的脈 沖值 TIM_OCInitStructure.TIM_OCPolarity二TIM_OCPolarity_High;設(shè)置輸出極性 TIM_OC In itStructure.TIM_OCNPolarity二TIM_OCNPolarity_Low;設(shè) 置互補(bǔ)輸出極性 TIM_OCI ni tStructure.TIM_OCIdleState二TIM_OCIdleSta

10、te_Set 選 擇空閑狀態(tài)下得非 工作狀態(tài)TIM_OCI nitStructure.TIM_OCNIdleState二TIM_OCNIdleState_Reset選擇互補(bǔ) 空閑狀態(tài)下得非工作狀態(tài)TIM_OC1Init(TIM2,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);TIM_ARRPreloadConfig(TIM2,ENABLE);TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);TIM_Cmd(TIM2,ENABLE);void TIM2_IRQHandler(

11、void)TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);if(n=1)n=0;TIM_SetCompare1(TIM2,CCR1_Val2);elsen=1;TIM_SetCompare1(TIM2,CCR1_Val1);通過改變比較寄存器(CCR1中的值,改變PWM的占空比,在每次匹配 中斷中改變CCR1的值。上面程序?qū)崿F(xiàn)的是產(chǎn)生一路頻率為 10K占空比為40%的 PWM 波。有了上面的思想我就想產(chǎn)生四路不同頻率不同占空比的PWM波,經(jīng)過反復(fù)思考光配函數(shù)似乎不能實(shí)現(xiàn),在網(wǎng)上去查了的,很多網(wǎng)友也說不能實(shí)現(xiàn),有一 個(gè)網(wǎng)友給了一個(gè)提示:軟件模擬。剛開始沒明白什么意思

12、,于是還是自己繼續(xù) 配置庫(kù)函數(shù),在這個(gè)過程中一直有兩個(gè)疑問:每次中斷中,CCR寄存器的值都在循環(huán)的增加,CCR的寄存器不可能是無(wú)限大吧?就算是無(wú)限大,計(jì)數(shù)器也不 是無(wú)限大呀,他只能記到 65535。初步確定使用匹配中斷不行,我有想過同時(shí)使 用溢出中斷和匹配中斷,但這樣四路 PWM波只能是固定的,頻率和占空比不能 調(diào)。大概說一下怎樣用溢出中斷和匹配中斷實(shí)現(xiàn)四路固定的 PWM 波,把計(jì)數(shù)器 寄存器(CNT的值裝最大周期的那個(gè)PWM波,當(dāng)一次計(jì)數(shù)完成算一下三路小 點(diǎn)周期數(shù),在匹配中斷中對(duì)應(yīng)的設(shè)個(gè)變量,CCF就改變幾次,溢出中斷來(lái)了就再次給計(jì)數(shù)器裝初值,同時(shí)四個(gè)比較寄存器從裝初值,這樣很麻煩,理論上可

13、 以實(shí)現(xiàn),但我考慮到最終不能實(shí)現(xiàn)我的要求,就沒有去驗(yàn)證。所以產(chǎn)生四路頻 率可調(diào)占空比可調(diào),用一個(gè)定時(shí)器似乎不能實(shí)現(xiàn),就一直卡到這里,我又在想 飛哥說能實(shí)現(xiàn),就肯定能實(shí)現(xiàn),我又在網(wǎng)上找資料,還是沒找到,只是有人題 四路,軟模擬,于是我就思考用軟模擬實(shí)現(xiàn),最后在一個(gè)師兄的指點(diǎn)下,確實(shí) 用軟件模擬一個(gè)中間比較寄存器能實(shí)現(xiàn),思路大概是這樣子的,首先讓比較寄 存器裝滿,也就是最大值( 65535),然后通過改變模擬比較寄存器的值,每次 匹配中斷只需把模擬比較寄存器的值去比較就行,具體方案看程序。unsignedcharCnt4;/ 一個(gè)數(shù)組,這個(gè)數(shù)組的每個(gè)元素對(duì)應(yīng)一個(gè)通道,用來(lái) 判斷裝 PWM 得高電平

14、還是低電平數(shù)unsigned intT4;/ 周期數(shù)組unsigned intR4;/ 模擬的比較寄存器數(shù)組,一樣的每個(gè)通道對(duì)應(yīng)一個(gè)數(shù)組元素 unsigned intRh4;/ 模擬的 PWM 高電平比較寄存器unsigned intRl4; / 模擬的 PWM 低電平比較寄存器unsigned char F4;/ 占空比數(shù)組unsigned int CCR1,CCR2,CCR3,CCR4;void Init(void)unsigned char i = 0;for(i = 0; i 4; i+)Cnti= 0;Ti= 0;Ri= 0;Rhi = 0;Rli = 0;Fi= 0;/t 的范圍為

15、( 065536)T0 = 450;/F=40KT1 = 600;/F=30KT2 = 900;/F=20KT3 = 1800;/F=10KF(占空比)的范圍為(0100)F0 = 40;F1 = 30;F2 = 20;F3 = 10;for(i = 0; i 65535)R0=R0-65535;CCR1=R0; TIM_SetCompare1(TIM3,CCR1);if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET)TIM_ClearITPendingBit(TIM3,TIM_IT_CC2); Cnt1=(Cnt1)&0x01;if(Cnt1=0x01)R1

16、+=Rl1;elseR1 += Rh1;if(R165535)R1=R1-65535;CCR2=R1;TIM_SetCompare2(TIM3,CCR2);if(TIM_GetITStatus(TIM3,TIM_IT_CC3)!=RESET)TIM_ClearITPendingBit(TIM3,TIM_IT_CC3);Cnt2=(Cnt2)&0x01; if(Cnt2=0x01)R2+=Rl2;elseR2 += Rh2;if(R265535)R2=R2-65535;CCR3=R2; TIM_SetCompare3(TIM3,CCR3);if(TIM_GetITStatus(TIM3,TIM_IT_CC4)!=RESET)TIM_ClearITPendingBit(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論