国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
c語言實現STM32F1多路相位、占空比可調PWM
[打印本頁]
作者:
zloop
時間:
2020-1-5 23:55
標題:
c語言實現STM32F1多路相位、占空比可調PWM
主要是用到定時器的主從模式,舉例: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上的預裝載寄存器
}
復制代碼
作者:
gkjswuser
時間:
2021-4-12 23:15
請問TIMs2和 TIMs5是什么呀?
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0