蓝桥杯嵌入式组开发——两路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逻辑分析仪去查看。