STM32使用PWM实现led亮度变化

这篇具有很好参考价值的文章主要介绍了STM32使用PWM实现led亮度变化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.序言

这里我以stm32F103c8te为例,讲解一下pwm如何输出,
pwm又是如何控制led灯的亮度变化,以及具体代码又是
如何是实现的。最后结语中也给出了一个小练习。

2.频率

首先我们搞清楚一个概念什么是频率。比如我们stm32F103的系统频率是72M
就是指1秒钟能产生的72M的脉冲(高电平或者低电平)次数。
而对于定时器的时钟频率,就是指定时器1秒钟产生的脉冲(低电平或者高电平)的次数。
所以频率越高,led灯就不容易闪烁(速度够快,肉眼察觉不到,感觉是一直亮着)。

3.占空比

什么是占空比?就是在一个周期内,高电平所占时间的比例。
比如周期是一秒,有600ms是高电平,400ms是低电平。
则占空比是60%(下图),而这个占空比起什么作用呢?
与频率有什么区别?就拿上述占空比举例,
如:高电平电压位3.3V 占空比是60%则平均电压是3.3乘于60%=1.96V。
可以用万用表测量。所以占空比实际上是影响输出电压大小的。
led灯的输入电压变小(电压不足),led灯自然就没那么亮了。
所以就在一定周期内,占空比越大,引脚输出的电压就越大。
STM32使用PWM实现led亮度变化

4.控制led亮度变化原理

有了上述二个概念,我们就能知道在一定频率下,修改占空比就能实现led亮度变化。

5.代码实例

这里我使用的是stm32F103c8T6定时器1的通道1,输出引脚为PA8。
这里我们用PA8输出PWM波控制led灯亮度变化。
如果是其他开发板,查询相关开发板原理图,找到对应的PWM输出引脚

5.1 初始化引脚

这里我使用的是c8t6的的通道1为PA8引脚。这里配置为复用推挽输出

#define ARR 900-1
#define CCR 300
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  
GPIO_InitTypeDef GPIO_InitStructure;
//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

5.2 配置定时器1

配置为80khz,向上计数。

    // 使能定时器1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
//72M/900=80KHZ,其实就是频率
TIM_TimeBaseStructure.TIM_Period = ARR; //设置为900-1
//设置用来作为TIMx时钟频率除数的预分频值,不分频
TIM_TimeBaseStructure.TIM_Prescaler =psc; 	
//设置时钟分割:不分割
TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
//TIM向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 

5.3配置输出PWM

配置输出占空比为1/3的pwm波

TIM_OCInitTypeDef  TIM_OCInitStructure;
/*选择定时器模式:TIM脉冲宽度调制模式1
PWM1 其实就是计数值小于CCR的值就输出有效电平,
下面第四句话设置了有效电平是高电平
所以小于CCR的值就输出高电平.*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_Pulse = 0; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = CCR;//设置CCR的值为300
//所以占空比为CCR/ARR= 300/900=1/3 电压就是3.3 乘于 1/3=1.1V
    
//根据TIM_OCInitStruct中指定的参数初始化外设TIM1通道1
TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能	
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能	 
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE);  //使能TIM1
//我们可以通过 TIM_SetCompare1(TIM1,CCR);重新设置CCR的大小改变占空比
}

6.结语

我们的功能到这里已经实现了,我们可以在需要修改占空比的地方调用 TIM_SetCompare1(TIM1,CCR)函数
修改占空比,改变led灯亮度。最后你们学会了吗?自己也可以动手做个小实验。
比如使用PWM修改风扇的风速大小。快动手去试一试吧!文章来源地址https://www.toymoban.com/news/detail-483408.html

到了这里,关于STM32使用PWM实现led亮度变化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32自学☞PWM驱动LED呼吸灯

    常用函数简单说明 ①用来配置输出比较模块  TIM_OC1Init()     (初始化)             TIM_OC2Init()                               TIM_OC3Init()                               TIM_OC4Init() ②TIM_OCStructInit();用来给输出比较结构体赋一个默认值 ③用来配置强制输出模式  TIM

    2024年02月19日
    浏览(36)
  • stm32——pwm驱动LED灯、舵机、直流电机

    改为PA15,选择重映射方式1或完全重映射 在时钟开启后写入 PWM频率=计数器更新频率 比如要产生一个频率为1KHz,占空比为50%,分辨率为1%的PWM波形 72M/(PSC+1)/ (ARR+1)=1000 CCR/(ARR+1)=0.5 1/(ARR+1)=0.01 计算得:ARR=99,CCR=50, PSC=720-1; 常用模式为 PWM1模式1 PWM.c PWM.h main.c 参数计算 PWM.c Servo.

    2024年02月04日
    浏览(41)
  • matlab读取pwm波数据,不用timer的方法,这里可以参考。Matlab/Simulink之STM32开发-编码器测速

    这里提供了一个不用timer的方法,可以参考: https://blog.csdn.net/weixin_36967309/article/details/88699830 Matlab/Simulink之STM32开发-编码器测速

    2024年01月18日
    浏览(54)
  • 10、江科大stm32视频学习笔记——PWM驱动led呼吸灯、驱动舵机、驱动直流机

    目录 一、PWM驱动LED呼吸灯(灯接在PA0) 1、PWM波和GPIO的对应关系参考引脚定义表 2、计数器的计算 3、TIM输出PWM波使用步骤​编辑 4、代码 (1)输出化比较单元 (2) PWM.c (3)main.c 5、重映射更换成PA15亮灯 二、PWM驱动舵机(舵机接在PA1、按键在PB1)  1、电路图 2、参数计算

    2024年02月14日
    浏览(38)
  • 通过STM32使用PWM实现的RGB调光

    最近看看,买的器材发现还有一个RGB灯,想了一下发现可以用PWM来实现一个RGB的调光 首先就是PWM,PWM就是脉冲调制,是一种控制信号的占空比,是指在一秒内,信号从高电平到低电平在回到高电平的次数表示为一个周期。 下面就是PWM配置的代码 通过上述代码配置好当前的

    2024年04月22日
    浏览(70)
  • STM32 HAL库 通用定时器介绍及相关应用例程 定时器中断 输出PWM (点亮LED呼吸灯、输出PWM、输入捕获) CubeMX

    (部分图引自于ATK) 前情提要(基本定时器) 点此进入 通用定时器类别 通用定时器和基本定时器相比大致的工作方式是相似的,不过通用定时器比基本定时器多了一些很好用的功能,比如: 外部输入捕获 输出比较 输出PWM 时钟源 CubeMX为我们提供了配置时钟的非常方便的工

    2024年04月15日
    浏览(81)
  • 使用STM32和C51实现LED闪烁(仿真+程序)

    1、新建程序(如下图) 先点击project,在单击new uvision project。 2.命名文件 3.生成main文件 (右键source group再点击Add new item…) 点击c File (.c) 4.在main.c项目中输入以下代码 5.生成 .hex 文件 魔术棒- Output - 勾选Create HEX File - ok 1.上传.hex文件到proteus 双击芯片在program file 中选择刚刚

    2024年02月04日
    浏览(40)
  • STM32F103RCT6开发板M3单片机教程07-TIMER1CH1输出 PWM做LED呼吸灯

    本教程使用是( 光明谷SUN_STM32mini开发板 )   免费开发板   在谷动谷力社区注册用户,打卡,发帖求助都可以获取积分,当然最主要是发原创应用文档奖励更多积分. (可用积分换取,真的不用钱,开发板免费玩):STM32F103RCT6开发板M3单片机核芯小系统板学习板 ... 已经购买用

    2024年02月22日
    浏览(65)
  • STM32使用PWM

    1.定义:PWM,就是脉冲宽度调制,也就是占空比可变的脉冲波形。 2.适用条件:PWM所应用的场景必须为惯性系统,像led,当立即变为低电平时,led并不会瞬间熄灭,而是具有惯性,在短时间内为逐渐熄灭。 3.应用:智能车,机器人等项目。呼吸灯、驱动电机等。 频率为Ts的倒

    2024年02月09日
    浏览(38)
  • (STM32基础)STM32实现LED闪烁&LED流水灯&蜂鸣器

    1、按照新建工程步骤创建工程,新建start、library、user三个文件夹,从固件库添加相应文件 2、keilkil小程序用来清理listings和objects文件夹中编译产生的中间文件,以后需要打包工程的话可以先用keilkill先清理,这样文件夹会大大缩小所占内存。 在library中可以查看外设函数库,

    2024年02月07日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包