蓝桥杯嵌入式组开发——两路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
;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2
, ENABLE
);
TIM_TimeBaseStructure
.TIM_Period
= 999;
TIM_TimeBaseStructure
.TIM_Prescaler
= 0;
TIM_TimeBaseStructure
.TIM_ClockDivision
= 0;
TIM_TimeBaseStructure
.TIM_CounterMode
= TIM_CounterMode_Up
;
TIM_TimeBaseInit(TIM2
, &TIM_TimeBaseStructure
);
TIM_PrescalerConfig(TIM2
,71, TIM_PSCReloadMode_Immediate
);
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
);
TIM_Cmd(TIM2
, ENABLE
);
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逻辑分析仪去查看。