蓝桥杯嵌入式组开发——两路TIM_PWM_OUT可设置输出频率

蓝桥杯嵌入式组开发——两路TIM_PWM_OUT可设置输出频率

我们要写PWM的输出程序,比赛时参考提供的官方库,路径如下:
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\7PWM_Output

我们要用到A1,A2复用 ,通道是TIM2的CH2和CH3
在这里插入图片描述
需要对TIM进行配置,配置好的代码如下,我们只需要修改TIM_Period 改变周期999为1KHZ,即1MS为一个周期

1.配置好的TIM_Config


void TIM_Config(uint16_t Channel2Pulse, uint16_t Channel3Pulse)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	/* TIM2 clock enable */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);		
	
	/* Time base configuration */
	TIM_TimeBaseStructure.TIM_Period = 999;  //1KHz
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	//TIM2预分频设置:1MHZ,APB1分频系数2,输入到TIM3时钟为36MHzx2 = 72MHz  
	TIM_PrescalerConfig(TIM2,71, TIM_PSCReloadMode_Immediate);		

	/* Channel 2 and 3 Configuration in PWM mode */
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
	TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;	
	
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);

	TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);

	//使能TIM2定时计数器
	TIM_Cmd(TIM2, ENABLE);
	//使能TIM2 PWM输出模式
	TIM_CtrlPWMOutputs(TIM2, ENABLE);
}

参考官方库工程7PWM_Output里的main.c

2.编写TIM_Config参考思路

先定义初始化的结构体和配置TIM2的时钟
通过官方给的例程参考以下代码
在这里插入图片描述

3.PWM_IO_Config(A1,A2引脚配置)

void PWM_IO_Config(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

4.初始化及修改PWM的频率值

由TIM_SetCompare2,TIM_SetCompare3函数来修改对应通道的PWM值
在这里插入图片描述
对应的1,2,3,4即我们之前初始化配置的通道
在这里插入图片描述
在while(1)中通过按键调整PWM_A1 ,PWM_A2参数改变输出的方波频率
按键部分代码参考https://blog.csdn.net/weixin_45566765/article/details/106843195这篇文章

int PWM_A1 = 50; //占空比百分之五十
int PWM_A2 = 70;

int main(void)
{
	//其他初始化省略了
	PWM_IO_Config();
	TIM_Config(998*PWM_A1/100, 998*PWM_A2/100);	
	while(1)
	{
		// ......
		if(key_flag == 1)
		{
			key_flag = 0;
			key_scan();
		}
		sprintf(str,"PA1:%0.2d,PA2:%0.2d",PWM_A1, PWM_A2);
		LCD_DisplayStringLine(Line5,(unsigned char *)str);
		TIM_SetCompare2(TIM2, 998*PWM_A1/100);
		TIM_SetCompare3(TIM2, 998*PWM_A2/100);
	}
}

按键程序

void key_scan(void)
{
	static int key_num1 = 0, key_num2 = 0, key_num3 = 0, key_num4 = 0;


	if(key1 == 0)
	{
		key_num1++;
		if(key_num1 ==3 )
		{
			PWM_A1 +=10;
			if(PWM_A1 >= 100)
				PWM_A1 = 10;	
		}			 	
	}
	else
	{
		key_num1 = 0;
	}

	if(key2 == 0)
	{
		key_num2++;
		if(key_num2 ==3 )
		{
			PWM_A2 +=10;
			if(PWM_A2 >= 100)
				PWM_A2 = 10;	
		}			 	
	}
	else
	{
		key_num2 = 0;
	}
}

通过示波器查看通过按键调整波形没有问题,当然你可以用KEIL逻辑分析仪去查看。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值