蓝桥嵌入式之 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
- 避免再次开启时重新配置IOen
- 题目要求当关闭PWM输出时,两路通道必须为低电平。(注意并不是占空比赋值为0,那样并不行,不信你试试)
2、其他小问题
这次竟然犯了贼低级的错误,忘了在对应的h文件中在PWM_OC_Init
后面加分号,出现了一大堆错误。
一定要注意!!!
3、实验结果
该题比第八届模拟简单~