系列文章目录

第一章 PWM调节

第二章 ADC采样

第三章 光敏传感器

第四章 智能灯光亮度调节器(终)


目录

前言

一、PWM是什么?

二、如何产生一个PWM信号?

总结


前言

本文实现的是一个智能灯光亮度调节器的设计,使用STM32F103ZE的单片机,可以手动调节灯光档位,也可以自动根据环境亮度进行切换灯光档位。这需要用到PWM调光、ADC采集、光敏传感器,本文将会将设计路线呈现出来。


提示:以下是本篇文章正文内容,下面案例可供参考

一、PWM是什么?

我们要调节板子上的LED灯光档位,需要用到PWM(Pulse Width Modulation),全称是脉冲宽度调制,使用PWM时,我们需要关注一下两个参数:
(1)PWM占空比

PWM信号的占空比指该PWM信号的一个周期中高电平所占时间的百分比,若信号始终是高电平,则该信号的占空比为100%,反之若信号始终是低电平,则该信号的占空比为0%,如下图所示,T是整个PWM周期,T1代表占空比:

 (2)PWM频率

PWM信号频率有多快,决定了PWM信号走完一个周期的速度。

二、如何产生一个PWM信号?

我们了解完PWM大概是个什么东西后,就要学习如何产生它和使用它。通过STM32的单片机,我们有两个方式去产生PWM信号,第一种是使用普通IO输出PWM,第二种是使用定时器的PWM的IO口:

(1)普通IO口

我们可以翻看手册去看普通IO口的主要功能:(下图转载自其他博主),如果这个IO口的主要功能那一栏出现CHx的标志,则是可以输出PWM的端口,上面的红框中的普就是普通定时器。

 (2)PWM端口

STM32的定时器除了TIM6、TIM7,其他的定时器都可以用来产生PWM,高级定时器TIM1与TIM8可同时产生7路的PWM,通用定时器则可以同时产生4路的PWM输出。

 (3)普通IO产生PWM方法

我们使用的是定时器中断去实现的,PWM的产生,我们需要去确定两个参数:周期占空比,而如何确定周期呢,我们知道T=1/f,所以只要把频率确定下来,周期就知道啦。而我们确定了时间后,占空比就是这个这段时间中高电平所占的时间的百分比就是我们想要的占空比啦。

例如,我们现在要去产生一个1KHz的占空比为50%的PWM,我们知道了频率为1KHz,那么周期根据T=1/f,就可以知道T=1ms,那么一个周期就是1ms。那占空比为50%,说明在一个1ms的周期中高电平所占的时间为0.5ms。那我们使用定时器中断,每0.1ms产生一次中断,每次进入中断时计数,中断服务函数前五次中断给高电平就可以实现占空比50%。

(4)PWM口产生PWM

我们使用PWM口时需要先了解一下相关的定时器:ARR、PSC、CNT、CR1

自动重装载寄存器ARR:

该寄存器用于配置自动重装载值ARR

预分频寄存器PSC:

该寄存器用于配置预分频系数

计数器CNT:

该寄存器用于配置计数值

控制寄存器CR1:

根据控制寄存器位4的设定,分为两种计数模式:

了解完上面的寄存器后,我们开始学习产生PWM的过程:举例一种情况,定时器的重装载值为ARR,比较值为CCR,每次计数时,都会将CNT计数值与CCR进行比较,若计数值CNT小于CCR,则输出低电平,若计数值CNT大于CCR,则输出高电平,那么这时占空比就是可以通过调整CCR的值去改变,而PWM的频率就可以通过调整ARR与PSC去调整。我们的配置过程为:

①初始化TIMx,设置TIMx的ARRPSC。

②设置TIMx_CHx的PWM模式使能TIMx的CHx输出。

使能TIMx

④修改TIMx_CCRx来控制占空比。

timer.c:

//TIM3 PWM 部分初始化
//PWM 输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //①使能定时器 3 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_AFIO, ENABLE); //①使能 GPIO 和 AFIO 复用功能时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //②重映射 TIM3_CH2->PB5
//设置该引脚为复用输出功能,输出 TIM3 CH2 的 PWM 脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //①初始化 GPIO
//初始化 TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在自动重装载周期值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //③初始化 TIMx
//初始化 TIM3 Channel2 PWM 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //④初始化外设 TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器
TIM_Cmd(TIM3, ENABLE); //⑤使能 TIM3
}

mian.c:

int main(void)
{TIM3_PWM_Init(899,0);while(1){...}
}

总结

以上是PWM的学习与产生过程,后面的文章会说明如何使用PWM调节灯光档位,下面给一个正点原子的例程,是一个呼吸灯,可以烧录进自己的板子上看看,让自己更好的理解PWM的用处。

链接:https://pan.baidu.com/s/1UkNmRrqFlHx0dCuAHHDfRA?pwd=hxdg 
提取码:hxdg

基于STM32的智能灯光亮度调节器【正点原子】(一)相关推荐

  1. 毕业/课程设计——基于STM32的智能灯光控制系统(物联网、智能家居、手机APP控制、语音控制)

    文章首先介绍本系统所包含的功能,主要包含六方面功能,之后逐步分享开发过程,其流程如下:点亮灯带(三极管)→调节灯光亮度(PWM)→为系统添加远程控制功能→为系统添加语音识别功能→添加超声波姿态监测功能 ...

  2. 基于STM32的“智能家居”课程设计

    基于STM32的"智能家居系统"课程设计 此设计是基于STM32F407单片机的智能家居系统,具体完成要求如下: 基于蓝牙的智能家居系统设计 设计一个基于蓝牙/Wifi的智能家居控 ...

  3. 基于STM32的智能万年历设计

    [ps:该文章排版有点错乱,如果需要,有PDF版本和WORD版本可供下载观看,还有资源免费下载,请移步作者主页下载,仅供学习参考.该设计是学校要求的课程设计,也是第一次做,很多函数并没有进行封装,部分 ...

  4. 【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机

    文章目录 1 简介 2 绪论 2.1 项目背景 2.2 需求分析 3 系统设计 3.1 功能设计 3.1.1 系统角色分析 3.1.2 开发环境 3.2 总体设计 3.3 硬件部分 3.3.1 整体架 ...

  5. 基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI)

    基于STM32+ESP8266的智能行车辅助系统 基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI),这是一个课程设 ...

  6. 基于stm32的智能药盒

    提示:记录毕设 文章目录 前言 一.任务书 1.1设计(研究)目标: 1.2设计(研究)内容: 二.框架思路 三.硬件及代码 四.相关功能介绍 五.交流联系 六.喜欢请点赞哦! 前言 基于STM32的 ...

  7. 基于stm32的智能家居项目

    基于stm32的智能家居 具体教程可以看文中的B站链接,上面有手把手教程 本人其他项目链接基于linux的智能仓储项目 基于Qt的人脸识别 移植人脸识别到Linux开发板上 基于正点原子的IMX6UL ...

  8. 基于STM32的智能鞋柜设计与实现--“臭臭没了”

    Hello,大家好,我是阿金,本文仅供参考,提供一些建议.如有不对,还请指正.谢谢~ 随着5G网络的迅速普及,"万物联网"的时代指日可待.针对传统鞋柜及目前市场上现有的智能鞋柜功能 ...

  9. 基于ARM的智能灯光控制系统-----需求分析

    基于ARM的智能灯光控制系统-----需求分析 项目实践流程: 1.设计项目需求文档 说明项目设计目的,项目功能,项目模块,实现技术. 2.项目编码设计 程序要求模块结构化(函数),编码风格良好,多文 ...

最新文章

  1. 零基础入门学习Python(32)-丰富的else语句及简洁的with语句
  2. 各类Transformer都得稍逊一筹,LV-ViT:探索多个用于提升ViT性能的高效Trick
  3. SharePoint 2013 Designer 自己定义操作菜单
  4. 惜缘-致家乡的一位女孩[原创]
  5. LeetCode 674. Longest Continuous Increasing Subsequence
  6. 【Elasticsearch】Elasticsearch 相关度评分 TFIDF
  7. android学习笔记---46视频刻录的实现,视频录像器。
  8. pycharm安装后,找不到Python解释器怎么办
  9. KTable的设置单元格属性
  10. 《单细胞生物》教学反思
  11. 百万级别长连接,并发测试指南
  12. 222Beta多样性限制性排序CPCoA/CCA/RDA/LDA
  13. android win7 共享网络打印机,win7设置局域网共享打印机
  14. 动态规划基础之挖金矿问题
  15. 华为交换机S5720-EI堆叠
  16. 数字IC后端需要学习什么?需要具备哪些技能?
  17. 人工智能与深度神经网络,人工智能深度神经网络
  18. 安装zsh 、omyzsh
  19. vb6.0 清除IE浏览器缓存
  20. 基于jacoco插件,使用python脚本分析java项目测试覆盖率。

热门文章

  1. 编译Android7.0.1系统时,一般的电脑内存不足的解决办法
  2. cannot find symbol
  3. Excel表格中设置数据的有效性
  4. java启动脚本指定jdk_使用指定的JDK启动IDEA的三种方法
  5. 网络音乐收费陷迷途 服务质量成埋单难题
  6. 销售开发新客户的渠道
  7. linux internet的图标找不到了,桌面internet图标不见了的五种解决方法
  8. 浏览器中的主页图标不见了
  9. NBA历史连胜记录和连胜记录及不可超越的记录
  10. vs发布exe文件给别人打开闪退问题