作者:卓晴博士,清华大学自动化系
更新时间:2020-07-28 Tuesday

通过设计基于DA,AD,12-bit的模拟输入输出单片机加电路可以构成更加灵活的机理测量模块。手边有两个别人剩余的器件,基于STC8G1K(SOP8)来设计对应的电路模块。

  • MAX5353(Low-Power, 12-Bit DAC)TaoBao:¥7
  • MAX1240(1-bit ADC)TaoBao:¥:5.0
  • MAX6192(2.5V参考电压)

01设计ADDA模块


1.电路设计

(1) 元器件

(2) 原理图1

下面接口的功能定义:

PIN1 PIN2 PIN3 PIN4 PIN5
+5V GND AIN AGND AOUT
  • 工作电压测试:
+5V GND 3.3V 2.5V AGND AIN AOUT
5.03 -0.00 3.31 2.42 0.00 0.24 0.00

将MAX6192的VCC增加到+5V,参考电压Vref=2.4746V。

由于MAX5353的工作电压为3.3V,所以它的输出最大为3.3V。修改RA1= 2.5k,在Vref=2.5V参考电压下,MAX5353的最大输出为3.125V。

(3) 单片机软件2

  • OSC:35M, UART1:460800bps

▲ 设置DAC与ADC读数

(4) 软件串口命令

else IFARG0("max5353") {sscanf(SDA(1), "%d", &nNumber);MAX5353Write(nNumber);
} else IFARG0("max5353x") {sscanf(SDA(1), "%x", &nNumber);MAX5353Write(nNumber);
} else IFARG0("max1240") {printf("%d ", MAX1240Read());} else IFARG0("max1240b") {nNumber = MAX1240Read();SendChar((unsigned char)(nNumber >> 8));SendChar(nNumber);} else IFARG0("max5353max1240") {for(nNumber = 0; nNumber < 0xfff; nNumber += 0x10) {MAX5353Write(nNumber);WaitTime(1);printf("%d ", MAX1240Read());}printf("\r\n");
} else IFARG0("maxswp") {sscanf(SDA(1), "%d", &nStart);sscanf(SDA(2), "%d", &nNumber);sscanf(SDA(3), "%d", &nInc);for(; nStart < nNumber ; nStart += nInc) {MAX5353Write(nStart);WaitTime(1);printf("%d ", MAX1240Read());}printf("\r\n");
} else IFARG0("maxswpx") {sscanf(SDA(1), "%x", &nStart);sscanf(SDA(2), "%x", &nNumber);sscanf(SDA(3), "%x", &nInc);for(; nStart < nNumber ; nStart += nInc) {MAX5353Write(nStart);WaitTime(1);printf("%d ", MAX1240Read());}printf("\r\n");
} else IFARG0("maxsample") {sscanf(SDA(1), "%d", &nNumber);sscanf(SDA(2), "%d", &nStart);for(nInc = 0; nInc < nNumber; nInc ++) {printf("%d ", MAX1240Read());WaitTime(nStart);}}

02校正ADDA


1.校正DAC

▲ ADC 设置与输出(黄色)以及MAX8608跟随输出

set=[0.00,40.00,80.00,120.00,160.00,200.00,240.00,280.00,320.00,360.00,400.00,440.00,480.00,520.00,560.00,600.00,640.00,680.00,720.00,760.00,800.00,840.00,880.00,920.00,960.00,1000.00,1040.00,1080.00,1120.00,1160.00,1200.00,1240.00,1280.00,1320.00,1360.00,1400.00,1440.00,1480.00,1520.00,1560.00,1600.00,1640.00,1680.00,1720.00,1760.00,1800.00,1840.00,1880.00,1920.00,1960.00,2000.00,2040.00,2080.00,2120.00,2160.00,2200.00,2240.00,2280.00,2320.00,2360.00,2400.00,2440.00,2480.00,2520.00,2560.00,2600.00,2640.00,2680.00,2720.00,2760.00,2800.00,2840.00,2880.00,2920.00,2960.00,3000.00,3040.00,3080.00,3120.00,3160.00,3200.00,3240.00,3280.00,3320.00,3360.00,3400.00,3440.00,3480.00,3520.00,3560.00,3600.00,3640.00,3680.00,3720.00,3760.00,3800.00,3840.00,3880.00,3920.00,3960.00]
volt=[0.01,0.02,0.05,0.08,0.11,0.14,0.17,0.20,0.23,0.26,0.29,0.32,0.36,0.39,0.42,0.45,0.48,0.51,0.54,0.57,0.60,0.63,0.66,0.69,0.72,0.75,0.78,0.81,0.84,0.87,0.90,0.93,0.96,1.00,1.03,1.06,1.09,1.12,1.15,1.18,1.21,1.24,1.27,1.30,1.33,1.36,1.39,1.42,1.45,1.48,1.51,1.54,1.57,1.60,1.64,1.67,1.70,1.73,1.76,1.79,1.82,1.85,1.88,1.91,1.94,1.97,2.00,2.03,2.06,2.09,2.12,2.15,2.18,2.21,2.25,2.28,2.31,2.34,2.37,2.40,2.43,2.46,2.49,2.52,2.55,2.58,2.61,2.64,2.67,2.70,2.73,2.76,2.79,2.82,2.85,2.88,2.92,2.95,2.98,3.01]
adc=[-0.01,0.02,0.05,0.08,0.11,0.14,0.17,0.20,0.23,0.26,0.29,0.32,0.35,0.38,0.42,0.45,0.48,0.51,0.54,0.57,0.60,0.63,0.66,0.69,0.72,0.75,0.78,0.81,0.84,0.87,0.90,0.93,0.96,0.99,1.02,1.05,1.09,1.12,1.15,1.18,1.21,1.24,1.27,1.30,1.33,1.36,1.39,1.42,1.45,1.48,1.51,1.54,1.57,1.60,1.63,1.66,1.69,1.73,1.76,1.79,1.82,1.85,1.88,1.91,1.94,1.97,2.00,2.03,2.06,2.09,2.12,2.15,2.18,2.21,2.24,2.27,2.30,2.33,2.37,2.40,2.43,2.46,2.49,2.52,2.55,2.58,2.61,2.64,2.67,2.70,2.73,2.76,2.79,2.82,2.85,2.88,2.91,2.94,2.97,3.00]

对上述DAC的设置x与输出之间的关系通过下面线性关系拟合:
ADC=a×x+bADC = a \times x + bADC=a×x+b

获得参数为:[ a=0.00076168 b=-0.01134206]
ADC=0.76168x1000−0.01134ADC = {{0.76168x} \over {1000}} - 0.01134ADC=10000.76168x​−0.01134

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# DRAW1.PY                     -- by Dr. ZhuoQing 2020-07-28
#
# Note:
#============================================================
from headm import *
from scipy.optimize         import curve_fit
def func1(x, a, b):return x * a + b
set, volt, adc = tspload('meas', 'set', 'volt', 'adc')
#------------------------------------------------------------
param = (3/4000, 0)
param, conv = curve_fit(func1, set, adc, p0=param)
printf(param)
#------------------------------------------------------------
#        END OF FILE : DRAW1.PY
#============================================================

2.校正ADC

输入电压与转换值:

▲ ADC输入电压与转换值

最后电压为: 1.5105V,转换值为2503
那么,转换值与电压之间的比例为:0.6035/1000。

这个数值理论值为:2.54095=0.61035×10−3{{2.5} \over {4095}} = 0.61035 \times 10^{ - 3}40952.5​=0.61035×10−3

▲ 红色LED的电流与电流之间的关系

▲ 绿色色LED的电流与电流之间的关系

▲ 蓝色色LED的电流与电流之间的关系

▲ 白色LED电流与电压之间的关系

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2020-07-28
#
# Note:
#============================================================from headm                  import *
from tsmodule.tsvisa        import *
from tsmodule.tsstm32       import *stm32cmd("CLEAR")
stm32cmd("max5353 0")
time.sleep(1)stm32cmd('maxswp 0 4000 2 1')
time.sleep(3)
val = stm32memo(1)set = list(range(0, 4000, 2))printf(set)volt = [0.76168*s/1000-0.01134 for s in set]
voltled = [0.6035*s/1000 for s in val]
curr = [(v1-v2) for v1,v2 in zip(volt, voltled)]plt.plot(voltled, curr)
plt.ylabel("Current(mA)")
plt.xlabel("Voltage(V)")
plt.grid(True)
plt.tight_layout()
plt.show()#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

03软件


/*
**==============================================================================
** MAX5353.H:            -- by Dr. ZhuoQing, 2020-07-28
**
**  Description:
**
**==============================================================================
*/
#ifndef __MAX5353__
#define __MAX5353__
//------------------------------------------------------------------------------
#ifdef MAX5353_GLOBALS#define MAX5353_EXT
#else#define MAX5353_EXT extern
#endif // MAX5353_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
#define MAX5353_CS          5,5
#define MAX5353_CLK         3,3
#define MAX5353_DIO         3,2
//------------------------------------------------------------------------------void MAX5353Init(void);void MAX5353Write(unsigned int nNumber);
void MAX5353Delay(unsigned char ucDelay);
void MAX5353Clock(unsigned char ucClock);//==============================================================================
//             END OF THE FILE : MAX5353.H
//------------------------------------------------------------------------------
#endif // __MAX5353__
/*
**==============================================================================
** MAX5353.C:             -- by Dr. ZhuoQing, 2020-07-28
**
**==============================================================================
*///------------------------------------------------------------------------------
#define MAX5353_GLOBALS        1              // Define the global variables
#include "MAX5353.H"
#include "C51BASIC.H"
#include "STC8G.H"
#include "INTRINS.H"//------------------------------------------------------------------------------void MAX5353Init(void) {ON(MAX5353_DIO);OFF(MAX5353_CLK);ON(MAX5353_CS);PM_PP(MAX5353_CS);PM_BIDIR(MAX5353_DIO);PM_PP(MAX5353_CLK);}void MAX5353Delay(unsigned char ucDelay) {unsigned char i;for(i = 0; i < ucDelay; i ++) {_nop_();_nop_();_nop_();_nop_();_nop_();}}void MAX5353Clock(unsigned char ucClock) {unsigned char i;for(i = 0; i < ucClock; i ++) {ON(MAX5353_CLK);MAX5353Delay(10);OFF(MAX5353_CLK);MAX5353Delay(10);}
}void MAX5353Write(unsigned int nNumber) {unsigned int nMask;unsigned char i;OFF(MAX5353_CLK);OFF(MAX5353_CS);OFF(MAX5353_DIO);MAX5353Clock(3);nMask = 0x800;for(i = 0; i < 12; i ++) {if(nNumber & nMask)ON(MAX5353_DIO);else OFF(MAX5353_DIO);nMask >>= 1;MAX5353Clock(1);}OFF(MAX5353_DIO);MAX5353Clock(1);ON(MAX5353_CS);}//==============================================================================
//                END OF THE FILE : MAX5353.C
//------------------------------------------------------------------------------
/*
**==============================================================================
** MAX1240.H:            -- by Dr. ZhuoQing, 2020-07-28
**
**  Description:
**
**==============================================================================
*/
#ifndef __MAX1240__
#define __MAX1240__
//------------------------------------------------------------------------------
#ifdef MAX1240_GLOBALS#define MAX1240_EXT
#else#define MAX1240_EXT extern
#endif // MAX1240_GLOBALS
//------------------------------------------------------------------------------
//==============================================================================
#define MAX1240_CS          5, 4
#define MAX1240_CLK         3, 3
#define MAX1240_DIO         3, 2
//------------------------------------------------------------------------------
void MAX1240Init(void);void MAX1240Delay(unsigned char ucDelay);
unsigned int MAX1240Read(void);//==============================================================================
//             END OF THE FILE : MAX1240.H
//------------------------------------------------------------------------------
#endif // __MAX1240__
/*
**==============================================================================
** MAX1240.C:             -- by Dr. ZhuoQing, 2020-07-28
**
**==============================================================================
*///------------------------------------------------------------------------------
#define MAX1240_GLOBALS        1              // Define the global variables
#include "intrins.h"
#include "MAX1240.H"
#include "C51BASIC.H"
#include "STC8G.H"//------------------------------------------------------------------------------void MAX1240Init(void) {ON(MAX1240_CS);OFF(MAX1240_CLK);ON(MAX1240_DIO);PM_PP(MAX1240_CS);PM_BIDIR(MAX1240_DIO);PM_PP(MAX1240_CLK);
}void MAX1240Delay(unsigned char ucDelay) {unsigned char j;for(j = 0; j < ucDelay; j ++) {_nop_();_nop_();_nop_();_nop_();_nop_();}}unsigned int MAX1240Read(void) {unsigned int nNumber, i;PM_BIDIR(MAX1240_DIO);ON(MAX1240_DIO);OFF(MAX1240_CLK);OFF(MAX1240_CS);for(i = 0; i < 100; i ++) {MAX1240Delay(100);if(VAL(MAX1240_DIO)) break;}if(VAL(MAX1240_DIO) == 0) return 0x0;nNumber = 0;for(i = 0; i < 12; i ++) {ON(MAX1240_CLK);MAX1240Delay(10);OFF(MAX1240_CLK);MAX1240Delay(10);nNumber <<= 1;if(VAL(MAX1240_DIO)) nNumber |= 0x1;}for(i = 0; i < 4; i ++) {ON(MAX1240_CLK);MAX1240Delay(10);OFF(MAX1240_CLK);MAX1240Delay(10);}ON(MAX1240_CS);return nNumber;
}//==============================================================================
//                END OF THE FILE : MAX1240.C
//------------------------------------------------------------------------------

※ 结论


  • DAC比率:

ADC=0.76168x1000−0.01134ADC = {{0.76168x} \over {1000}} - 0.01134ADC=10000.76168x​−0.01134

  • ADC比率: 0.6035/1000。
    数值理论值为:2.54095=0.61035×10−3{{2.5} \over {4095}} = 0.61035 \times 10^{ - 3}40952.5​=0.61035×10−3

  1. AD设计工程文件:AD\Tools\2020\ADDASTC8G1K08\ADDASTC8G1K08.SchDoc * ↩︎

  2. C51工程文件:C51\STC\Tools\2020\ADDAST8G1K\ADDASTC8G1k.uvproj ↩︎

设计基于MAX1240,MAX5353的ADDC模块STC8G1KSOP8相关推荐

  1. 单片机设计:基于stm32智能语音识别蓝牙音响(ld3320语音识别模块+mp3模块+喇叭+点阵屏+OLED+蓝牙+手机app)

    单片机设计:基于stm32智能语音识别蓝牙音响(ld3320语音识别模块+mp3模块+喇叭+点阵屏+OLED+蓝牙+手机app) 一.主要功能: 1.手机app播放内存卡的音乐.同时点阵屏随音乐进行跳 ...

  2. 基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块+DHT11温湿度采集+MQ系列 烟雾及可燃气体+蜂鸣器+步进电机模拟窗帘+OLED液晶显示+

    ## **基于 STM32 的语音识别智能家居控制系统的设计(LD3320语音识别芯片+ESP8266 WIFI模块(阿里云 或ONENET或局域网)+DHT11温湿度采集+MQ系列 烟雾及可燃气体+ ...

  3. 基于FPGA的LD3320语音识别模块驱动设计

    一.设计要求 以FPGA为控制核心,接收语音控制信号和识别控制信息: 通过继电器完成对热水器.加湿器.空调等三个家用电器的控制: 二次升级要求:使用无线模块完成对热水器.加湿器.空调等三个家用电器的控 ...

  4. STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计

    1.系列总述 从现在开始将会进入四轴无人机的制作,我是第一次制作四旋翼,从前没有接触过这个方面,手边的参考资料只有一本四轴的设计书和正点原子F405飞控的源码,所以代码逻辑设计方面肯定有所欠缺,大家可 ...

  5. c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...

    gd工程职业技术学院毕业论文 基于C语言的推箱子游戏设计 Design of the push box Based on Combined Language 作者姓名: 学科专业: 应用电子技术 学院 ...

  6. 工厂供电MATLAB仿真,工厂供电课程设计---基于MATLAB的电力电子系统仿真

    工厂供电课程设计---基于MATLAB的电力电子系统仿真 课题名称基于 MATLAB 的电力电子系统仿真 ((一一)) 交流交流.直流变流器直流变流器 交流-直流变流器又称整流器.AC-DC 变流器, ...

  7. 计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码

    计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言:Ja ...

  8. 基于单片机的TLC稳压电源系统设计-基于单片机大脑运算能力智力测试仪-基于单片机超声波测距系统仿真设计(报告 PCB 原理图)-基于单片机超高精度电参数测试设计-基于单片机变电站变压器运行参数监测仿真

    1316基于单片机的TLC稳压电源系统设计-毕设课设仿真资料 三极管射极电压是稳压电源的输出电压,可以接用电器或负载,这个电压值通过TLC549(A/D,同TLC548)数据转换后,送往单片机处理并显 ...

  9. 基于单片机超声波视力保护系统设计-基于51单片机8音键电子琴仿真设计-基于8086八路模拟信号采集均值显示系统设计-基于8086八路数据电压温度采集系统-基于8086波形发生器仿真设计【毕设课设分享】

    539基于单片机超声波视力保护系统设计-设计资料 硬件构成:单片机+最小系统+LCD1602液晶显示模块+超声波模块+DS18B20温度采集模块+光线检测模块+ADC0832模块+蜂鸣器模块+LED指 ...

最新文章

  1. BugkuCTF多种方法解决
  2. docker:Error running DeviceCreate (createSnapDevice) dm_task_run failed
  3. Flink状态管理与CheckPoint、Savepoint
  4. 下周开幕,给深圳的电子工程师准备的展会!
  5. 看漫画,学Linux内核!看完明白小企鹅们在干啥了吧?
  6. Windows socket之最简单的socket程序
  7. BZOJ2435 [Noi2011]道路修建
  8. 企业实战案例01_Jenkins_连接远程执行shell脚本
  9. Docker初级选手(一)
  10. MySQL学习-连接查询
  11. C++与Rust变量声明的比较
  12. Java代码执行Linux脚本
  13. 和秋叶一起学PPT之快速标准化长文档(课时三)
  14. 进销存excel_进销存管理系统excel模板
  15. SSM和SSH框架总结
  16. 计算机四级数据库分值分布,计算机四级数据库工程师考试成绩查询注意事项
  17. _crol_和_cror_的使用
  18. 图神经网络(ICML2022)
  19. Geoserver发布OSM官网地图
  20. 骑行318、 2016.7.13

热门文章

  1. PV操作——生产者和消费者
  2. something new
  3. 为何那么多人的网名都叫易天啊
  4. 易宝典——玩转O365中的EXO服务 之三十六 为软删除邮箱启用就地保留
  5. 多线程编程实战(一)
  6. MySQL数据库查询中的特殊命令
  7. 我的angularjs源码学习之旅2——依赖注入
  8. Windows 10浏览器Edge和Chrome大比拼
  9. [转载]xcode5时代如何设置Architectures和Valid Architectures
  10. 条件独立(conditional independence) 结合贝叶斯网络(Bayesian network) 概率有向图 (PRML8.2总结)...