stm32f4 输出pwm波_「STM32」PWM输出实验

pwm工作过程

cebbc7fc953cfd0d458939c4d2c0ac7a.png

解释一下这个图:

假如我们采用的向上计数的方式,从0计数到ARR,有一个输出捕获寄存器存放的值位CCRx,要是计时的数小于CCRx的话,我们输出一个低电平,要是计数的值大于CCRx的话,我们输出一个高电平,这样其实就产生了一个pwm波形,在这个波形中,我们知道,周期是由ARR的值控制的,其实这个值也是受限了时钟频率的,那么波的占空比由CCRx控制的。

de5f19f352f836db24d20992cc62df2b.png
b9bfd7bb6ce5d7ab9c12dc7d7b44b71a.png
a57df314aded6cf3d8058467c7b78cd2.png
ac8daf19c25ee5aec9974bafef3ecf97.png
69202046942a0a740105efaadbbc4fd1.png
dd5aefc458894dc8264ed5de4a6c5b64.png

pwm输出库函数

628305be41446cbea08d630090aeb042.png
4a176c8a23db4fc7c4192b4bbab4318b.png

示例:使用定时器4实现每1s中断一次,在中断服务程序中实现某种动作。使用定时器3的PWM功能,输出占空比可变的pwm波,实现呼吸灯。

229ab012b9c83d38332edd5881e93f43.png

PB5 默认外设引脚的对应里面是没有定时器的,它是通过remap的方式映射到TIM3的通道2上的。这样我们才能输出一个pwm波。

2fc1ec7f09e04b6c5099133bf99b03b4.png

程序源码:

093154d31bddab54328d9cb76b5cb1da.png

timer.h

8c15faf069cf9a0bd12d588846bc7d90.png

timer.c

7ba20616d03f3d3e46ff0483424773ec.png

main.c

这个程序里面主要是这个的设置:

TIM_OCInitTypeDef TIM_OCInitStructure;

//选择定时器模式:TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

//比较输出使能

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//输出极性:TIM输出比较极性高

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

这个里面我们设置的是PWM模式2,在使用向上计数的时候,TIMx_CNT < TIMx_CCR1时,通道为无效电平,否则有有限电平,在使用向下计数的时候 TIMx_CNT > TIMx_CCR1时,为有效电平,否则为无效电平。本程序我们使用的是向下计数。

再看一下这个图:

bb087d124335ba79cb8ea71ea27d31a5.png

按照这个图来说就是,你的计数值大于CCR的时候,输出一个高电平,计数值小于CCR的时候,输出一个低电平,当你把CCR的值设置的很小,那么波形的占空比就很大,你的CCR值设置的大(肯定是小于ARR的)你的波形的占空比就小。


喜欢我文章的朋友,欢迎关注、点赞、评论、交流。版权个人所有,转载请注明出处。

要在STM32F4输出PWM信号,可以使用定时器模块。具体步骤如下: 1. 初始化定时器模块,选择合适的时钟源和分频系数。 2. 配置定时器为PWM模式,选择合适的计数值和占空比。 3. 配置输出引脚,使其连接到定时器的输出通道。 以下是一个简单的示例代码,使用TIM3_CH1输出PWM信号: ```c // 初始化定时器模块 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_Prescaler = 0; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Period = 999; TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct); // 配置定时器为PWM模式 TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 499; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStruct); // 配置输出引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); // 启动定时器 TIM_Cmd(TIM3, ENABLE); ``` 这段代码将在PB4引脚输出一个占空比为50%的PWM信号,频率为84MHz/1000=84kHz。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值