




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、STM32的PWM發(fā)送脈沖,周期和脈寬都可調(diào)了,但是現(xiàn)在不知道如何精確的控制所發(fā)的脈沖個數(shù)。具體要求就是在一段時間內(nèi)大概50ms內(nèi)發(fā)送5000-1W個脈沖 個數(shù)要很精確,誤差2個以內(nèi)可以接受該怎么控制呢?1.接上一個外部中斷口,在中斷中計數(shù)2.用一個定時器 對發(fā)脈沖的時間進行控制各位大俠還有什么好的辦法嗎?求解??!PWM溢出中斷計數(shù),是個不錯的解決辦法。如果一個上升沿算一個脈沖的話,控制周期(頻率)不就行了開啟PWM輸出的溢出中斷,進入一次中斷,就是一個波原子哥 是這里嗎? 設(shè)置這個寄存器或者只是簡單的定時器溢出中斷 oid TIM3_IRQHandler(v
2、oid) if(TIM3->SR&0X0001)/溢出中斷 . /計數(shù) TIM3->SR&=(1<<0);/清除中斷標志位 看我們開發(fā)板:定時器中斷例程。你好 原子哥 中斷計數(shù)的話 那怎么停止呢 還有停止了
3、還想讓他循環(huán)發(fā)送呢 有沒有實現(xiàn)好的源程序呢 我是STM32F103控制輸出方波的脈沖數(shù)和周期好多人遇到這個問題,額!現(xiàn)在我用了兩種方法實現(xiàn),感覺都不好! 方案1:定時器翻轉(zhuǎn)IO,到達指定個數(shù)關(guān)閉TIM方案2:PWM,開啟比較捕獲中斷,到達指定個數(shù)關(guān)閉TIM感覺都是頻繁進中斷,占用大量CPU資源。不能做其他事了 void TIM4_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure;
4、0; /* TIM4 clock enable */ /PCLK1經(jīng)過2倍頻后作為TIM4的時鐘源等于72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); NVIC_Configuration(1); /* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, E
5、NABLE); /*GPIOB Configuration: TIM4 channel 1 and 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; / 復(fù)用
6、推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); void Tim2_Slave_Init(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
7、; TIM_DeInit(TIM2); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_Configuration(8); TIM_TimeBaseStructure.TIM_Period= XBUF1 - 1; TIM_TimeBaseStructure.TIM_Presc
8、aler= 0; /時鐘預(yù)分頻數(shù) TIM_TimeBaseStructure.TIM_ClockDivision=0; /采樣分頻 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上溢出 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure
9、); TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);/選擇TIM2的輸入觸發(fā)源 內(nèi)部觸發(fā)3 TIM4 TIM_InternalClockConfig(TIM2); TIM2->SMCR |= 0x0007;/設(shè)定從模式控制寄存器,外部時鐘模式1 上升沿驅(qū)動計數(shù) /T
10、IM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_ClearFlag(TIM2,TIM_FLAG_Update); /清除溢出中斷標志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2,ENABLE);/是否開啟時鐘(
11、開啟后每發(fā)送一個脈沖,定時器加一) void Tim3_Slave_Init(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); NVIC_Configuration(9);
12、 TIM_TimeBaseStructure.TIM_Period= XBUF3 - 1; TIM_TimeBaseStructure.TIM_Prescaler= 0; /時鐘預(yù)分頻數(shù) TIM_TimeBaseStructure.TIM_ClockDivision=0; /采樣分頻 TIM_
13、TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上溢出 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);/選擇TIM2的輸入觸發(fā)源 內(nèi)部觸發(fā)3 TIM4 TIM_InternalClockConfig(TIM3); &
14、#160; TIM3->SMCR |= 0x0007;/設(shè)定從模式控制寄存器,外部時鐘模式1 上升沿驅(qū)動計數(shù) /TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_ClearFlag(TIM3,TIM_FLAG_Update);
15、60; /清除溢出中斷標志 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3,ENABLE);/是否開啟時鐘(開啟后每發(fā)送一個脈沖,定時器加一) /* * 函數(shù)名:TIM4_Mode_Config * 描述 :配置TIM4輸出的PWM信號的模式,如周期、極性、占空比 * 輸入 :無 * 輸出 :無 * 調(diào)用
16、; :內(nèi)部調(diào)用 */void TIM4_PWM_Init(u16 T) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u16 CCR1_Val = (T+1)/2; u16 CCR2_Val = (T+1)/2;
17、0; u16 CCR3_Val = (T+1)/2; u16 CCR4_Val = (T+1)/2; /* - TIM1 Configuration: generate 4 PWM signals with 4 different duty cycles: TIM1CLK = 36 MHz, Prescaler = 0x0, TIM1 counter clock = 36 MHz
18、TIM1 ARR Register = 999 => TIM1 Frequency = TIM1 counter clock/(ARR + 1) TIM1 Frequency = 36 KHz. TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 50% TIM1 Channel2 duty cycle = (TIM1_CCR2/ TIM1_ARR)* 100 = 50%
19、; TIM1 Channel3 duty cycle = (TIM1_CCR3/ TIM1_ARR)* 100 = 50% TIM1 Channel4 duty cycle = (TIM1_CCR4/ TIM1_ARR)* 100 = 50% - */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = T-1;/T us TIM_TimeBaseSt
20、ructure.TIM_Prescaler = 72-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM4->CR1 &= (u16)0x03FD);/ UDIS enable
21、;/* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
22、0; TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = C
23、CR2_Val; TIM_OC2Init(TIM4, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);/* TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM4,
24、 &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM4, &TIM_OCInitStructure); TIM_OC4Prelo
25、adConfig(TIM4, TIM_OCPreload_Enable);*/ TIM_ARRPreloadConfig(TIM4, ENABLE); TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref); /* TIM1 enable counter */ TIM_Cmd(TIM4, ENABLE); /* Main Output Enable */ TIM_Ctr
26、lPWMOutputs(TIM4, ENABLE); void TIM4_PWM_START(void) TIM4_GPIO_Config(); Tim2_Slave_Init(); Tim3_Slave_Init(); TIM4_PWM_Init(XBUF0);好像還有一種方法,就是利用定時器內(nèi)部互聯(lián),一個定時器的給另一個定時器提供時鐘,主從模式貌似,成
27、功了!定時器內(nèi)部互聯(lián),一個PWM輸出脈沖給另一個定時提供時鐘,每來一個脈沖,計數(shù)器值+1,當+到指定個數(shù)后,產(chǎn)生一次中斷,然后關(guān)閉PWM輸出。發(fā)一次 跟發(fā)n次,每次都是設(shè)置的脈沖數(shù)!很精確,一個不多一個不少,我測試了下 20us的周期,發(fā)5000個,連續(xù)發(fā)了7次,都是準的!上圖!不過感覺這種方法還不是我想要的,畢竟兩個定時器才控制一路脈沖,要是PWM的4個通道路分別給4個的定時器提供時鐘,那就好了!剛看了下手冊,這里確實能夠選擇比較捕獲通道如果是1路脈沖的話,我選擇TIM_TRGOSource_Update和TIM_TRGOSource_OC1 一樣的效果,不
28、同在于后者每次脈沖會少一個。 脈沖輸出通道1:選擇TIM_TRGOSource_OC1Ref 脈沖輸出通道2:選擇TIM_TRGOSource_OC2Ref 脈沖輸出通道3:選擇TIM_TRGOSource_OC3Ref 脈沖輸出通道4:選擇TIM_TRGOSource_OC4Ref 這樣話有個問題,是不是一個主定時器能有多個從定時器,從定時器:TIM2,TIM3 TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3); TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3); 主定時器:TIM4 TIM_SelectOutputTrigge
29、r(TIM4,TIM_TRGOSource_OC1Ref|TIM_TRGOSource_OC2Ref); 卡到這里了,這個主定時器的觸發(fā)輸入該如何選擇啊,上面這樣可行嗎? 為何每次都有1個脈沖的差距啊,蛋都碎了要是能一對一觸發(fā)就好了,我還以為是OC1Ref觸發(fā)TIM2,OC2Ref觸發(fā)TIM3,想多了, OC1就能觸發(fā)TIM2和TIM3了,現(xiàn)在正常了,個數(shù)也很準了! 但是,中斷頻繁的問題解決了,還有一個問題 一個定時器的PWM的兩個通道的頻率是一樣的,這就意味著我用TIM4發(fā)出去的脈沖 雖然可以控制個數(shù)不一樣,但是周期還是一樣的 這對于先前要求的周期個數(shù)分別可控又走遠了,看來一個主定時器 只能有一種周期方波產(chǎn)生,可以有多個不同個數(shù)相同周期方波產(chǎn)生! 我總結(jié)了一下,應(yīng)用場合如下(個人總結(jié),可能有所偏差或者錯誤) 周期個數(shù)都獨立可控 - 幾路脈沖輸出對應(yīng)幾個主定時器 周期可控不獨立個數(shù)可控且獨立-一路主多路從,幾路脈沖輸出對應(yīng)幾個從定時器不知道這個算法準不準,樓主幫我測一下吧。void puls(u16 f,u16 count) unsigned char flag=1; u16 number,tem
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 草種育種研發(fā)合作協(xié)議
- 護理管道標識管理
- 護理質(zhì)控數(shù)據(jù)解讀
- 勾股定理與實際應(yīng)用的八大重難點題型(原卷版)-2024-2025學(xué)年八年級數(shù)學(xué)下冊
- 高考數(shù)學(xué)總復(fù)習(xí):二項分布、超幾何分布與正態(tài)分布
- 動物的運動、行為和動物在生物圈中的作用(綜合測試)-2025年中考生物一輪復(fù)習(xí)(含解析)
- 專題01 濃濃親情讀后續(xù)寫-2025年高考英語話題寫作高頻熱點通關(guān)攻略(原卷版)
- 急性心肌梗死護理流程
- 推拿治療的作用
- 猝死護理不良事件管理要點
- 構(gòu)建自媒體內(nèi)容生產(chǎn)與運營流程
- 煤礦井下安全避險六大系統(tǒng) 課件 項目五供水施救系統(tǒng)建設(shè)
- 上海研學(xué)旅游計劃書
- 食品產(chǎn)業(yè)園區(qū)規(guī)劃設(shè)計方案案例
- 大一職業(yè)素養(yǎng)計劃書的總結(jié)
- 《分布式計算、云計算與大大數(shù)據(jù)》習(xí)題參考解答
- 五年級下冊科學(xué)全冊知識點總結(jié)與梳理(新改版蘇教版)
- 合同補充協(xié)議書范本(通用版)-精華版:免修版模板范本
- 項目工程安全生產(chǎn)評估表
- 數(shù)據(jù)鏈系統(tǒng)與技術(shù)(第2版) 課件 第9、10章 數(shù)據(jù)鏈的通信安全、典型數(shù)據(jù)鏈系統(tǒng)的作戰(zhàn)運用
- 云南省昆明市五華區(qū)2022-2023學(xué)年六年級下學(xué)期期末英語試題
評論
0/150
提交評論