STM32如何产生PWM信号
扫描二维码
随时随地手机看文章
本文实践用到的芯片为:STM32F103VET6。文中所述内容符合同系列芯片的应用。本文适合初学者阅读。
上面是在STM32引脚PA0上测得的频率为1KHz占空比为25%的PWM信号。下面讲如何实现。
如上图所示,我们使用定时器2通道1产生PWM。
执行思想:1.需要把引脚配置为复用推挽输出;2.需要配置定时器2。
1.配置引脚
我们用库函数实现的话,肯定要涉及到GPIO初始化配置结构体,所以需要定义一个GPIO_InitTypeDef类型的结构体变量,然后把变量成员配置好。
2.配置定时器2
我们用库函数的话,一是要涉及到定时器的基本配置结构体,所以需要定义一个TIM_TimeBaseInitTypeDef类型的结构体变量,然后把变量成员配置好。二是需要使用TIM_OC1Init()函数输出PWM信号,所以还需要定义一个TIM_OCInitTypeDef类型的结构体变量,然后把变量成员配置好。
程序如下:
voidPA0_PWM(void){GPIO_InitTypeDefGPIO_InitStruct;//GPIO初始化结构体变量TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct;//定时器基本初始化结构体变量TIM_OCInitTypeDefTIM_OCInitStruct;//定时器OC输出结构体初始化变量/*允许TIM2*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);/*允许GPIOA*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*选择PA0*/GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;/*复用推挽输出*/GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;/*引脚最大输出频率*/GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;/*配置*/GPIO_Init(GPIOA,&GPIO_InitStruct);/*周期1000*/TIM_TimeBaseInitStruct.TIM_Period=999;/*定时器时间间隔1微秒*/TIM_TimeBaseInitStruct.TIM_Prescaler=71;/*向上计数*/TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;/*配置*/TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);/*选择PWM1模式*/TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;/*允许输出模式*/TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;/*匹配值*/TIM_OCInitStruct.TIM_Pulse=249;/*设置小于匹配值时为高电平*/TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;/*使能定时器2的通道1*/TIM_OC1Init(TIM2,&TIM_OCInitStruct);/*打开定时器2*/TIM_Cmd(TIM2,ENABLE);}
执行上面的函数,即可在PA0引脚上输出占空比为25%频率为1KHz的PWM信号了。结构上面的描述和程序里面的描述,上面的程序就很好理解了。