PWM--
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 个时钟周期。
结果: 重装载值:200 —— 这代表着舵机脉冲的总持续时间,设置为一个周期的时钟周期数。
比较值范围:
最小比较值:5 (代表 0.5 ms 的高电平宽度)
最大比较值:25 (代表 2.5 ms 的高电平宽度)
也可以简单理解,
编程
-- 这章我们来实现控制LCD的亮度调制
1、初始化函数(时钟、IO、外设、其他)
- 首先查看原理图
- 可知引脚为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
-- //可以查看固件库手册或者官方历程
这里我们看例程
//外设 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);
- 由这个图可知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,他们的区别为
-- 其他
//其它 //使能预加载寄存器 重装载值 比较值 如果这两个改变了,让设置的波形在下一个周期才会生效
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;
}
}
}
原文地址:https://blog.csdn.net/m0_71813740/article/details/142637429
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!