PWM發(fā)脈沖怎么精確控制發(fā)脈沖的個數(shù)呢_第1頁
PWM發(fā)脈沖怎么精確控制發(fā)脈沖的個數(shù)呢_第2頁
PWM發(fā)脈沖怎么精確控制發(fā)脈沖的個數(shù)呢_第3頁
PWM發(fā)脈沖怎么精確控制發(fā)脈沖的個數(shù)呢_第4頁
PWM發(fā)脈沖怎么精確控制發(fā)脈沖的個數(shù)呢_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

...wd......wd......wd...STM32的PWM發(fā)送脈沖,周期和脈寬都可調(diào)了,但是現(xiàn)在不知道如何準(zhǔn)確的控制所發(fā)的脈沖個數(shù)。

具體要求就是在一段時間內(nèi)大概50ms內(nèi)發(fā)送5000-1W個脈沖

個數(shù)要很準(zhǔn)確,誤差2個以內(nèi)可以承受

該怎么控制呢

1.接上一個外部中斷口,在中斷中計數(shù)

2.用一個定時器對發(fā)脈沖的時間進(jìn)展控制

各位大俠還有什么好的方法嗎求解啊!

PWM溢出中斷計數(shù),是個不錯的解決方法。如果一個上升沿算一個脈沖的話,控制周期〔頻率〕不就行了開啟PWM輸出的溢出中斷,進(jìn)入一次中斷,就是一個波

原子哥

是這里嗎設(shè)置這個存放器或者只是簡單的定時器溢出中斷

oid

TIM3_IRQHandler(void)

{

if(TIM3->SR&0X0001)//溢出中斷

{

....

//計數(shù)

}

TIM3->SR&=~(1<<0);//去除中斷標(biāo)志位

}看我們開發(fā)板:定時器中斷例程。你好

原子哥

中斷計數(shù)的話

那怎么停頓呢

還有停頓了還想讓他循環(huán)發(fā)送呢

有沒有實(shí)現(xiàn)好的源程序呢

我是STM32F103控制輸出方波的脈沖數(shù)和周期好多人遇到這個問題,額!

現(xiàn)在我用了兩種方法實(shí)現(xiàn),感覺都不好!

方案1:定時器翻轉(zhuǎn)IO,到達(dá)指定個數(shù)關(guān)閉TIM

方案2:PWM,開啟比擬捕獲中斷,到達(dá)指定個數(shù)關(guān)閉TIM

感覺都是頻繁進(jìn)中斷,占用大量CPU資源。不能做其他事了voidTIM4_GPIO_Config(void){

GPIO_InitTypeDefGPIO_InitStructure;

/*TIM4clockenable*/

//PCLK1經(jīng)過2倍頻后作為TIM4的時鐘源等于72MHz

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);

NVIC_Configuration(1);

/*GPIOBclockenable*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);

/*GPIOBConfiguration:TIM4channel1and2asalternatefunctionpush-pull*/

GPIO_InitStructure.GPIO_Pin=

GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

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

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);}voidTim2_Slave_Init(void){

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

TIM_DeInit(TIM2);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

NVIC_Configuration(8);

TIM_TimeBaseStructure.TIM_Period=XBUF[1]-1;

TIM_TimeBaseStructure.TIM_Prescaler=0;

//時鐘預(yù)分頻數(shù)

TIM_TimeBaseStructure.TIM_ClockDivision=0;

//采樣分頻

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//選擇TIM2的輸入觸發(fā)源

內(nèi)部觸發(fā)3

TIM4

TIM_InternalClockConfig(TIM2);

TIM2->SMCR|=

0x0007;//設(shè)定從模式控制存放器,外部時鐘模式1上升沿驅(qū)動計數(shù)

//TIM_UpdateDisableConfig(TIM4,ENABLE);

TIM_ARRPreloadConfig(TIM2,ENABLE);

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

//去除溢出中斷標(biāo)志

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM2,ENABLE);//是否開啟時鐘〔開啟后每發(fā)送一個脈沖,定時器加一〕}voidTim3_Slave_Init(void){

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

TIM_DeInit(TIM3);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

NVIC_Configuration(9);TIM_TimeBaseStructure.TIM_Period=XBUF[3]-1;

TIM_TimeBaseStructure.TIM_Prescaler=0;

//時鐘預(yù)分頻數(shù)

TIM_TimeBaseStructure.TIM_ClockDivision=0;

//采樣分頻

TIM_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);

TIM3->SMCR|=

0x0007;//設(shè)定從模式控制存放器,外部時鐘模式1上升沿驅(qū)動計數(shù)

//TIM_UpdateDisableConfig(TIM4,ENABLE);

TIM_ARRPreloadConfig(TIM3,ENABLE);

TIM_ClearFlag(TIM3,TIM_FLAG_Update);

//去除溢出中斷標(biāo)志

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM3,ENABLE);//是否開啟時鐘〔開啟后每發(fā)送一個脈沖,定時器加一〕}/*

*函數(shù)名:TIM4_Mode_Config

*描述

:配置TIM4輸出的PWM信號的模式,如周期、極性、占空比

*輸入

:無

*輸出

:無

*調(diào)用

:內(nèi)部調(diào)用

*/voidTIM4_PWM_Init(u16T){

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;

TIM_OCInitTypeDef

TIM_OCInitStructure;

u16CCR1_Val=(T+1)/2;

u16CCR2_Val=(T+1)/2;

u16CCR3_Val=(T+1)/2;

u16CCR4_Val=(T+1)/2;

/*-----------------------------------------------------------------------

TIM1Configuration:generate4PWMsignalswith4differentdutycycles:

TIM1CLK=36MHz,Prescaler=0x0,TIM1counterclock=36MHz

TIM1ARRRegister=999=>TIM1Frequency=TIM1counterclock/(ARR+1)

TIM1Frequency=36KHz.

TIM1Channel1dutycycle=(TIM1_CCR1/TIM1_ARR)*100=50%

TIM1Channel2dutycycle=(TIM1_CCR2/TIM1_ARR)*100=50%

TIM1Channel3dutycycle=(TIM1_CCR3/TIM1_ARR)*100=50%

TIM1Channel4dutycycle=(TIM1_CCR4/TIM1_ARR)*100=50%

-----------------------------------------------------------------------*/

/*Timebaseconfiguration*/

TIM_TimeBaseStructure.TIM_Period=T-1;//Tus

TIM_TimeBaseStructure.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);//UDISenable

/*PWM1Modeconfiguration: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;

TIM_OC1Init(TIM4,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);

/*PWM1Modeconfiguration:Channel2*/

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse=CCR2_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,&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_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);*/

TIM_ARRPreloadConfig(TIM4,ENABLE);

TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref);

/*TIM1enablecounter*/

TIM_Cmd(TIM4,ENABLE);

/*MainOutputEnable*/

TIM_CtrlPWMOutputs(TIM4,ENABLE);}voidTIM4_PWM_START(void){

TIM4_GPIO_Config();

Tim2_Slave_Init();

Tim3_Slave_Init();

TIM4_PWM_Init(XBUF[0]);}好似還有一種方法,就是利用定時器內(nèi)部互聯(lián),一個定時器的給另一個定時器提供時鐘,主從模式貌似,成功了!定時器內(nèi)部互聯(lián),一個PWM輸出脈沖給另一個定時提供時鐘,每來一個脈沖,計數(shù)器值+1,當(dāng)+到指定個數(shù)后,產(chǎn)生一次中斷,然后關(guān)閉PWM輸出。發(fā)一次

跟發(fā)n次,每次都是設(shè)置的脈沖數(shù)!很準(zhǔn)確,一個不多一個不少,我測試了下

20us的周期,發(fā)5000個,連續(xù)發(fā)了7次,都是準(zhǔn)的!上圖!

不過感覺這種方法還不是我想要的,畢竟兩個定時器才控制一路脈沖,要是PWM的4個通道路分別給4個的定時器提供時鐘,那就好了!剛看了下手冊,這里確實(shí)能夠選擇比擬捕獲通道

如果是1路脈沖的話,我選擇TIM_TRGOSource_Update和TIM_TRGOSource_OC1

一樣的效果,不同在于后者每次脈沖會少一個。

脈沖輸出通道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_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref|TIM_TRGOSource_OC2Ref);

卡到這里了,這個主定時器的觸發(fā)輸入該如何選擇啊,上面這樣可行嗎

為何每次都有1個脈沖的差距啊,蛋都碎了要是能一對一觸發(fā)就好了,我還以為是OC1Ref觸發(fā)TIM2,OC2Ref觸發(fā)TIM3,想多了,

OC1就能觸發(fā)TIM2和TIM3了,現(xiàn)在正常了,個數(shù)也很準(zhǔn)了!

但是,中斷頻繁的問題解決了,還有一個問題

一個定時器的PWM的兩個通道的頻率是一樣的,這就意味著我用TIM4發(fā)出去的脈沖

雖然可以控制個數(shù)不一樣,但是周期還是一樣的

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論