STM32 PWM的输出与Keil软件仿真

您所在的位置:网站首页 脉冲宽度怎么看出来 STM32 PWM的输出与Keil软件仿真

STM32 PWM的输出与Keil软件仿真

2024-07-12 16:25| 来源: 网络整理| 查看: 265

STM32 PWM的输出

脉冲宽度模式(PWM模式)可以用来产生一个由TIMx_ARR寄存器确定平率,由TIMx_CCRx寄存器确定占空比的信号。在STM32开发中,由于官方提供了较为完善的库函数,使得我们的开发工作变得相当的轻松,甚至可以在不需要太多了解硬件结构的条件下,完成我的开发工作,实现我们所需要的功能。在此,笔者也建议大家,在初学的时候尽量去熟悉固件库中提供的函数来调节PWM的频率和占空比,对底层寄存器的操作应尽量减少。

本文使用的STM32F103RB的芯片,输出通道是TIM2_CH2通道,STM32有较强的可移植性,如果读者的芯片类型跟我不一样,可以做适当的修改,完成自己的开发。

使用到的库函数有: stm32f10x.h:用以系统的初始化,无论做什么开发,该库必须包含 stm32f10x_tim.h:TIM定时器库函数 stm32f10x_rcc.h:时钟配置库函数 stm32f10x_gpio.h:GPIO配置库函数

由以上的库函数可知,我们需要初始化的内容有TIM2定时器,时钟使能配置,GPIO的使能配置。

void RCC_Config(void); void GPIO_Config(void); void TIM_Config(void);

接下来就是编写各个函数的函数体,在这些内容里面,其实官方已经给出了示例,我们按照官方给的函数库进行配置,然后修改一下官方的一些变量属性即可。

RCC_Config函数体

void RCC_Config(void) { //使能GPIOA,TIM2 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); }

GPIO_Config函数体

void GPIO_Config(void) { //GPIO的配置,官方库有给出需要配置的一些参数,如果忘记了,参照一下即可,我这里配置的是GPIOA_Pin_1 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); }

TIM_Config函数体 在配置函数体之前,先了解一下stm32的占空比以及频率是如何计算的 ①频率:我们使用的APB1时钟源是72MHz的,在此我们不做分频,通过配置相关的参数来设置输入频率,计算方法:输入频率=APB1时钟/(预分频系数+1)=72000000Hz/360=200000Hz ②TIM_TImeBaseStructure.TIM_Period参数决定了输出PWM波形的频率,输出PWM波形的频率=定时器的输入频率/TIM_TImeBaseStructure.TIM_Period,本例程20000Hz/100=200Hz,即5ms一个周期 ③配置占空比:占空比=配置占空比的值/ TIM_TImeBaseStructure.TIM_Period,以此计算来确定占空比,本案例的占空比为50/100=50% ④定时器使能

void TIM_Config(void) { TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //配置TIM2的时钟输出频率,以及其它相关参数初始化 TIM_TImeBaseStructure.TIM_Prescaler=360-1;//设置PWM的频率 TIM_TImeBaseStructure.TIM_CounterMode=0; TIM_TImeBaseStructure.TIM_Period=100; TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure); //设置PWM的输出方式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //配置占空比 TIM_OCInitStructure.TIM_Pulse=50; TIM_OC2Init(TIM2,&TIM_OCInitStructure); TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active); TIM_Cmd(TIM2,ENABLE); TIM_CtrlPWMOutputs(TIM2,ENABLE); }

由此,我们的整个PWM配置完成 Main函数

int main() { RCC_Config(); GPIO_Config(); TIM_Config(); while(1) { ; } }

接下来,我们讲解一下,在Keil里面看我们的GPIOA_Pin_1引脚的输出频率,波形

Keil软件仿真

①配置调试工具 这里写图片描述

②打开调试,并设置并检测GPIO的输出引脚 这里写图片描述 这里写图片描述 这里写图片描述

③全速运行,观察示波器 这里写图片描述 这里写图片描述

STM32-PWM输出源码下载地址 STM32固件库3.5版本使用手册的中文翻译版



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3