主要是用到定时器的主从模式,举例: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之间的相位差。
- ////-------------- 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)指出,本站将立即改正。
|
|