在开发臭氧发生器的时,我们使用UV灯来实现臭氧的产生。而UV灯的强度决定了臭氧产生的浓度,UV灯的光强则与其控制电压密切相关。所以我们要控制产生的臭氧的浓度就需要调节其控制电压。我们选择了AD5663这一模拟量输出模块来实现这一点。

1AD5663简介

AD5663属于nanoDAC系列,是低功耗、双通道、16位缓冲电压输出数模转换器(DAC),采用2.7V至5.5V单电源供电。AD5663采用多功能三线式串行接口,能够以最高50 MHz的时钟速率工作,并与标准SPI、QSPI、MICROWIRE、DSP接口标准兼容。它内置片内精密输出放大器,能够实现轨到轨输出摆幅。其功能框图如下所示:

2、硬件设计

我们用来产生臭氧的UV灯,其控制电压约需要在AC300V到AC1500V的范围,工作频率约为10kHz到20kHz的范围内,当然选用的灯不一样可能会有些许差异。为了达到这个目的,我们使用两个PWM控制电路产生低压交流电源,然后通过高频变压器产生我们需要的交流电源。基于此,我们先要有一个连续可调的低压直流电源才有可能通过PWM控制电路达到我们想要的结果。如下图即是我们电压控制电路:

上图中我们采用LM2596S-ADJ作为电源模块,以AD5663作为电源调节输出。LM2596S的反馈电压要求在1.23V,二极管的1N4001的管压降设定为0.5V,根据R27、R28、R29几个电阻电路就可以实现LM2596S输出电压的调节。由于二极管的存在,AD5663需要输出大于1.73V(1.23V+0.5V)以上的电压才能起到调节效果。我们设返回电压为Vf=1.23V,LM2596S的输出电压为Vo,二极管的管压降为Vd,AD5633的输出电压为Vs于是我们可以得到一个等式:

在上述等式中Vf=1.23V是确定的,二极管的管压降Vd=0.5V也是确定的,所以等式有2中情况:第一种是AD5663的输出电压小于等于1.73时,AD5663的输出对电压输出没有影响;第二种是当AD5663的输出电压大于1.73时,可以通过AD5663的输出调节LM2596S的输出,而且为线性关系。

3、软件设计

经过上述的分析和设计,相关软件的编写就变得相对容易了。AD5663有一个输入移位寄存器,对AD5663操作都是通过输入移位寄存器来实现的。

1)输入移位寄存器

输入移位寄存器为24位宽。前2位是无关位,后续三位是命令位C2至C0,然后是3位DAC地址A2至A0,其结构如下:

2)软件复位

软件复位也是通过操作输入移位寄存器来实现的。命令位的定义没有变化,数据段的最后一位作为软件复位的模式设定,其它位无效。最后一位为0时,会清除DAC寄存器和输入寄存器,而最后一位为1时清除掉全部寄存器。最后一位为1时,实际就是上电复位模式。输入移位寄存器的数据格式如下:

其软件实现如下:

 void Ad5663SoftwareReset(AD5663ResetType resetMode,void (*WriteByteToAD5663)(uint8_t))
{
uint32_t inputShiftData=; if(resetMode==ResetSoftware)
{
inputShiftData=RESET|Register_Reset_Software;
} if(resetMode==ResetPoweron)
{
inputShiftData=RESET|Register_Reset_Poweron;
}
uint8_t txData[];
txData[]=inputShiftData>>;
txData[]=inputShiftData>>;
txData[]=inputShiftData; WriteByteToAD5663(txData[]);
WriteByteToAD5663(txData[]);
WriteByteToAD5663(txData[]);
}

3)上电复位

上电复位也是通过操作输入移位寄存器来实现的。命令位的定义没有变化,数据段的DB5和DB4定义掉电的模式,而DB1和DB0定义操作的通道。输入移位寄存器的数据格式如下:

其软件实现如下:

/*设置AD5663上电/掉电工作模式*/
void Ad5663PowerUpDownMode(DACHANNEL channel,AD5663PowerdownType powerdownType,void (*WriteByteToAD5663)(uint8_t))
{
uint32_t inputShiftData=; if(channel==DAChannelA)
{
inputShiftData=DAC_A;
} if(channel==DAChannelB)
{
inputShiftData=DAC_B;
} if(channel==ChannelAll)
{
inputShiftData=DAC_A|DAC_B;
} switch(powerdownType)
{
case NormalOperation:
{
inputShiftData=inputShiftData|Normal_Operation|Power_Down;
break;
}
case R1K2GND: {
inputShiftData=inputShiftData|_1K_GND|Power_Down;
break;
}
case R100K2GND:
{
inputShiftData=inputShiftData|_100K_GND|Power_Down;
break;
}
case ThreeState:
{
inputShiftData=inputShiftData|Three_State|Power_Down;
break;
}
}

4)输出操作

对各输出通道值的操作也是同过输入移位寄存器来完成。其数据格式如前面输入移位寄存器的介绍。后16位是数据(0-65535),然后是3位地址和3位命令。通讯的时序图如下所示:

 设置DA通道的值具体代码如下:
void SetAD5663ChannelValue(DACHANNEL channel,uint16_t data,void (*WriteByteToAD5663)(uint8_t))
{
uint32_t inputShiftData=;
if(channel==DAChannelA)
{
inputShiftData=WriteTo_Update_DAC_Channel|DAC_Channel_A|data;
} if(channel==DAChannelB)
{
inputShiftData=WriteTo_Update_DAC_Channel|DAC_Channel_B|data;
}
uint8_t txData[];
txData[]=inputShiftData>>;
txData[]=inputShiftData>>;
txData[]=inputShiftData; WriteByteToAD5663(txData[]);
WriteByteToAD5663(txData[]);
WriteByteToAD5663(txData[]);
}

欢迎关注:

基于AD5663的UV灯电压控制的更多相关文章

  1. Redis实战篇(三)基于HyperLogLog实现UV统计功能

    如果现在要开发一个功能: 统计APP或网页的一个页面,每天有多少用户点击进入的次数.同一个用户的反复点击进入记为 1 次,也就是统计 UV 数据. 让你来开发这个统计模块,你会如何实现? 如果统计 P ...

  2. STM32学习笔记(二) 基于STM32-GPIO的流水灯实现

    学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...

  3. 实验一:基于STM32F1的流水灯实验(库函数)

    参考原子哥学习程序 条件:实验板STM32103ZET6:固件库STM32F10x_StdPeriph_Lib_V3.5.0:环境MDK5: 目的:了解STM32 的 IO 口如何作为输出使用 :以两 ...

  4. Spark案例练习-UV的统计

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  5. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  6. ISE14.7使用教程(一个完整工程的建立)

    FPGA公司主要是两个Xilinx和Altera(现intel PSG),我们目前用的ISE是Xilinx的开发套件,现在ISE更新到14.7已经不更新了,换成了另一款开发套件Vivado,也是Xil ...

  7. Unity2018 Shader Graph 实验室

    Unity2018 Shader Graph 实验室 Shader Shader Graph Unity  Tips: -- 在shader forge和amplyfy Shader节点图形化shad ...

  8. 【转】ISE——完整工程的建立

    FPGA公司主要是两个Xilinx和Altera(现intel PSG),我们目前用的ISE是Xilinx的开发套件,现在ISE更新到14.7已经不更新了,换成了另一款开发套件Vivado,也是Xil ...

  9. AVR单片机教程——第三期导语

    背景(一) 寒假里做了一个灯带控制器: 理想情况下我应该在一个星期内完成这个项目,但实际上它耗费了我几乎一整个寒假,因为涉及到很多未曾尝试的方案.在这种不是很赶时间的.可以自定目标.自由发挥的项目中, ...

随机推荐

  1. flex中使用white-space

    在微信小程序开发中,view设置为flex布局,但是flex的flex-wrap属性不起作用,如果起作用的话,默认值即no-wrap不换行.如果要测试view-scroll并且scroll-x 就没法 ...

  2. Ubuntu、Windows输入命令appium-doctor提示未找到命令

    输入命令:appium-doctor时,一直报错,提示“未找到命令”,但是输入命令:appium -v能够正确输出我安装版本,这是怎么回事呢? 原来appiu-doctor在1.5.3版本之后没有了需 ...

  3. 深入理解内存模型JMM

    JMM(java memory model)java内存模型主要目标是定义程序中的变量,(此处所指的变量是实例字段.静态字段等,不包含局部变量和函数参数,因为这两种是线程私有无法共享)在虚拟机中存储到 ...

  4. 20165234 《Java程序设计》第四周学习总结

    第四周学习总结 教材学习内容总结 第5章 子类与继承 子类的继承性 子类和父类在同一包中的继承性:子类继承父类中不是 private 的成员变量和方法作为自己的成员变量和方法 子类和父类不在同一包中的 ...

  5. 2017-2018-2 20165221 实验三《敏捷开发与XP实践》实验报告

    实验报告封面 姓名:谭笑 学号:20165221 班级:1652班 实验名称: JAVA--敏捷开发与XP实践 指导老师:娄嘉鹏 试验时间:15:35--17:15 实验性质:选修 实验组次:21 实 ...

  6. apache fileupload 文件上传,及文件进度设置获取

    文件上传action处理: boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) ...

  7. VC中的字符串转换宏

              ATL7.0引入了几个新的转换类和宏,现有的宏提供了显着的改善.新的字符串转换类和宏的名称,采取的形式如下: C SourceType [C]DestinationType[EX] ...

  8. Linux更改目录及其子目录、文件的访问权限

    修改某个目录及其下所有文件的权限,要使用-R参数,表示启动递归处理. 例如: #仅将/home/user/test目录的权限设置为rwxr-xr-x /home/user/test #表示将整个/ho ...

  9. CodeForces 931C Laboratory Work 水题,构造

    *这种题好像不用写题解... 题意: 一个人要改动别人的实验记录,实验记录记录是一个集合 实验记录本身满足:$max(X)-min(X)<=2$ 改动结果要求: 1.新的集合平均值和之前的一样 ...

  10. LOJ 6277-6280 数列分块入门 1-4

    数列分块是莫队分块的前置技能,练习一下 1.loj6277 给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值. 直接分块+tag即可 #include <bits/stdc++.h ...