概述:

这里我们来了解一下何为PWM,PWM是Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式。

在实际项目应用中最常见的有 使用PWM驱动舵机转动到固定的角度 或是 通过PWM调节直流电机实得到想要的转速 ,还有我们常见大多设备上的呼吸灯

我们生产PWM有常见的两种的方法,分别是:(1)定时器中断变量累加比较、(2)定时器自身的3个寄存器通过通道输出PWM。

这里我用常见的呼吸灯项目来为大家讲解如何用 定时器自身的3个寄存器通过通道输出PWM。

硬件介绍:

主控板采用的是:STM32F103C8T6

呼吸灯这里采用LED小灯珠,因为该主控芯片的IO输出电压只用3.3V,所以无需加装电阻;

软件部分:

1.寄存器:

在编写软件前,我们先来了解一些重要的东西。在stm32f103c8t6中一共有4个定时器,其中TIM1为高级定时器。这里我使用是TIM4_CH2作为PWM比较输出通道;

我们这里用到的6个寄存器分别为:

(1)TIMx_ARR:自动装载 寄存器

(2)TIMx_CNT:计数器 寄存器

(3)TIMx_PSC:预分频器 寄存器

(4)TIMX_CCR1~4:通道1~4 捕获/比较 寄存器

(5)TIMx_CCER: 捕获/比较使能寄存器(设置输出/输入模式)

(6)TIMx_CCMR1/2: 捕获/比较模式寄存器(设置输入/输出通道为1,2/3,4)

这些寄存器中有3个寄存器带有影子寄存器,他们分别是:

(1)TIMx_PSC:由于该控制寄存器具有缓冲功能,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件发生时被采用。

(2)TIMx_ARR:预装载寄存器的内容既可以直接传送到影子寄存器,也可以在每次发生更新事件(UEV)时传送到影子寄存器,这取决于TIMx_CR1 寄存器中的自动重载预装载使能位(ARPE)。也就是TIMx_CR1的ARPE位决定了预装寄存器数据传入影子寄存器的时间先后顺序。

(3)TIMX_CCR1~4:通过软件将TIMx_CR1寄存器中的UDIS位置1可禁止更新事件UEV事件。这可避免向预装载寄存器写入新值时更新影子寄存器。也就是TIMx_CR1寄存器中UDIS位间接决定了预装寄存器数据是否传入影子寄存器。

如果想具体了解可以参考:STM32 影子寄存器 - 知乎 (zhihu.com)

PWM信号产生过程:

初始化时,我们先对 TIMx_ARR(自动装载 寄存器)TIMx_PSC(预分频器 寄存器) 和 TIMX_CCR2(通道2 捕获/比较 寄存器)、TIMx_CCER(捕获/比较使能寄存器) 、TIMx_CCMR1 (捕获/比较模式寄存器)进行配置,然后对定时器进行使能。这时TIMx_CNT(计数器 寄存器)开始工作,TIMx_PSC(预分频器 寄存器)、 TIMx_ARR(自动装载 寄存器)和 TIMx_CCMR1 (捕获/比较模式寄存器)将 预装载的数值 拷贝到他们各自的 影子寄存器中,当计数值(CNT)大于或等于TIMX_CCR2(通道2 捕获/比较 寄存器)中的比较数值时,IO口输出有效电平,当计数值(CNT)等于TIMx_ARR 预装载数值时计数值(CNT)被清0,产生更新事件(UVE);进入下一次定时器计数的次循环,产生的波形近似为正弦波,实现过程如下图所示:

代码部分

PWM.C

#include "PWM.h"void TIM4_PWM_Init(u16 arr,u16 psc)          //初始化 定时器4_PWM
{//宏定义 配置GPIO_InitTypeDef TIM4_PWM_Pin;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM4_OCInitStructure;//时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);  //使能定时器4时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能GPIO外设功能模块时钟//配置PWM输出IO口TIM4_PWM_Pin.GPIO_Mode = GPIO_Mode_AF_PP;             //功能模式:复用推挽输出TIM4_PWM_Pin.GPIO_Pin = GPIO_Pin_7;                     //IO管脚号:7TIM4_PWM_Pin.GPIO_Speed = GPIO_Speed_50MHz;             //传输速度:50MGPIO_Init(GPIOB,&TIM4_PWM_Pin);//初始化TIM4TIM_TimeBaseStructure.TIM_Period = arr - 1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc - 1; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化TIM4_CH2  PWM模式   TIM4_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM4_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM4_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低TIM_OC2Init(TIM4, &TIM4_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM4在CCR2上的预装载寄存器TIM_Cmd(TIM4, ENABLE);  //使能TIM4
}

注意:这里我们使用定时器4 为 IO口输出PWM,该功能是 IO口的复用功能,所以我这里的IO口模式设置为了 复用推挽输出,但是这里我没有使用 重映射管脚,所以没有使能 端口映射功能时钟如果你使用了重映射端口,就要使能该时钟。

PWM.H

#ifndef __PWM_H
#define __PWM_H#include "stm32f10x.h"
#include "stm32f10x_tim.h"void TIM4_PWM_Init(u16 arr,u16 psc);          //初始化 定时器4_PWM#endif

main.c

#include "stm32f10x.h"
#include "PWM.h"u8 dir=1;
u16 led0pwmval=0;int main(void)
{SystemInit();          // 配置系统时钟为72M   TIM4_PWM_Init(100,720);while(1){delay_ms(10);    if(dir)led0pwmval++;else led0pwmval--;if(led0pwmval>300)dir=0;if(led0pwmval==0)dir=1;                                        TIM_SetCompare2(TIM4,led0pwmval);}
}

实测可用,展示如下:

VID20220618190053

STM32F103C8T6定时器产生PWM相关推荐

  1. STM32F103C8T6定时器实现led的周期闪烁及PWM实现流水灯

    目录 一.问题描述 (一)定时器实现LED灯的周期闪烁 (二)输出PWM波形实现流水灯 二.定时器实现LED灯的周期闪烁 (一)STM32定时器介绍 1.简介 2.定时器分类 2.1基本定时器 2.2 ...

  2. STM32F103C8T6脉冲宽度调制(PWM)

    关于STM32F103C8T6工程文件自己免积分下载https://download.csdn.net/download/weixin_45488643/12522971这个仅仅是一个核心工程文件,只 ...

  3. STM32f103C8定时器输出PWM波信号

    利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...

  4. atmega8 例程:T1定时器 快速PWM

    /***************************************************************** * 函数库说明:ATMEGE8 T1定时器 快速PWM * 版本: ...

  5. 利用 51 定时器生成 PWM

    利用 51 定时器生成 PWM 1 PWM 简介 PWM(Pulse Width Modulation,脉冲宽度调制)是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式. 在控制系统 ...

  6. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  7. STM32通用定时器输出PWM

    1 .TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时器预分 ...

  8. stm32F051系列 单片机引脚定时器输出pwm波形控制风扇转速

    概述:stm32的每个引脚都有其自带的特殊功能,有定时器输出功能的引脚可以输出pwm.如果没有的也可以io口模拟输出,如果非要较真的话,理论上可以算是每个引脚都能输出PWM,但一般我们都使用带定时器输 ...

  9. NXP JN5169使用定时器进行PWM输出和定时功能

    NXP JN5169使用定时器进行PWM输出和定时功能 一.定时器介绍 1.定时器介绍 2.定时器可操作的模式 3.定时器DIO 4.定时器和PWM模式 5.定时器中断 二.实现代码 1.PWM输出 ...

最新文章

  1. 关于jsp基础知识题目(一)
  2. JS+库+框架+工具
  3. Java深度历险(五)——Java泛型
  4. 【技术综述】基于弱监督深度学习的图像分割方法综述
  5. 聚焦2020年财报:进击的恒大汽车,“变态”的智能汽车
  6. Java hibernate假外键_java – Hibernate:没有实体类的外键,只能通过id
  7. IOS之代理文字点击变大变小
  8. Python可变传参: *args和**kwargs
  9. C++_类和对象_C++继承_多继承语法---C++语言工作笔记067
  10. NYOJ101 - 两点距离
  11. python_三目运算
  12. 省选专练HAOI2015树上操作
  13. 用jquery怎么删除table的一行
  14. paip.python错误解决9
  15. netstat 的10个基本用法
  16. 【010 Editor】010 Editor安装教程
  17. 在网址前加神秘字母,让你打开新世界
  18. 软件测试工程师的自我认识和定位!!
  19. 杜撰的柏拉图(转自李止介的个人空间)
  20. AM335x片上ecap驱动移植

热门文章

  1. 夫妻给一周岁女儿喂农药后双双自杀
  2. switch vba_VBA switch
  3. CCF系列题解--2015年3月第三题 节日
  4. idea弹窗 Placing the unmodified important.txt in the zip file with the agent jar in the same directo
  5. Android 4.4 KitKat 支持 u 盘功能
  6. 无法打开包括文件: “ocl_macros.h”: No such file or directory
  7. 解决电脑软件可以上网,但是浏览器无法上网的问题
  8. python库-collections模块Counter类
  9. 钉钉开发之使用HTTP请求获取你的公网出口IP
  10. PDF417美国驾照条形码信息自动识别