PWM实现线性调光

2023-11-09

1.PWM调光原理

PWM全称为脉宽调制技术,是通过高精度的计数器对方波的占空比进行编码。

就是这个东西,其实很好理解,高电平的时候才会做功,低电平的时候肯定不亮啊,PWM就是调制高电平的占比。(其实一般是低电平才有效,因为会外接一个12V的电源,这么说是方便理解)

2. 线性变化描述

举个例子,假如你洗澡要用1吨水,你不可能1秒钟把这一吨水全部倒下来把。光变化也是这样,一下子变过来你眼睛受不了。所以要在规定时间内,尽量均匀的变化,保证在规定时间内完成变化,又要保证变化的过程尽量平缓,斜率尽量固定或者变化不大。

3. 光调制原理

知道彩虹不,这世界其实只有三种颜色,红绿蓝,学美术的应该知道,这三种颜色可以组合出各种不同的颜色。所以通过控制R(红色),G(绿色),B(蓝色)(red,green,blue的缩写)这三种LED的亮度就可以产生理论上你想要的任何颜色。

有个类似这种的表,网上能查到

4. 线性变化算法描述

设置过渡时间的信号从LIN总线过来,值的范围是0~255(8位数据,相当于unsigned char),单位是20ms,我把这个值设为 time。

LIN总线上还会传入需要设置的R,G,B三种颜色的值,也是8位的,我用到的PWM寄存器的大小也是八位。设置需要变化的大小为val。分析以下几种情况:

  1. time >val ; 也就是说单位时间变化1个值就可以在规定时间完成。多余的时间无所谓的

  1. time < val; 就是说单位时间需要变化多个值。我们把单位时间需要变化的值叫做步径,如果变化1个值其实就是步径为1,设步径为step

  1. 2*time>val; 步径为2

  1. 。。。

  1. step*time>val;步径为step ,这个过程可以用for循环来实现。

我们可以设置一个20ms的中断,在中断中让PWM的值增加步径,就可以完成LED灯的线性变化啦。

5. 代码

5.1 计算步径

//计算PWM步径
//捎带判断了转换时间
void PWM_Calculate_Step()
{
    //如果 要设置的RGB和PWM的值不相等,则需要线性变为需要设置的值
    //这部分根据时间设置PWM的线性变化
    /*
     * 变化值和过渡时间都是一个八位的寄存器
     * 设变化值为V
     * 过渡时间为T
     * 如果 V<T   单位时间变化一个值就来得及
     * 如果 V>T   单位时间需要变化多个值,就需要算出步径
     * */
     //应该在中断里面设置进入 ,退出 中断的条件  也就是 要设置的PWM值和当前值 不相等       在中断服务子程序里面设置退出条件
     //
         if((TargetTransitionTime != 0)&& ((BnIngrd)||(GrnIngrd)||(RedIngrd)))         //如果转换时间不为0,且氛围灯RGB不全为0     不一定这么写啊
         {
             if(BnIngrd != PWM22H)
              {
                 uint8 B_Difference_Value;        //变化值  这个是绝对值
                 //uint8 B_Step;//Step
                 uint8 i_B = 0;                    //for循环变量,注意要从1开始
                 //uint8 B_Temp;                //暂存变化值
                 //uint8 Forward_or_Back_Flag_B;    //正向或逆向变化标志位    1: 正向  0:逆向


                 if(BnIngrd > PWM22H)            //当前值 大于 前面值  要正向调整
                 {
                     B_Difference_Value = BnIngrd - PWM22H;
                     Forward_or_Back_Flag_B = 1;    //正向
                 }
                 else//(BnIngrd < PWM22H)
                 {
                     B_Difference_Value = PWM22H - BnIngrd;
                     Forward_or_Back_Flag_B = 0;    //逆向
                 }
                 //B_Temp = B_Difference_Value;
                 for(;((i_B)*(TargetTransitionTime)) < B_Difference_Value; i_B++)
                 {
                     B_Step = i_B;
                 }
                 B_Step = i_B;
               }
              if(GrnIngrd != PWM12L)
              {
                  uint8 G_Difference_Value;    //变化值  绝对值
                 //uint8 G_Step;
                 uint8 i_G = 0;
                 //uint8 Forward_or_Back_Flag_B;
                 if(GrnIngrd > PWM12L)
                 {
                    G_Difference_Value = GrnIngrd - PWM12L;
                    Forward_or_Back_Flag_G = 1;
                 }
                 else
                 {
                    G_Difference_Value = PWM12L - GrnIngrd;
                    Forward_or_Back_Flag_G = 0;
                 }
                 for(;((TargetTransitionTime)*(i_G)) < G_Difference_Value;i_G++)
                 {
                    G_Step = i_G;
                 }
                G_Step = i_G;
               }
             if(RedIngrd != PWM23H)
             {
                 uint8  R_Difference_Value;    //变化值 绝对值
                 //uint8 R_Step;
                 uint8 i_R = 0;
                 //uint8 Forward_or_Back_Flag_R;
                 if(RedIngrd > PWM23H)
                 {
                    R_Difference_Value = RedIngrd - PWM23H;
                    Forward_or_Back_Flag_R = 1;
                  }
                  else
                 {
                    R_Difference_Value = PWM23H - RedIngrd;
                    Forward_or_Back_Flag_R = 0;
                  }
                 for(;((TargetTransitionTime)*(i_R)) < R_Difference_Value;i_R++)
                 {
                    R_Step = i_R;
                 }
                 R_Step = i_R;
              }

         }
         else
         {
             BnIngrd = PWM22H;
             GrnIngrd = PWM12L;
             RedIngrd = PWM23H;
         }
}

5.2 中断函数

//Interrupt Function Low Enter 
void int_fun1() __interrupt (1)
{

     //判断R是正步径还是负步径  ,在中断里面自增或自减

     if(Forward_or_Back_Flag_R == 1)
     {
         PWM23H += R_Step;
      }
     else
     {
         PWM23H -= R_Step;
     }
     //执行G的自增或自减操作
     if(Forward_or_Back_Flag_G == 1)
     {
         PWM12L += G_Step;
     }
     else
     {
         PWM12L -= G_Step;
     }
     //执行B的自增或自减操作
     if(Forward_or_Back_Flag_B == 1)
     {
         PWM22H += B_Step;
     }
     else
     {
        PWM22H -= B_Step;
      }
     //如果要设置的值和寄存器里的值相同  ,则退出中断
     if((BnIngrd ==PWM22H) && (GrnIngrd == PWM12L) && (RedIngrd == PWM23H))
     {
         T0IF = 0u;  //中断标志位  退出中断
     }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PWM实现线性调光 的相关文章

  • 睿智的目标检测37——TF2搭建SSD目标检测平台(tensorflow2)

    睿智的目标检测37 TF2搭建SSD目标检测平台 tensorflow2 学习前言 什么是SSD目标检测算法 源码下载 SSD实现思路 一 预测部分 1 主干网络介绍 2 从特征获取预测结果 3 预测结果的解码 4 在原图上进行绘制 二 训
  • 2019最好用的谷歌扩展工具

    Extensions Manager 安装地址 https chrome google com webstore detail extensions manager aka sw lpleipinonnoibneeejgjnoeekmbop
  • Calendar获取想要的日期

    获取当前天的前n天 getTodayPreNDay int n 取得月第一天 getFirstDateOfMonth Date date 取得月最后一天 getLastDateOfMonth Date date 获取当前的季度 getSea
  • combineReducers()用法详解

    https www cnblogs com aurora ql p 14110920 html
  • Linux文件与目录的复制、删除与移动(cp、rm、mv)

    cp 复制文件或目录 cp adfilprsu 源文件 目标文件 cp options 源文件1 源文件2 目录 选项与参数 a 相当于 dr preserve all的意思 至于dr参考下面说明 d 若源文件为链接文件的属性 link f
  • 【转】常用性能计数器

    CPU 性能计数器说明 CPU 1 System Total Processor Time 平均CPU利用率 指处理器执行非闲置线程时间的百分比 测量处理器繁忙的时间 这个计数器设计成用来作为处理器活动的主要指示器 可以选择单个CPU实例

随机推荐

  • 无锁环形缓冲RingBuffer的原理及Java实现

    在多线程环境下为了保证线程安全 往往需要加锁 例如读写锁可以保证读写互斥 读读不互斥 有没有一种数据结构能够实现无锁的线程安全呢 答案就是使用RingBuffer循环队列 在Disruptor项目中就运用到了RingBuffer RingB
  • HTTP响应报文应答状态码及含义

    本应答报文状态码是老猿结合多方资料收集综合后并加以老猿自己的理解进行说明的应答报文状态码 应该是最新最全解释最详尽的 供大家参考
  • linux服务器查找大文件及删除文件后磁盘空间没有得到释放

    1 查询服务器中大于1G的文件 find type f size 1G 这条命令是查询自 根目录下所有大小超过1G的文件 查询的大小可以根据需要改变 如下 相关查询 查询服务器中大于100M的文件 find type f size 100M
  • ubuntu重新设置root密码

    方法一 如果用户具有sudo权限 那么直接可以运行如下命令 sudo su root passwd 直接更改root密码 sudo passwd root 有关sudo su的区别 1 共同点 都是root用户的权限 2 不同点 su仅仅取
  • 训练PyTorch模型遇到显存不足的情况怎么办

    在跑代码的过程中 遇到了这个问题 当前需要分配的显存在600MiB以下 RuntimeError CUDA out of memory Tried to allocate 60 00 MiB GPU 0 10 76 GiB total ca
  • minist图片多分类问题-单层神经网络

    采用打单层隐藏层 使用TensorFlow框架 构建的分类神经网络 入门级小项目 供深度学习 TensorFlow 初学者参考 usr bin env python coding utf 8 In 导入package 读取数据 import
  • DBeaver——一款替代Navicat的数据库可视化工具

    对于很多开发者来说 Navicat这个软件并不陌生 相信这个彩虹色图标的软件 有效的帮助了你的开发工作 从前上学的时候 我都是用的都是从网上找来的密钥进行破解的 但是一直在寻找有没有一个能找到一个免费的能完美替代Navicat的工具 今天就
  • 2.5mnist手写数字识别之优化算法精讲(百度架构师手把手带你零基础实践深度学习原版笔记系列)

    2 5mnist手写数字识别之优化算法精讲 百度架构师手把手带你零基础实践深度学习原版笔记系列 目录 2 5mnist手写数字识别之优化算法精讲 百度架构师手把手带你零基础实践深度学习原版笔记系列 设置学习率 学习率的主流优化算法 设置学习
  • 机器学习——决策树剪枝

    目录 一 决策树剪枝策略 1 1剪枝目的 1 2剪枝策略 1 3判断决策树泛化性能是否提升的方法 二 预剪枝 prepruning 2 1概述 2 2预剪枝优缺点 2 3代码实现 三 后剪枝 postpruning 3 1概述 3 2后剪枝
  • MinIo 安装及其集成到java中上传下载图片信息

    MinIo 安装及其集成到java中上传下载图片信息 win 下安装 下载链接 https min io download windows 下载好后cmd打开控制台 输入 minio exe server D MinIo data 注 D
  • [轻量级RTSP服务]Linux

    背景 随着国产操作系统的推进 传统行业对Linux平台的呼声和需求越来越大 之前几年 我们发布了Linux平台运营商级的RTSP转RTMP推送模块 RTMP推送模块和RTSP RTMP播放模块 前段时间 有开发者问我们 是不是可以在Linu
  • eclipse中springboot项目如何打包成jar文件

    eclipse中springboot项目如何打包成jar包 前提 第一步 清除项目中之前的打包内容 第二步 打jar包 第三步 测试 4 注意事项 前提 在项目的pom xml中配置相关的内容 其中finalName中内容表示jar war
  • 树莓派mqtt协议连接阿里云物联网平台,手机端获取数据并控制

    树莓派C语言mqtt协议连接阿里云物联网平台 一 阿里云后台配置树莓派设备 阿里云添加链接描述 注册 登录 打开控制台 选择产品与服务 物联网平台 进入后 选择设备管理 产品 点击创建产品 产品名称随便写 品类自定义 直连设备 其他默认 最
  • 【设计模式】建造者模式

    建造者模式 Builder Pattern 使用多个简单的对象一步一步构建成一个复杂的对象 这种类型的设计模式属于创建型模式 它提供了一种创建对象的最佳方式 一个 Builder 类会一步一步构造最终的对象 该 Builder 类是独立于其
  • 【概率论与数理统计】猴博士 笔记 p15-16 一、二维连续型求概率

    一维连续型求概率 题型如下 解题步骤如下 其实就是求积分 举例1的例子 例2 解 例3 解 注意 要把Y变为X计算 且要分类讨论y是否大于0 例4 解 去掉max和min的方法 去掉多余项的方法 假设要求AB两项同时发生的概率 当多余项 A
  • kafka使用_使用多线程增加kafka消费能力

    原创 小姐姐味道 微信公众号ID xjjdog 欢迎分享 转载请保留出处 前提 本例适合那些没有顺序要求的消息主题 kafka通过一系列优化 写入和读取速度能够达到数万条 秒 通过增加分区数量 能够通过部署多个消费者增加并行消费能力 但还是
  • order by产生的 Using temporary的优化

    今天遇到一个慢查询的sql sql如下 EXPLAIN SELECT tas f year tc pk id tas f sex tas f rank score tas f age tas f km five tas f km ten t
  • filter过滤器实现权限访问控制以及同一账号只能登录一台设备

    需求 如题目所意 未登录用户不能浏览访问项目内部的资源 对访问的请求和响应进行拦截 且一个用户只能在一台设备登录 权限访问控制功能可以通过过滤器或者拦截器去实现 在这里我用的是过滤器 过滤器可以过滤全部action请求 拦截器则更有针对性
  • unity通过键盘控制物体移动,大小的缩放

    拖动距离 private float distance 10 缩放量 float scale 0 2f 通过键盘 Q 或者 E 控制物体的缩放 通过键盘 w s a d 控制物体上下左右的移动 private void Update if
  • PWM实现线性调光

    1 PWM调光原理 PWM全称为脉宽调制技术 是通过高精度的计数器对方波的占空比进行编码 就是这个东西 其实很好理解 高电平的时候才会做功 低电平的时候肯定不亮啊 PWM就是调制高电平的占比 其实一般是低电平才有效 因为会外接一个12V的电