51单片机-DA(数字转模拟)(呼吸灯)

作者:Whappy

个人理解:将电压或电流信号进行等分或不等分(高电平的电压范围和低电平的范围,如0-5v,0-1.8位低电平,3.8-5v为高电平),同样也是通过采样,量化等操作将不连续的数字量进行模拟化。(实际转换中精度很重要!)本实验通过PWM实现

DA:常用T型电阻网络事项

AD:常用逐次逼近型AD转化器

采用PWM来实现数字信号到模拟信号的编码!(也可以说PWM是一种对模拟信号的编码方法)

(在这个DA存在交直流分量,我们只需要直流分量)采用二阶低通滤波器截止频率较低,作用就是将交流分量滤除!(由于低通滤波器的驱动能力也很弱,后面加一个电压跟随器,增大驱动能力)

main.c

/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN普中实验名称:DAC模数转换实验
接线说明:	
实验现象:下载程序后,DAC(PWM)模块上的指示灯DA1呈呼吸灯效果,由暗变亮再由亮变暗
注意事项:																				  
***************************************************************************************/
#include "public.h"
#include "pwm.h"/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	u8 dir=0;//默认为0u8 duty=0;pwm_init(0XFF,0XF6,100,0);//定时时间为0.01ms,PWM周期是100*0.01ms=1ms,占空比为0%while(1){if(dir==0)//当dir为递增方向{duty++;//占空比递增if(duty==70)dir=1;//当到达一定值切换方向,占空比最大能到100,但到达70左右再递增,//肉眼也分辨不出亮度变化	}else{duty--;if(duty==0)dir=0;//当到达一定值切换方向	}pwm_set_duty_cycle(duty);//设置占空比delay_ms(1);//短暂延时,让呼吸灯有一个流畅的效果			}
}

PWM.c

#include "pwm.h"//全局变量定义
u8 gtim_h=0;//保存定时器初值高8位
u8 gtim_l=0;//保存定时器初值低8位
u8 gduty=0;//保存PWM占空比
u8 gtim_scale=0;//保存PWM周期=定时器初值*tim_scale/*******************************************************************************
* 函 数 名       : pwm_init
* 函数功能		 : PWM初始化函数
* 输    入       : tim_h:定时器高8位tim_l:定时器低8位tim_scale:PWM周期倍数:定时器初值*tim_scaleduty:PWM占空比(要小于等于tim_scale)
* 输    出    	 : 无
*******************************************************************************/
void pwm_init(u8 tim_h,u8 tim_l,u16 tim_scale,u8 duty)
{gtim_h=tim_h;//将传入的初值保存在全局变量中,方便中断函数继续调用gtim_l=tim_l;gduty=duty;gtim_scale=tim_scale;TMOD|=0X01;	//选择为定时器0模式,工作方式1TH0 = gtim_h;	//定时初值设置 TL0 = gtim_l;		ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器
}/*******************************************************************************
* 函 数 名       : pwm_set_duty_cycle
* 函数功能		 : PWM设置占空比
* 输    入       : duty:PWM占空比(要小于等于tim_scale)
* 输    出    	 : 无
*******************************************************************************/
void pwm_set_duty_cycle(u8 duty)
{gduty=duty;	
}void pwm(void) interrupt 1	//定时器0中断函数
{static u16 time=0;TH0 = gtim_h;	//定时初值设置 TL0 = gtim_l;time++;if(time>=gtim_scale)//PWM周期=定时器初值*gtim_scale,重新开始计数time=0;if(time<=gduty)//占空比	PWM=1;elsePWM=0;		
}

代码思路

该代码实现了一个 PWM(脉宽调制)控制的呼吸灯,通过 DAC 模数转换 来控制灯的亮度。主要原理是通过调节 PWM 占空比(duty cycle)来实现灯的亮度从暗到亮,再从亮到暗的逐渐变化,产生呼吸灯的效果。

主要工作原理

  • PWM 信号的占空比控制输出设备(此处为LED)的亮度。

  • 通过递增或递减占空比,模拟灯光由暗到亮再由亮到暗的变化,形成呼吸灯效果。

  • 使用定时器周期性地产生中断,并在中断中根据当前占空比控制 LED 的开关状态。

代码实现的主要方法

  1. 全局变量的使用

    • gtim_hgtim_l:保存定时器的初值,设定定时器0的初始计数值。

    • gduty:当前 PWM 的占空比,控制灯亮度。

    • gtim_scale:PWM 周期长度,由定时器初值与该变量相乘得到。

  2. PWM初始化函数 (pwm_init())

    • 该函数初始化定时器0,用于生成 PWM 信号。通过设置定时器的初值以及周期倍数 tim_scale 来控制 PWM 信号的频率。

    • 开启定时器和中断,开始产生 PWM 信号。

  3. 占空比设置函数 (pwm_set_duty_cycle())

    • 该函数用于设置 PWM 信号的占空比,从而控制输出设备(LED)的亮暗变化。占空比的范围为 0tim_scale

  4. 定时器中断服务函数 (pwm())

    • 每次定时器0产生中断时会执行该函数。

    • 通过计数器 time 记录定时器溢出的次数。当 time 小于占空比时,输出高电平(点亮LED);当 time 超过占空比时,输出低电平(熄灭LED)。

    • time 从0递增到 gtim_scale,表示一个完整的 PWM 周期。

  5. 主函数 (main())

    • 主函数控制占空比的递增和递减,使得 LED 亮度随着时间逐渐增加和减小,形成呼吸灯效果。

    • 使用 dir 变量控制递增或递减方向,当占空比达到70时改变方向(因为人眼对亮度的变化在某个范围内不再敏感)。

    • delay_ms(1) 用于在占空比每次变化时稍作延时,使得呼吸灯效果更加平滑。

实现思路

  1. PWM控制亮度

    • 通过定时器0定时产生中断,利用占空比控制 PWM 信号的高低电平。高电平时间越长,LED 越亮;高电平时间越短,LED 越暗。

  2. 呼吸灯效果

    • 通过在主循环中不断改变占空比,使灯光的亮度呈现由暗变亮、由亮变暗的循环变化。

  3. 定时器中断机制

    • 定时器中断周期性触发,根据设定的 PWM 周期和占空比控制输出,确保 PWM 信号的精准性。

代码的主要好处

  • 高效性:通过定时器和中断机制,系统可以在不占用主程序的情况下精准地产生 PWM 信号,减少 CPU 负载。

  • 流畅性:通过逐渐改变占空比,呼吸灯效果十分平滑,不会出现明显的亮暗突变。

  • 可调性:通过设置不同的 PWM 周期和占空比范围,可以很方便地调节 LED 的亮暗周期和呼吸灯效果。

总结

该代码展示了如何利用51单片机定时器和中断功能生成 PWM 信号,从而控制 LED 的亮度变化,最终实现呼吸灯效果。通过精确的时间控制和占空比调节,实现了灯光的渐变效果,具备良好的流畅性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147819.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

智能创造的幕后推手:AIGC浪潮下看AI训练师如何塑造智能未来

文章目录 一、AIGC时代的算法与模型训练概览二、算法与模型训练的关键环节三、AI训练师的角色与职责四、AI训练师的专业技能与素养五、AIGC算法与模型训练的未来展望《AI训练师手册&#xff1a;算法与模型训练从入门到精通》亮点内容简介作者简介谷建阳 目录 《医学统计学从入门…

2024图纸加密软件最佳选择!10款超好用的图纸加密软件推荐!

随着企业对数据安全的重视不断提升&#xff0c;尤其是在涉及重要设计图纸等机密文件的管理上&#xff0c;选择一款高效且安全的图纸加密软件显得尤为重要。2024年&#xff0c;我们精选了10款超好用的图纸加密软件&#xff0c;帮助企业保护知识产权与机密数据的安全。 1.安秉图纸…

多语言文本 AI 情感分析 API 数据接口

多语言文本 AI 情感分析 API 数据接口 AI / 文本处理 AI 模型快速分析文本情感倾向 多语言文本 / 情感分析。 1. 产品功能 支持多语言文本情感分析&#xff1b;基于特定 AI 模型&#xff0c;快速识别文本情感倾向&#xff1b;适用于评论分析、舆情监控等场景&#xff1b;全接…

2024/9/23 leetcode 148题 排序链表

目录 148.排序链表 题目描述 题目链接 解题思路与代码 148.排序链表 题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&am…

【Python】入门学习1:开发前的准备

准备工作&#xff1a; 1、电脑系统&#xff1a;windows 64位&#xff1b; 2、python学习所需工具&#xff1a;“解释器、编译器”&#xff1b; &#xff08;1&#xff09;python 解释器&#xff1a;解释代码的&#xff0c;把 python 计算机语言翻译给计算机认识&#xff1b;…

双通道隔离驱动之选,SLMi823x系列SLMi8235BDCG-DG可编程死区满足您需求

SLMi823x系列SLMi8235BDCG-DG双通道死区可编程的隔离驱动器。SLMi823x系列SLMi8235BDCG-DG配置为双输入&#xff0c;双输出驱动器。另外&#xff0c;SLMi823x系列SLMi8235BDCG-DG峰值输出电流为 4.0A。 所有输出驱动器的 VDDA/B 电源电压最高到40V。3V 至 18V 的 VDDI 宽范围输…

git用ssh来拉去代码

参考资料 5分钟 git配置ssh_哔哩哔哩_bilibili Git怎么使用SSH从GitLab上拉取代码_gitlab ssh-CSDN博客 gitlab怎么配置通过ssh来拉取代码_gitlab ssh 拉代码-CSDN博客 执行的命令:(需要在你本地.ssh文件夹下执行) ssh-keygen -t rsa -b 4096 -C "你的邮箱" ss…

PHPstorm 安装汉化包失败解决方法

错误信息&#xff1a; Plugin "chinese (Simplified) Language Pack/中文语言包" was not installed: invalid filename returned by a server 原因 &#xff1a;官方的包和软件的版本不对应&#xff0c;下载对应的汉化包就行了 官网汉化包&#xff1a; Chinese (…

Linux C——网络编程

本案例运行环境&#xff1a;Ubuntu 12.04.1 LTS 1、基本概念 网络的七层模型&#xff1a; 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 其中&#xff1a;1、2、3层主要面向通过网络端到端的数据流&#xff0c; 4、5、6、7层定义了程序的功能 …

抱歉占用公共资源,大家别猜啦,我们在一起了@Yaker

家人们上午好呀 这里是超绝脱单牛一枚 没错&#xff0c;我和Yaker有一个孩子&#xff08;bushi 今天我们的孩子YakLang来给大家介绍介绍&#xff0c;ta对块作用域的处理方式 在编程中&#xff0c;作用域&#xff08;Scope&#xff09;指的是变量、函数和对象的可访问性和生命…

Java反序列化CC1-TransformedMap链学习

学习参考&#xff1a;Java反序列化CC1链TransformedMap 核心是要学会基本EXP编写&#xff0c;还有怎么找传递链。 链子尾部 这里有一个能反射调用任意类&#xff0c;任意方法的&#xff1a; 以这个漏洞点写EXP&#xff0c;由于这个是public的InvokerTransformer&#xff0c;所…

如何基于scrcpy改造实现大厂一键连招/触摸宏功能(带java源码)-千里马安卓framework实战

背景&#xff1a; 前面公众号文章已经分享过如何实现这种大厂里面一键连招&#xff0c;触摸宏的功能&#xff0c;原理本身是对dev/input下面的节点进行读取保存文件&#xff0c;然后在读取文件进行写入dev/input下面的节点&#xff0c;从而实现了触摸事件的读取和写入&#xf…

初始main方法,标识符和关键字

1. 初识Java的main方法 1.1 main方法示例 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} }图解&#xff1a; 通过上述代码&#xff0c;我们可以看到一个完整的Java程序的结构&#xff0c;Java程序的结构…

C. Lazy Narek (Codeforces Round 972 (Div. 2))

C. Lazy Narek 思路: 动态规划 dp dp[i] 表示 目前寻找的字符下标为i 时的最大分数&#xff08;<i<4&#xff09; 从前往后遍历字符串&#xff0c;每个字符串找5次&#xff0c;找完后把dp取max 注意找的过程中不能修改原dp数组&#xff0c;因为这5次查找是并行的&#x…

STM32引脚输入

文章目录 前言一、看原理图二、开始编程1.开启时钟2.配置GPIOA.0 上拉输入3.读取 GPIOA.0 引脚 GPIOA_IDR 0位上是1&#xff08;按键松开&#xff09;&#xff0c;输入就是高电平&#xff0c;否则就是低电平&#xff08;按键按下&#xff09; 三、完整程序四 测试效果总结 前言…

故障诊断 | 基于双路神经网络的滚动轴承故障诊断

故障诊断 | 基于双路神经网络的滚动轴承故障诊断 目录 故障诊断 | 基于双路神经网络的滚动轴承故障诊断效果一览基本介绍程序设计参考资料效果一览 基本介绍 基于双路神经网络的滚动轴承故障诊断 融合了原始振动信号 和 二维信号时频图像的多输入(多通道)故障诊断方法 单路和双…

快速生成应用:AI大模型与低代码平台如何无缝结合提升效率?

引言&#xff1a;数字化时代的开发挑战 在数字化转型的浪潮中&#xff0c;快速响应市场需求已成为企业的核心竞争力。AI大模型与低代码平台的结合&#xff0c;为应用开发提供了一条更加智能、快速的路径。通过自动代码生成、智能推荐和持续优化&#xff0c;这一无缝结合大幅提升…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-19 1. SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expression Segmentation Authors: Yi-Chia Chen, Wei-Hua Li, Cheng Sun, Yu-Chiang Frank Wang, Chu-Song Chen SAM4MLLM: 增强多模…

21 基于51单片机的隧道车辆检测系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 以AT89C51单片机为控制核心&#xff0c;实现对隧道环境的监测。采用模块化设计&#xff0c; 共分以下几个功能模块&#xff1a; 单片机最小系统模块、电源模块、气体传感模块、和显示模块等。 通过…

在电脑中增加一个新盘

找到此电脑右击找到管理点进去 找到磁盘管理点进去 找到D盘&#xff0c;点击D盘然后右击找到压缩卷点击&#xff0c;之后按照自己的意愿分盘容量 然后就一直点下一页 返回去就能看到新加卷F盘了 在此电脑中也可以查看 完成