蓝桥嵌入式之 2015_第六届_蓝桥杯_国赛_电压测量与互补 PWM 信号输出

工程可见Github<传送门>


代码过多,这里不再一一粘贴,只挑重要的讲。

1、互补PWM输出

这个互补输出算的上是该题的一大亮点,PA9(TIM1_CH2)PB14(TIM1_CH2N)是一对互补通道。

互补PWM输出的配置类似PWM模式下的配置,但也有差别,这里贴出代码。

#include "stm32f10x.h"

/*sta参数表示是否初始化IO,en参数表示是否使能通道输出*/
void PWM_OC_Init(u8 freq, u8 duty, u8 sta, u8 en)
{
	u16 freq_Buf;
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	//别忘了先开启对应时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1, ENABLE);
	
	if(sta)//由于这个函数需要多次调用,但是并不需要每次都重新初始化IO所以这里来个变量
	{
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//强推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//强推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
	}
	
	freq_Buf = 1000000 / (freq*1000);//注意这里要进行放大
	
	TIM_TimeBaseStructure.TIM_Period = freq_Buf - 1;//总的值设置为0xFFFF
	TIM_TimeBaseStructure.TIM_Prescaler = 71;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
	
	
	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 = (freq_Buf - 1) * duty / 100;
	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_OCNIdleState_Reset;
	TIM_OC2Init(TIM1, &TIM_OCInitStructure);//注意这里是OC2
	
	TIM_CtrlPWMOutputs(TIM1, ENABLE);//高级定时器必须有这个
	TIM_Cmd(TIM1, ENABLE);//开启定时器
	
}

函数中的sta参数和en参数是题设的需要另加的。

sta - 避免再次开启时重新配置IO
en - 题目要求当关闭PWM输出时,两路通道必须为低电平。(注意并不是占空比赋值为0,那样并不行,不信你试试)

2、其他小问题

这次竟然犯了贼低级的错误,忘了在对应的h文件中在PWM_OC_Init后面加分号,出现了一大堆错误。

在这里插入图片描述

一定要注意!!!

3、实验结果

在这里插入图片描述

[图片]

该题比第八届模拟简单~