PWM互补输出(蓝桥杯嵌入式-电压测量与互补PWM的输出)

** 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是做不到的,因此需要关闭使能;

发布了7 篇原创文章 · 获赞 0 · 访问量 113

猜你喜欢

转载自blog.csdn.net/weixin_43636084/article/details/104997526