DAC数模转换、PWM输出、呼吸灯(附原理图+代码)

您所在的位置:网站首页 pwm呼吸灯工作原理 DAC数模转换、PWM输出、呼吸灯(附原理图+代码)

DAC数模转换、PWM输出、呼吸灯(附原理图+代码)

2024-07-16 17:09| 来源: 网络整理| 查看: 265

DAC数模转换、PWM输出、呼吸灯(附原理图+代码)

一、DAC 转换原理和技术指标

 (一)分辨率

        分辨率是指输入数字量的最低有效位(LSB)发生变化时,所对应的输出模拟量(电压或电流)的变化量。它反映了输出模拟量的最小变化值。

(二)线性度

        线性度(也称非线性误差)是实际转换特性曲线与理想直线特性之间的最大偏差。 常以相对于满量程的百分数表示。如±1%是指实际输出值与理论值之差在满刻度的 ±1%以内。

(三)绝对精度和相对精度

        绝对精度(简称精度)是指在整个刻度范围内,任一输入数码所对应的模拟量实际输出值与理论值之间的最大误差。

        相对精度与绝对精度表示同一含义,用最大误差相对于满刻度的百分比表示。

(四)建立时间

        建立时间是指输入的数字量发生满刻度变化时,输出模拟信号达到满刻度值的± 1/2LSB 所需的时间。是描述 D/A 转换速率的一个动态指标。

二、PWM 工作原理

(一)PWM 简介 PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。 通过每个信号周期高电平的占比作为信号来控制器件。其应用领域包括测量,通信,功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些音频放大器。

(二)PWM 等效图形

        b图中的阴影部分面积分别等于 a图中的不规则图形面积。随着曲线的增高,a图中的面积增加,b图中对应的阴影面积也就增加。但是因为阴影部分的高(高电平的电压)是固定的,所以面积的增加就体现在输出信号高电平持续的时间。

(三)PWM 工作原理

 (四)硬件原理图

  (五)软件代码

/*************************************************************************************** * *实验现象:AD/DAC模块上的DA1指示灯呈呼吸灯效果(第1秒为由暗变亮,第2秒为由亮变暗,重复) * *实验原理:1、计数器count计数到100us时,value根据方向变量DIR判断来执行自(加/减), * 来改变高电平持续的时间,从而该改变占空比的大小。 * 2、value每1个周期增加10,以10 20 30 ... 990 1000 0 10 20这种规律增加(count计数器可以改变value的增加值) ***************************************************************************************/ #include "reg52.h" //定义了一些特殊类型的寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; /*定义使用的IO口*/ sbit PWM=P2^1; bit DIR; //位变量:表示计数方向 /*定义全局变量*/ u16 count; //计数器作用:计数器count计数到100us时,value自(加/减) u16 value; //value的值代表高电平的时间,范围为0-1000 u16 timer1; //定义PWM一个周期的时长。 void Timer1Init() { TMOD |= 0x10; //选择定时器1,工作方式1; TH1 = 0xFF; TL1 = 0xFF; //赋初值 EA = 1; //打开总中断 ET1 = 1; //开放定时器1中断ET1 TR1 = 1; //定时器T1运行控制位 } /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { Timer1Init(); //定时器T1初始化 while(1) { if(count > 100) //每100us,value变化一次 { count = 0; if(DIR == 1) //DIR控制增加或减小 { value++; } if(DIR == 0) { value--; } } if(value == 1000) //改变计数方向,也就是value到了1000,让它再自减到0的一个标志位 { DIR = 0; } if(value == 0) { DIR = 1; } if(timer1 > 1000) //确定PWM信号的一个周期时长,为1000*1us { //若是(timer1 == 1000)则没有呼吸灯的效果 timer1 = 0; } if(timer1 < value) { PWM = 1; //value控制高电平持续时间,如果在1000us的周期里timer1大于value,就为高电平 } //可以看word对应笔记的波形图 else { PWM = 0; } } } /******************************************************************************* * 函 数 名 : Time1 * 函数功能 : 定时器1的中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Time0() interrupt 3 //定时器1的中断号为3 { TH1 = 0xFF; //再次赋初值 TL1 = 0xFF; //1us timer1++; //定时设置PWM一个周期的时长 count++; //累加1次为1us }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3