【标准库代码】之翻转模式输出不同频率不同占空比PWM

要求

在TIMx上输出不同频率,不同占空比的PWM波形。
例如:
PA6输出fre1=100Hz
PA7输出fre2=200Hz

测试硬件

芯片:STM32RBT6

步骤

1. 变量申明

//以下都是全局变量
__IO u16 CCR1_Val=0;//
__IO u16 CCR2_Val=0;//
unsigned char G_duty1=10;//占空比1,设置量
unsigned char G_duty2=20;//占空比2,设置量
//函数声明
void My_TIM3_Init(unsigned char fre1,unsigned char fre2);//设置频率
void Adjust_fre_1(u16 fre,u8 duty);
void Adjust_fre_2(u16 fre,u8 duty);

2. 时钟初始化

见第5步

3. 引脚GPIO

见第5步

4. 中断配置

见第5步

5. TIMx配置

void My_TIM3_Init(unsigned char fre1,unsigned char fre2)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;	
    
	CCR1_Val=1000000/fre1/2;
	CCR2_Val=1000000/fre2/2;

  /* Enable TIM3 and GPIOA clock  */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
  
  /* GPIOA Configuration:TIM9 Channel1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	
  /* Enable the TIM3 global Interrupt */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//合理设置中断组
  
  NVIC_InitStructure.NVIC_IRQChannel =  TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;//合理设置
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//合理设置
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
	
  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 65535;
  TIM_TimeBaseStructure.TIM_Prescaler = 71;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
  /* Output Compare Toggle Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);	
	
  /* Output Compare Toggle Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OC2Init(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);
	
  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);

  /* TIM IT enable */
  TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE);	
}

6. 中断服务函数

void TIM3_IRQHandler(void)
{
	static unsigned char flag1=0,flag2=0;
	static unsigned short capture=0
  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
    capture = TIM_GetCapture1(TIM3);
		if(flag1==0)
		{
			TIM_SetCompare1(TIM3,capture + CCR1_Val*G_duty1/100);
			flag1=1;
		}
		else
		{
			TIM_SetCompare1(TIM3,capture + CCR1_Val*(100-G_duty1)/100);
			flag1=0;
		}
  }
  if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM3);

		if(flag2==0)
		{
			TIM_SetCompare2(TIM3,capture + CCR2_Val*G_duty2/100);
			flag2=1;
		}
		else
		{
			TIM_SetCompare2(TIM3,capture + CCR2_Val*(100-G_duty2)/100);
			flag2=0;
		}
  }
}

7. 调整频率和占空比函数

void Adjust_fre_2(u16 fre,u8 duty)
{
	CCR2_Val=1000000/fre;
	G_duty2=duty;
}
void Adjust_fre_1(u16 fre,u8 duty)
{
	CCR1_Val=1000000/fre;
	G_duty1=duty;
}

8.举例

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	My_TIM3_Init(100,200);//PA6,PA7输出标准方波频率分别为100Hz,200Hz,占空比50%
	Adjust_fre_1(100,70);//PA6输出100Hz,占空比70%
	Adjust_fre_2(200,30);//PA7输出200Hz,占空比30%
	while(1);
}
	

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值