** PWM互补输出的配置和PWM模式配置相似,只是其中增加了高级定时器互补通道的配置,注意:只有高级定时器才能进行PWM互补输出**
如果想仔细了解配置原理,可以观看B站野火32有关高级定时器的部分<野火视频>
以蓝桥杯嵌入式定时器1为例:PA9-CH2,PA14-CH2N
#include"stm32f10x.h"
#include"advance_tim.h"
//PA9->TM1-CH2 PA14->TIM1-CH2N
//sta和en是根据题设另加的
//sta:避免再次开启时重新配置IO
//en:题目要求当关闭PWM输出时,两通道必须为低电平。(注意并不是占空比赋值为0就可以的)
u32 val;
void Advance_Init(u8 fre,u8 duty,u8 sta,u8 en)
{
u32 val;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO, ENABLE);
if(sta)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //强推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*CNT:计数器,ARR:自动装载计数器,CRR捕获(输入)/比较(输出)器*/
/*CNT<CRR时,占空比;CNT<ARR,周期*/
/*输入频率=72MHZ/(PSC+1)(ARR+1)*/
val=1000000/(fre*1000);
//ARR寄存器的值设定:周期
TIM_TimeBaseStructure.TIM_Period = val-1;
//时钟预分频系数:PSC
TIM_TimeBaseStructure.TIM_Prescaler = 71;
//时钟分频因子,配置死区时间用得到,1分频的话等于时钟系统频率72MHZ
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//计数器技术模式,设置为向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//PWM1模式时,CNT<CRR时,CH通道有效,CNT>CRR时,CH通道无效;
//PWM2模式时,CNT<CRR时,CH通道无效, CNN>CRT时,CH通道有效;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
if(en)
{
//输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//互补输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
}
else
{
//输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
//互补输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
}
//设置占空比大小
TIM_OCInitStructure.TIM_Pulse = (val-1)*duty/100;
//输出通道电平极性配置 :和CH通道有效相搭配
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
//互补输出通道电平极性配置!!!
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
//输出通道空闲电平极性配置
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;//空闲功能服务于刹车功能
//互补输出通道空闲电平极性配置!!!
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //空闲功能服务于刹车功能
//由输出控制原理,互补输出只需配置原路(CHx)输出即可,互补路(CHxN)不需要再初始化
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1,ENABLE);
}
上面代码中sta和en参数是根据题目要求来的:
sta:由于代码中多次调用互补输出函数,但初始化只需初始化一次即可,因此
en:题中有要求使两个互补路输出低电平,仅仅通过使占空比为0是做不到的,因此需要关闭使能;