首页 > 其他分享 >PWM--

PWM--

时间:2024-09-29 15:48:31浏览次数:11  
标签:周期 -- TIM GPIO PWM 时钟

PWM

目录

PWM

pwm在电子行业的作用

pwm的参数

编程

1、初始化函数(时钟、IO、外设、其他)

- 初始化时钟,PB2,TIM3

- 初始化IO -- 这里用输出

- 外设 -- 配置定时器和pwm

-- 其他

2、应用 -主函数


-- 什么是PWM?

​脉冲宽度调制(PWM),简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

详解PWM原理、频率与占空比

在STM32中,PWM功能常用于控制电机速度、调节LED亮度、产生音频信号等应用。通过调整PWM的占空比(高电平时间占总周期的比例),可以控制输出信号的平均电压或功率。例如,如果PWM信号的占空比为50%,即高电平时间等于总周期的一半,那么输出信号的平均电压或功率也将为输入电压或功率的一半。

pwm在电子行业的作用

PWM 在电子行业的作用
PWM 波:具有一定频率,其(占空比)高电平可以调节的波。
占空比:高电平所占整个周期的比例
PWM 波是一种自然现象。
通过 PWM 波改变设备一定时间内的做功。 -- 调节电机转速、改变直流电压。

pwm的参数

-- 周期

高低电平变化所需要的时间,单位:ms
T=1/f T是周期,f是频率。

-- 频率

在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。
例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。

-- 占空比

在一个脉冲周期内,高电平的时间占整个周期时间的比例,单位是% (0%-100%)。

-- 例题:

舵机的频率一般为频率为 50HZ,也就是一个 20ms 左右的时基脉冲, 而脉冲的高电平部分一般为 0.5ms-2.5ms 范围。如果时钟频率为10000hz,那么重装载值和比较值为多少?

答:
首先来解释时钟频率的含义:这是一个系统或设备中时钟信号的频率,影响每个时钟周期的时长。在这个例子中,时钟频率为 10000 Hz,意味着每秒有 10000 个时钟周期。
计算时钟周期的公式是:T=1/时钟频率,在这个例子中,T=1/10000=0.0001 秒,即每个时钟周期是0.1ms。
计算整个舵机脉冲周期对应的时钟周期数:
舵机周期为 20 ms,因此可以转换为时钟周期数:
舵机周期对应的时钟周期数 = 舵机周期/ 时钟周期 = 20ms/0.1ms = 200
这说明整个舵机信号的持续时间需要 200 个时钟周期。

alt text

结果: 重装载值:200 —— 这代表着舵机脉冲的总持续时间,设置为一个周期的时钟周期数。
比较值范围:
最小比较值:5 (代表 0.5 ms 的高电平宽度)
最大比较值:25 (代表 2.5 ms 的高电平宽度)

也可以简单理解, 

alt text

编程

-- 这章我们来实现控制LCD的亮度调制

1、初始化函数(时钟、IO、外设、其他)

  • 首先查看原理图

alt text

alt text

  • 可知引脚为PB0
- 初始化时钟,PB2,TIM3

-- 这里为什么不用tim8,用tim3的原因是,tim8是高级定时器,需要用到高级定时器时钟,而tim3是通用定时器,需要用到通用定时器时钟,通用定时器时钟是APB1,所以这里我们用tim3。

//时钟 B TIM3
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- 初始化IO -- 这里用输出
//IO  
	GPIO_InitTypeDef GPIO_InitStructure = {0};						//定义结构体变量,并且将结构体变量赋初值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 						//引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//速度
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);
- 外设 -- 配置定时器和pwm

-- //可以查看固件库手册或者官方历程

这里我们看例程 

alt text

alt text

    //外设 tim时钟频率:72M
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure  = {0};
	TIM_TimeBaseStructure.TIM_Period = 999;											//重装载值//设置为1000的话,就填999(要-1)
    TIM_TimeBaseStructure.TIM_Prescaler = 71;				//分频值 		//进行72分频,就写71,是从0-71
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;								//时钟分频因子//默认写0,跟输入有关,暂时不用管
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数方式
        //周期是1ms,频率是1000

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

alt text

  • 由这个图可知tim的时钟频率为72M

-- 这里我们设置为72分频(设置成多少根据实际情况),注意这里要写成71,因为是从0-71。那么72M经过72分频后变为1Mhz,1s计数1000000次。那么1ms计数1000次(就是重装载值),那么1ms就是1000次计数,那么1000-1就是999。
1ms计数到重装载值,那么周期就是1ms

  • 外设除了定时器还有pwm
    //pwm配置
	TIM_OCInitTypeDef  TIM_OCInitStructure = {0};
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;							//输出模式配置 					//PWM1和pwm2的高低电平相反,但是其他都是一样的,占空比或者
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出状态使能
    TIM_OCInitStructure.TIM_Pulse = 0;														//比较值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;			//输出极性(有效电平)							//(这里是为高(有效电平))//当计数值低于比较值时,(输出有效电平)输出高电平。高于比较直时,输出无效电平//pwm2与pwm1相反

    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
        
	
	TIM_Cmd(TIM3, ENABLE);//外设使能
  • pwm有pwm1和pwm2,他们的区别为 

    alt text

-- 其他
	//其它  //使能预加载寄存器 重装载值 比较值 如果这两个改变了,让设置的波形在下一个周期才会生效
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_ARRPreloadConfig(TIM3, ENABLE);

2、应用 -主函数

-- 通过按键1让LCD的屏幕逐渐越来越亮

    pwm_init();
	
	uint16_t b=100;
	while(1)
	{
			if(keytime>=50)//50ms执行一次
			{
				keytime=0;
				keyflag = get_key();
				switch(keyflag)
				{
					case 1: b+=100;
					if(b>=1000)
					{
						b=0;
					}
					TIM_SetCompare3(TIM3, b); break;
					case 2:  break;
				}
			}
    }

标签:周期,--,TIM,GPIO,PWM,时钟
From: https://blog.csdn.net/m0_71813740/article/details/142637429

相关文章

  • DHT11
    DHT11前面一直在讲串口类设备,今天讲IO类设备,不同的接口方式目录DHT11查资料文档的梳理代码编写初始化(时钟、IO、其他)单总线的读取流程1、主机发送复位信号2、DHT11响应信号3、数据传输4、校验数据5、数据获取main.c补充:stlink有个调试的功能-tip:可以适当的总......
  • vscode监听代码变动重启node
    在VisualStudioCode(VSCode)中,可以使用nodemon来监听代码的变动并自动重启Node.js服务器。nodemon是一个工具,它可以监控文件的变化并在检测到变化时自动重启Node.js应用程序。安装nodemon你需要在项目中安装nodemon,可以使用npm全局安装或者将其作为开发依赖安装......
  • - 串口通信
    USART串口通信目录USART串口通信回顾USART串口通信1、通信分类与作用2、串口通信的相关参数(重点)3、位协议层--RS232协议4、STM32F103中的串口外设5、调试串口编程--(1)串口初始化:时钟、IO、外设--(2)串口发送--(3)串口接收--补充--应用6、中断usart.c完整代......
  • LightDB rownum使用示例及性能测试
    如下所示:lightdb@oradb=#explainanalyzeselect*from(selecta.*,rownumrnfrom(select*fromv,v1wherev.id=v1.idandnotexists(select1fromtwhereid<>v.id)andv1.id<>'31'orderbyv1.id)awhererownum<100000+1000)whe......
  • 【Qt笔记】QFrame控件详解
    目录引言一、QFrame的基本特性二、QFrame的常用方法2.1边框形状(FrameShape)2.2阴影样式(FrameShadow)2.3线条宽度(LineWidth)2.4 样式表(styleSheet)三、QFrame的应用场景四、应用示例 4.1代码4.2实现效果4.3代码解析与注意事项代码解析注意事项结语......
  • 无法访问你试图使用的功能所在的网络位置
    问题如标题,被这个问题搞吐了。报错如下如: 起因是公司的产品有些周边工具,在分析和排查问题的过程中,遇到上图这个问题,因为要反复卸载和重装,还涉及到不同版本,最后玩坏了。卸载以后,Windows-应用、geek.exe等工具都看不到这个程序了,可就是安装不了。如下......
  • Python基于自定义方法的排序
    Python基于自定义方法的排序在Python中,排序是一个常见的任务,它可以帮助我们根据特定的规则对数据结构(如列表)中的元素进行排序。Python的内置排序方法,如列表的sort()函数和内置函数sorted(),提供了非常灵活的排序机制,特别是通过key参数,我们可以指定一个自定义的函数来决定排序的顺......
  • C语言 17 宏定义
    前面认识了#include指令,接着来看#define指令,它可以实现宏定义。宏是啥意思?把参数批量替换到文本中,这种实现通常称为宏(macro)或定义宏(definemacro)可以通过#define来定义宏,规则如下:#define宏名(记号)内容比如现在想通过宏定义一个PI:#definePI3.1415926这样就可以......
  • C语言 18 条件编译
    再来看看条件编译,还可以根据条件,选择性地对某些内容进行忽略。来认识一下#ifdef、#else、#endif这三种条件编译指令:#include<stdio.h>//ifdef用于判断是否定义了符号PI,如果没有的话则处理以下的指令#ifdefPI#defineM666//如果定义了符号PI,那么就处理这个分支的语......
  • hash冲突解决
     解决方法:拉链法,又称为链地址法其基本思想是将所有具有相同哈希值的元素链接在一起,形成一个链表。 解决方法:开放地址--线性探测法https://www.cnblogs.com/-beyond/p/7726347.html关注点:1、hash冲突元素的插入2、已有元素的删除和同hash值元素的移动3、扩容 1、插入......