蓝桥杯嵌入式组开发——两路TIM

    技术2022-07-17  82

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

    Processed: 0.008, SQL: 9