PWM: Pluse Width Modulation 的缩写,称作脉冲宽度调制,是利用CPU的数字输出来对模拟电路的一种控制,即通过对脉冲宽度的控制。

接下来随笔者看几个概念:

PWM的周期:即频率的倒数,频率由时钟晶振确定,运行时是不变的,自然PWM的周期也保持一个定值,即图中的T,一个脉冲信号的时间

PWM的占空比:t1/T       t1为脉宽时间,如图中所示,占空比为25%

现在,我们让处于高电平时,通过LED灯为5V,处于低电平时,通过LED灯为0V,那么只要改变占空比,就可以让通过LED灯的电压一直改变,从而产生呼吸灯的效果。

即,使用PWM就是对占空比的控制。

        占空比的控制

         在这里,我们自然想到了定时器,请看下图:

我们可以设置自动重载值和比较值,计数器计数时:当计数值比比较值小,就让PWM输出低电平;当计数值比比较值大,就让PWM输出高电平。当然,在STM32中,从小向大计数还是从大向小计数,与比较值比较,低电平还是高电平,都是通过寄存器设置的,但是本质思想没有变。

以笔者的32为例来配置相应的寄存器,来不断的改变占空比。

本代码为正点原子STM32F103战舰V3版本。

/*******************************************************************************
* 函数名           : PWM_Init
* 功能            : PWM初始化
* 输入            : arr  重装载值
* 输入            : psc  分频系数
* 输出            : 无
*******************************************************************************/
void  PWM_Init(u16 arr, u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;TIM_OCInitTypeDef  TIM_OCInitStructure;//TIM3时钟使能   GPIO和AFIO功能使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);//这个地方部分重映射,把通道1从PA6映射到了PB4,通道1从PA7映射到了PB5GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//配置PB5为复用输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//设置TIM3_CH2重映射到PB5上(部分重映射),定时器的通道映射只能映射到固定端口//初始化定时器参数 设置时钟分频因子 计数方式  重装载值   分频系数//[ (arr+1) * (psc+1) ] / 72MKHz = T(us)周期 当频率低于50Hz,即周期大于20ms时,即可看见闪烁TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = arr;TIM_TimeBaseInitStruct.TIM_Prescaler = psc;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);//定时器PWM模式2   比较输出使能   极性高低TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC2Init(TIM3, &TIM_OCInitStructure);//使能TIM3和使能预装载寄存器TIM_Cmd(TIM3, ENABLE);TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
}

这里还有一个计数值与比较值做比较的函数

/*******************************************************************************
* 函数名           : Compare
* 功能            : 不断通过改变比较值改变占空比
* 输入            : 无
* 输出            : 无
*******************************************************************************/
void  Compare(void)
{u8 dir = 1, bijiao = 0;while (1){if (dir) bijiao++;else    bijiao--;if (bijiao > 898) dir = 0;if (bijiao == 0)  dir = 1;TIM_SetCompare2(TIM3, bijiao);}}

计数值会自动递增,我们要做的,就是不断改变占空比

———————————————————————————————————————————

参考资料:

1.51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili

2.《STMF1开发指南—库函数版》        正点原子

STM32学习之PWM输出相关推荐

  1. STM32学习笔记—PWM输出

    1.pwm输出介绍 2.函数配置 3.源码 1.pwm输出介绍 脉冲调制(pwm),其根本原理就是通过控制占空比来控制输出.STM32的定时器除了TIM6和7之外都可以产生pwm输出,其中高级定时器1 ...

  2. 蓝桥杯STM32G431RBT6学习——定时器PWM输出

    蓝桥杯STM32G431RBT6学习--定时器PWM输出 前言 PWM波输出作为定时器的一个常用功能,也属于高频的考点.从数据手册的定时器解析可以了解到(上篇描述):除了基本定时器(TIM6.7)外, ...

  3. stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)

    使用单片机:stm32f103c8t6  资源 RAM: 20K: flash: 64K:CPU频率: 72M:通用I/O: 32个:UART: 3个:SPI:2个:USB:1个:CAN: 1个:II ...

  4. STM32笔记之PWM输出,调节频率及占空比

    以STM32F103C8T6使用TIM1的CH1,CH4同时输出两路PWM为例: 引脚 定时器 通道 PA8 TIM1 CH1 PA11 TIM1 CH4 步骤: GPIO_InitTypeDef G ...

  5. 10.利用STM32定时器的PWM输出功能,直接获取PWM波形。

    本实验向大家展示如何输出占空比固定的PWM波形. 1.工程的建立: 2.主函数代码: 3.pwm_output.c代码: 4.output.h代码: 5.结果: 6.结果显示不出来的请看上几节的文章, ...

  6. STM32 TIM PWM中阶操作:互补PWM输出

    STM32 TIM PWM中阶操作详解:互补PWM输出 STM32 TIM可以输出管脚PWM信号适合多种场景使用,功能包括单线/非互补PWM输出,双线/互补PWM输出,以及死区时间和刹车控制等. 实际 ...

  7. STM32学习笔记(五 定时器及应用 3 PWM输出实验 )

    一.PWM 简介 脉冲宽度调制(PWM) Pulse Width Modulation (调制) 简单来说就是对脉冲宽度的控制. 高级定时器 TIM1 和 TIM8: 可以同时产生多达 7 路的 PW ...

  8. stm32 PWM输出学习

    STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.通用定时器也能同时产生多达 4路 ...

  9. STM32学习笔记:通用定时器输出PWM

    脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度.电机转速等. STM32 的定时 ...

最新文章

  1. 佐治亚理工学院硕士建议:2022年你应该掌握这些机器学习算法
  2. jquery选择器的一些处理
  3. C语言预处理命令总结
  4. OpenCR arduino problem list
  5. TUN/TAP设备浅析(二) -- TUN/TAP的编程
  6. 【HDU - 1757】A Simple Math Problem (矩阵快速幂)
  7. 内核中的竞争状态和互斥(简述)
  8. OpenShift 4 之Service Mesh教程(1)- 创建ServiceMesh环境,部署Istio的微服务
  9. c语言判断字符串合法标识符,HDU 2024 C语言合法标识符(以及一些关于输入和ctype.h的内容)...
  10. ant jmeter 优化报告
  11. 高校/中职大数据实验室建设方案
  12. zabbix监控华为USG6000防火墙
  13. 相机图像_基本知识储备
  14. dcos universe
  15. CAD标注:CAD软件中如何快速进行角度尺寸标注?
  16. logistic回归模型总结
  17. mp4转gif在线转换,视频转换成gif动图怎么做?
  18. windows 7下工行U盾证书密码框弹不出来--解决方案
  19. 软件测试周度目标,部门周度工作计划表(新)-
  20. 【GDUT】快乐地玩耍

热门文章

  1. 入职公司实习两周的一些感受
  2. 股票macd指标api接口
  3. 轻工大学c语言试卷,武汉轻工大学 期末C语言题库21
  4. golang websocket简单实现
  5. u盘不能从计算机辅助东西卷问题,U盘文件无法复制的原因分析及解决方法(图文详情)...
  6. GitHub Pages 绑定个人域名
  7. 【周赛】第一周周赛——欢迎16级的新同学题解(题目出自codeforces 318A,546A,431C,665E,HDU 4104)
  8. 华师大陈默老师的育儿讲
  9. MySQL中查询某年某月的数据
  10. C++中“非常量引用的初始值必须是左值”的处理方法