主要是用到定時器的主從模式,舉例:T2的OC1 和T5的OC4輸出相位、占空比可調的兩路PWM
定時器T2作為主定時器 OC1輸出10%的占空比,定時器T2 的OC2用來調整相位,暫定輸出30%的占空比,并設置T2的OC2為輸出觸發信號。主要設置代碼:
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主模式使能,TIMx->SMCR ---- MSM
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC2Ref);//主模式選擇,TIMx->CR2 MMS
T5作為從定時器,任意選擇一路PWM輸出,并設置好占空比以OC4為例。并選擇觸發源,從模式選擇復位模式,主要配置代碼:
TIM_SelectInputTrigger(TIM5,TIM_TS_ITR0);//觸發選擇,TIMx_SMCR -- TS
TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Reset );//從模式選擇 TIMx_SMCR -- SMS
通過T2的OC2就可以調整T2的OC1和T5的OC4之間的相位差。
image.png (520.99 KB)
下載附件
2020-1-5 23:53 上傳
- ////-------------- TIM2 -----------------------
- //APB1分頻系數為2,APB1的時鐘為36M,TIM2-7為其2倍=72M
- //Tout= ((arr+1)*(psc+1))/Tclk;
- //arr 自動裝載值,PSC 時鐘預分頻數
- void Time2Init(u16 period,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIMStruct;
- NVIC_InitTypeDef NVIC_InitStruct;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //時鐘使能
- // //TIM2 初始化
- TIMStruct.TIM_Period=period;//自動重載計數周期的值
- TIMStruct.TIM_Prescaler=psc;//預分頻值,T2頻率=FclkSYS/psc
- TIMStruct.TIM_ClockDivision=TIM_CKD_DIV1;//CDK時鐘分頻因子
- TIMStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計數
- TIM_TimeBaseInit(TIM2,&TIMStruct);//根據指定的參數初始化TIMx的時間基數單位
-
- // //中斷優先級
- //更新中斷中斷TIM_IT_Update, 比較中斷TIM_IT_CC
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//允許更新中斷
- NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//搶占優先級
- NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//從優先級
- NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStruct);
-
- //----主從配置
- TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//主模式使能,TIMx->SMCR ---- MSM
- TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC2Ref);//主模式選擇,TIMx->CR2 MMS
-
-
- //使能
- TIM_Cmd(TIM2,ENABLE);
- TIMs2.Instense=TIM2;
- }
- //CCER->CCxP = 0; PWM模式1的情況下TIMx->CRRx= 0;為低電平。TIMx->CRRx = TIMx->ARR;為高電平,TIMx->CRRx越大,正占空比越大。
- //CCER->CCxP = 1; PWM模式1的情況下TIMx->CRRx= 0;為高電平。TIMx->CRRx >= TIMx->ARR;為低電平,TIMx->CRRx越大,正占空比越小。
- //CCER->CCxP = 0; PWM模式2的情況下TIMx->CRRx= 0;為高電平。TIMx->CRRx = TIMx->ARR;為低電平,TIMx->CRRx越大,正占空比越小。
- //CCER->CCxP = 1; PWM模式2的情況下TIMx->CRRx= 0;為低電平。TIMx->CRRx >= TIMx->ARR;為高電平,TIMx->CRRx越大,正占空比越大。
- void Time2PWMInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIMx外設
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOB外設時鐘使能
- //配置IO
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //TIM_CH1
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用功能輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
- //通道1
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStructure.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低電平有效
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//設置空閑電平
- TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根據指定的參數初始化外設TIMx
- TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
- TIM_SetCompare1(TIM2,100);
- //通道2
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStructure.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低電平有效
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//設置空閑電平
- TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根據指定的參數初始化外設TIMx
- TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
- TIM_SetCompare2(TIM2,200);//初始值為0
-
- TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的預裝載寄存器
- }
- void Time5Init(u16 period,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIMStruct;
- NVIC_InitTypeDef NVIC_InitStruct;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //時鐘使能
- // //TIM 初始化
- TIMStruct.TIM_Period=period;//自動重載計數周期的值
- TIMStruct.TIM_Prescaler=psc;//預分頻值,T2頻率=FclkSYS/psc
- TIMStruct.TIM_ClockDivision=TIM_CKD_DIV1;//CDK時鐘分頻因子
- TIMStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計數
- TIM_TimeBaseInit(TIM5,&TIMStruct);//根據指定的參數初始化TIMx的時間基數單位
-
- // //中斷優先級
- //更新中斷中斷TIM_IT_Update, 比較中斷TIM_IT_CC
- TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);//允許更新中斷
- NVIC_InitStruct.NVIC_IRQChannel=TIM5_IRQn;
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//搶占優先級
- NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//從優先級
- NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStruct);
-
- //----主從配置
- TIM_SelectInputTrigger(TIM5,TIM_TS_ITR0);//觸發選擇,TIMx_SMCR -- TS
- TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_Reset );//從模式選擇 TIMx_SMCR -- SMS
-
- //使能
- TIM_Cmd(TIM5,ENABLE);
- TIMs5.Instense=TIM5;
- }
- void Time5PWMInit(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIMx外設
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOB外設時鐘使能
- //配置IO
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM_CH4
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用功能輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO
- //通道1
-
- //通道4
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //CH1 PWM2模式
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStructure.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OC1 低電平有效
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//設置空閑電平
- TIM_OC4Init(TIM5, &TIM_OCInitStructure); //根據指定的參數初始化外設TIMx
- TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
- TIM_SetCompare4(TIM5,100);//初始值為0
-
- TIM_ARRPreloadConfig(TIM5, ENABLE); //使能TIMx在ARR上的預裝載寄存器
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|