




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
...wd......wd......wd...STM32的PWM發送脈沖,周期和脈寬都可調了,但是現在不知道如何準確的控制所發的脈沖個數。
具體要求就是在一段時間內大概50ms內發送5000-1W個脈沖
個數要很準確,誤差2個以內可以承受
該怎么控制呢
1.接上一個外部中斷口,在中斷中計數
2.用一個定時器對發脈沖的時間進展控制
各位大俠還有什么好的方法嗎求解啊!
PWM溢出中斷計數,是個不錯的解決方法。如果一個上升沿算一個脈沖的話,控制周期〔頻率〕不就行了開啟PWM輸出的溢出中斷,進入一次中斷,就是一個波
原子哥
是這里嗎設置這個存放器或者只是簡單的定時器溢出中斷
oid
TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中斷
{
....
//計數
}
TIM3->SR&=~(1<<0);//去除中斷標志位
}看我們開發板:定時器中斷例程。你好
原子哥
中斷計數的話
那怎么停頓呢
還有停頓了還想讓他循環發送呢
有沒有實現好的源程序呢
我是STM32F103控制輸出方波的脈沖數和周期好多人遇到這個問題,額!
現在我用了兩種方法實現,感覺都不好!
方案1:定時器翻轉IO,到達指定個數關閉TIM
方案2:PWM,開啟比擬捕獲中斷,到達指定個數關閉TIM
感覺都是頻繁進中斷,占用大量CPU資源。不能做其他事了voidTIM4_GPIO_Config(void){
GPIO_InitTypeDefGPIO_InitStructure;
/*TIM4clockenable*/
//PCLK1經過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;
//復用推挽輸出
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;
//時鐘預分頻數
TIM_TimeBaseStructure.TIM_ClockDivision=0;
//采樣分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//選擇TIM2的輸入觸發源
內部觸發3
TIM4
TIM_InternalClockConfig(TIM2);
TIM2->SMCR|=
0x0007;//設定從模式控制存放器,外部時鐘模式1上升沿驅動計數
//TIM_UpdateDisableConfig(TIM4,ENABLE);
TIM_ARRPreloadConfig(TIM2,ENABLE);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);
//去除溢出中斷標志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);//是否開啟時鐘〔開啟后每發送一個脈沖,定時器加一〕}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;
//時鐘預分頻數
TIM_TimeBaseStructure.TIM_ClockDivision=0;
//采樣分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);//選擇TIM2的輸入觸發源
內部觸發3
TIM4
TIM_InternalClockConfig(TIM3);
TIM3->SMCR|=
0x0007;//設定從模式控制存放器,外部時鐘模式1上升沿驅動計數
//TIM_UpdateDisableConfig(TIM4,ENABLE);
TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
//去除溢出中斷標志
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);//是否開啟時鐘〔開啟后每發送一個脈沖,定時器加一〕}/*
*函數名:TIM4_Mode_Config
*描述
:配置TIM4輸出的PWM信號的模式,如周期、極性、占空比
*輸入
:無
*輸出
:無
*調用
:內部調用
*/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]);}好似還有一種方法,就是利用定時器內部互聯,一個定時器的給另一個定時器提供時鐘,主從模式貌似,成功了!定時器內部互聯,一個PWM輸出脈沖給另一個定時提供時鐘,每來一個脈沖,計數器值+1,當+到指定個數后,產生一次中斷,然后關閉PWM輸出。發一次
跟發n次,每次都是設置的脈沖數!很準確,一個不多一個不少,我測試了下
20us的周期,發5000個,連續發了7次,都是準的!上圖!
不過感覺這種方法還不是我想要的,畢竟兩個定時器才控制一路脈沖,要是PWM的4個通道路分別給4個的定時器提供時鐘,那就好了!剛看了下手冊,這里確實能夠選擇比擬捕獲通道
如果是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);
卡到這里了,這個主定時器的觸發輸入該如何選擇啊,上面這樣可行嗎
為何每次都有1個脈沖的差距啊,蛋都碎了要是能一對一觸發就好了,我還以為是OC1Ref觸發TIM2,OC2Ref觸發TIM3,想多了,
OC1就能觸發TIM2和TIM3了,現在正常了,個數也很準了!
但是,中斷頻繁的問題解決了,還有一個問題
一個定時器的PWM的兩個通道的頻率是一樣的,這就意味著我用TIM4發出去的脈沖
雖然可以控制個數不一樣,但是周期還是一樣的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 資產風險預警信息處理補充協議
- 燒烤行業網紅效應區域合作分銷協議
- 跨境電商貿易融資風險監控補充協議
- 自媒體矩陣與知名品牌跨界合作授權協議
- 新能源汽車電池租賃業務綠色金融支持補充協議
- 網絡數據備份恢復與數據恢復工具研發合同
- 網絡安全招標代理機構合作協議
- 恒大降負債協議書
- 蔬菜大棚種植與農業風險管理合作合同
- 抵押車貸款協議書
- 應急救援安全應知應會題庫
- 2024-2025學年七年級下學期英語人教版(2024)期末達標測試卷A卷(含解析)
- 2024年廣東高校畢業生“三支一扶”計劃招募筆試真題
- 5年級語文下冊看拼音寫詞語漢字生字擴詞日積月累專項練習電子版
- 2025至2030年中國護腰帶行業投資前景及策略咨詢報告
- 廣告宣傳服務方案投標文件(技術方案)
- 2025年山東省聊城市東昌府區中考二模語文試題(含答案)
- 2025年“六一”少先隊新隊員入隊儀式主持詞
- 空調崗位試題庫及答案
- 2024紡織機械操作流程掌握試題及答案
- 2025年貴州水投水庫運營管理西秀有限公司招聘筆試參考題庫附帶答案詳解
評論
0/150
提交評論