01简介

构建多路16bit的AD采集器,并可以进行高速缓存,对于采集静态电压,还是动态波形都非常有利。在23LC1024四线访问数据博文中介绍了对扩展SPI接口RAM(128kB)的四线制高速访问的方法。在AD7606八通道AD采集模块测试博文中给出了基于AD7606芯片的AD采集电路模块的测量。在博文扩展32KRAM的STC8H8K信号采集版中给出了利用WiFi-UART模块,实现采集数据的高速无线传送。

▲ 插图|来自网络

下面给出了该系统的设计以及相关调试结果。


02电路系统设计

1. 电路设计

就在23LC1024四线访问数据的基础上1,增加WiFi接口,完成模块的设计。

▲ 电路原理图

铺设PCB适合于单面PCB快速制版。

▲ PCB图


03电路测试

1.硬件测试

在正式下载程序之前,对电路施加5V工作电源,测量对应的静态工作电流,LM1117输出的3.3V电压信号。

1)对单片机的硬件配置

参考在“23LC1024四线访问数据”中对单片机的配置,设置单片机IRC工作频率为35MHz.

▲ 通电后的电路

2) 下载程序进行交互测试23

下位机中的响应交互程序代码片段为,这是用来测试23LC1024串行SPI接口的RAM功能。

    else IFARG0("rm") {ucChar = LC1024ReadMode();printf("LC1024 mode:%bx\r\n", ucChar);} else IFARG0("wm") {sscanf(SDA(1), "%bx", &ucChar);LC1024WriteMode(ucChar);ucChar = LC1024ReadMode();printf("LC1024 mode:%bx\r\n", ucChar);

通过使用rd, wr来对23L1024进行读写测试。,验证读写正常。

2.测试AD转换功能

交互代码如下:

    } else IFARG0("data") {AD7606Convert();AD7606ReadData(nAD, 4);        for(i = 0; i < 8; i ++) {printf("%d ", nAD[i]);}printf("\r\n");} else IFARG0("datamean") {sscanf(SDA(1), "%d", &nSize);if(nSize == 0) nSize = 1;for(i = 0; i < 8; i ++) lnADSigma[i] = 0;for(i = 0; i < nSize; i ++) {AD7606Convert();AD7606ReadData(nAD, 4);for(j = 0; j < 8; j ++) lnADSigma[j] += nAD[j];}for(i = 0; i < 8; i ++) {printf("%d ", (int)(lnADSigma[i] / nSize));            }printf("\r\n");} else IFARG0("rangeon") {ON(AD7606_RANGE);} else IFARG0("rangeoff") {OFF(AD7606_RANGE);}

▲ 连接有AD7606测试系统

  • 使用data:获取当前采样一次的数值;
  • 使用datamean:获取相近采集平均数据。命令: datamean , 其中参数你标示采集数据平均的结果。
  • rangeon: 设置采集电压范围±10V\pm 10V±10V。
  • rangeoff:设置采集电压范围:±5V\pm 5V±5V。

3.测试中断内采集

使用Timer2实现10kHz的中断频率。在其中断程序里完成AD7606的8路16bit数据采集,并存储在23LC1024中。

1) 设置Timer2

//==============================================================================
#if TIME2_INT_EN
//------------------------------------------------------------------------------
void Timer2Init(void) {AUXR |= 0x04;       T2L = 0x54;        T2H = 0xF2;        IE2 |= 0x4;                         // 7:ETKSU1 6:ET4: 5:ET3: 4:ES4: 3:ES3, 2:ET2, 1:ESPI, 0:ES2AUXR |= 0x10;     //--------------------------------------------------------------------------g_nTimer2IntCount = 0;    }void Timer2ISR(void) interrupt 12 using 1 {int nAD[8];unsigned char * p;unsigned char i;g_nTimer2IntCount ++;//----------------------------------------------------------------------    if(g_ucADSampleFlag) {AD7606Convert();AD7606ReadData(nAD, 4);p = (unsigned char *)nAD;LC1024WriteBegin(g_ucAdd2, g_ucAdd1, g_ucAdd0);for(i = 0; i < 16; i ++) LC1024Write(*(p ++));LC1024ReadWriteEnd();g_ucAdd0 += 16;if(g_ucAdd0 == 0) {g_ucAdd1 ++;if(g_ucAdd1 == 0)g_ucAdd2 ++;}}
}
#endif // TIME2_INT_EN

在STC8G指令中,上述使用unsigned char 的指针来访问int数字,将相应的8个short整型数据写入SPI接口的23LC1024内部。在C51中是按照Big-Endian模式存储数据的。所以在通过bytes回复int16的过程中,是高字节在前,低字节在后。

▲ Big-Endian vs. Little-Endian

2) 测量转换时间

在实验“AD7606八通道AD采集模块测试”中,测量了AD7606转换函数AD7606Convert的执行时间大约为TAD=4.17μsT_{AD} = 4.17\mu sTAD​=4.17μs。

通过测量LC1024的片选信号CS信号可以测量LC1024写入16个字节所需要的时间。在23LC1024四线访问数据中给出了LC1024的片选信号在PIN1。

▲ 测量LC1024的CS信号,确定写入16个字节所需要的时间

LC1024连续写入16个字节(AD7606转换的8个16bitAD结果)所需要的时间为:TWR=24.3μsT_{WR} = 24.3\mu sTWR​=24.3μs.。

那么在Timer2的10k中断的时间Tint=100μsT_{{\mathop{\rm int}} } = 100\mu sTint​=100μs内,所需要执行的AD转换和存储所需要的总时间大约为:TT2=TAD+TWR=4.17+24.3=28.47μsT_{T2} = T_{AD} + T_{WR} = 4.17 + 24.3 = 28.47\mu sTT2​=TAD​+TWR​=4.17+24.3=28.47μs

占用中断时间大太阳30%的时间。

3)修改UART1优先级

由于TImer2占用了30% 的时间,就影响了UART1通过460800波特率接收对应的上位机的指令,出现了丢失字符的现象。
需要通过修改Timer2,UART1的优先级来进行调整。使得UART1能够中断Timer2接收上位机的指令。

STC8G内部的中断源定义如下图所示。总共分为4个中断优先级别。0:为最低,3:为最高优先级。

▲ STC8G 内部中断源的定义

UART1的优先级是由IP,IPH中的4bit定义; Timer2的优先级始终为0(最低)。

▲ UART,TIMER2

通过将IP,IPH中的PS,PSH修改成1, 定义为优先级为3(最高),就可以使得UART1中断Timer2完成串行命令的接受el。

▲ 确定串口优先级的IP,IPH寄存机对应的位定义

在原来的C51Basic中UARInit()函数中增加如下代码,对其中IP, IPH修改其中的bit4。

    //--------------------------------------------------------------------------
#if UART1_INT_ENIP |= 0x10;                             // Set Serial1 Interrupt prority as 3IPH |= 0x10;g_ucUART1BufferHead = g_ucUART1BufferTail = 0;g_ucTIFlag = 0;ES = 1;
#endif //  UART1_INT_EN

修改完之后,便可以解决原来接收上位机指令丢失字符的问题了。

4. 获取采集的信号波形

在串口命令中增加了如下控制命令,可以获得AD采集到的波形信号。

▲ 采集的信号波形,使用示波器观察到的

▲ 获得采集后的信号波形

更换三角波形:

▲ 输入三角波形

▲ AD7606采集到的三角形好的波形

    } else IFARG0("showad") {nSize = 0x100;ucChannel =1 ;if(STD_NUM > 1) sscanf(SDA(1), "%d", &nSize);if(STD_NUM > 2) sscanf(SDA(2), "%bd", &ucChannel);STOP_SAMPLE;//----------------------------------------------------------------------lnAddress = GetADAddress();lnAddress -= nSize * 16;ucAdd2 = (unsigned char)(lnAddress >> 16);ucAdd1 = (unsigned char)(lnAddress >> 8);ucAdd0 = (unsigned char)lnAddress;LC1024ReadBegin(ucAdd2, ucAdd1, ucAdd0);for(i = 0; i < nSize; i ++) {pData = (unsigned char *)nAD;for(j = 0; j < 16; j ++) *(pData ++) = LC1024ReadByte();for(j = 0; j < ucChannel; j ++) printf("%d ", nAD[j]);}LC1024ReadWriteEnd();        printf("\r\n"        );START_SAMPLE;} else IFARG0("showadbin") {nSize = 0x100;ucChannel =1 ;if(STD_NUM > 1) sscanf(SDA(1), "%d", &nSize);if(STD_NUM > 2) sscanf(SDA(2), "%bd", &ucChannel);STOP_SAMPLE;//----------------------------------------------------------------------lnAddress = GetADAddress();lnAddress -= nSize * 16;ucAdd2 = (unsigned char)(lnAddress >> 16);ucAdd1 = (unsigned char)(lnAddress >> 8);ucAdd0 = (unsigned char)lnAddress;LC1024ReadBegin(ucAdd2, ucAdd1, ucAdd0);for(i = 0; i < nSize; i ++) {pData = (unsigned char *)nAD;for(j = 0; j < 16; j ++) SendChar(LC1024ReadByte());}LC1024ReadWriteEnd();        START_SAMPLE;}

下面的代码是不带Buffer版本的外部命令。它可以连续读取AD7606转换的数值。
具体实现是通过 C51-Ver2:NoBuffer。

if(strcmp("hello",                (char *)STD_ARG[0]) == 0)printf("%s is ready !\r\n", VERSION_STRING);
else IFARG0("ad") {sscanf(SDA(1), "%d", &nNumber);sscanf(SDA(2), "%d", &nChannel);sscanf(SDA(3), "%d", &nWaitTime);g_ucWaitMS = 0;for(i = 0; i < nNumber; i ++) {while(g_ucWaitMS != nWaitTime);g_ucWaitMS = 0;AD7606Convert();AD7606ReadData(nData, 4);for(j = 0; j < nChannel; j ++) {nNum = nData[j];SendChar((unsigned char)(nNum >> 8));SendChar((unsigned char)nNumber);}}
}
else IFARG0("adtext") {sscanf(SDA(1), "%d", &nNumber);sscanf(SDA(2), "%d", &nChannel);sscanf(SDA(3), "%d", &nWaitTime);g_ucWaitMS = 0;for(i = 0; i < nNumber; i ++) {while(g_ucWaitMS != nWaitTime);g_ucWaitMS = 0;AD7606Convert();AD7606ReadData(nData, 4);for(j = 0; j < nChannel; j ++) {nNum = nData[j];printf("%d ", nNum);}}
} else IFARG0("ad5v") {OFF(AD7606_RANGE);
} else IFARG0("ad10v") {ON(AD7606_RANGE);
}

04结论

经过测试,基于AD7606的八路AD采样板基本上达到了设计要求,可以用于之后的信号处理的实验。


  1. 电路工程文件:AD\Test\2020\TestAD7606STC\TestAD7606STC8G.SchDoc ↩︎

  2. C51程序工程Ver1:C51\STC\Test\2020\testAD76068G1K\TestAD76068G.uvproj ↩︎

  3. C51程序-NoBuffer:C51\STC\Tools\AD7606\Sample8G1KNoBuffer\Sample8G1KNoBuffer.uvproj ↩︎

带有128KB缓存的AD7606模拟采集板相关推荐

  1. 超高速信号采集板CPCI6U-ADC-1Ch5G

    CPCI6U-ADC-1Ch5G是一款6U CPCI标准超高速数据采集板.可工作于三种采集模式:单通道5Gsps.双通道2.5Gsps和四通道1.25Gsps.采集板分辨率为10bits,ADC模拟输 ...

  2. 《安富莱嵌入式周报》第313期:搬运机器人,微软出的C语言手册,开源生物信号采集板,开源SMD回流焊,开源SDR无线电,汽车级机器人评估板

    周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Pow ...

  3. 【全源码及文档】基于Java的模拟写字板的设计与实现

    摘 要 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络.多线程等重要的基础知识,因此Java语言也是学习面向对象编程和网络编程的首选语言.此简易JAVA写字板 ...

  4. FMC144 -八路14位250MSPS AD FMC-HPC模拟数字转换器板

    FMC144 -八路14位250MSPS AD FMC-HPC模拟数字转换器板 一. 板卡简介 1.1 概述 FMC144是一款具有8通道模数转换器(ADC)的FPGA夹层卡,具有14bit分辨率,大 ...

  5. 基于java的模拟写字板系统设计与实现(项目报告+开题报告+答辩PPT+源代码+部署视频)

    项目报告 基于Java的模拟写字板的设计与实现 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络.多线程等重要的基础知识,因此Java语言也是学习面向对象编程和 ...

  6. [计算机毕设]基于java的模拟写字板的设计与实现(项目报告+答辩PPT+源代码+数据库)

    项目说明报告 基于Java的模拟写字板的设计与实现 目前,很多新的技术领域都涉及到了Java语言,Java语言是面向对象编程,并且涉及到网络.多线程等重要的基础知识,因此Java语言也是学习面向对象编 ...

  7. 基于STC8G8K64U三通道高速ADC采集板

    设计采集板的目标 设计基于STC8G8K64U单片机的高速ADC采样板,可以为普通的电路实验提供快速波形采样的模块. 该模块也可以应用于全国大学生智能车竞赛声音信标组数据采集实验中. 设计采样板的技术 ...

  8. 微信小程序 本地mysql_微信小程序系列之使用缓存在本地模拟服务器数据库

    微信小程序系列之使用缓存在本地模拟服务器数据库 现在将data.js这个文件视作是本地数据库的初始化数据,要做的第一件事就是讲这些初始化数据装进缓存中,以形成数据库的初始化数据 整个应用程序的生命周期 ...

  9. 毅航产品—模拟载板I

    产品名称:母板MB-J-1000 产品名称:模拟载板I  产品型号:ANAI 出品单位:广州毅航通讯技术有限公司       产品详细介绍 ANAI模拟载板I安装在SNC-1000机箱的左边,用螺钉固 ...

最新文章

  1. XML中预定义好的实体
  2. 关于浮动float属性和position:absolute属性的区别
  3. 神马是代码简单的cmd模式,这就是!
  4. kbengine连接mysql报错
  5. 安徽省农商行计算机类考试,2017安徽农商行备考:计算机的系统组成
  6. mysql启动命令指定data目录_CentOS 7下MySQL的data目录更改后,使用mysqld服务启动失败...
  7. android+即刻点赞,Android开发仿即刻点赞文字部分的自定义View
  8. HyperX旋火游戏鼠标推荐——轻量化鼠标设计界的艺术品
  9. android 静默暗转_Android 7.0 静默安装
  10. 20135202闫佳歆-期末总结
  11. java毕业设计老师评语_java教学评价管理系统毕业设计答辩PPT.ppt
  12. 中国大学moocpython答案查询_python中国大学mooc网课答案
  13. 服务端渲染和客户端渲染
  14. win10截图软件工具
  15. 本地主机Xshell连接虚拟机Linux CentOS7
  16. C语言程序设计精髓 第2周——数字间的那些事儿,做点计算哈 练兵区——编程题
  17. 2的立方根用计算机怎样摁,立方根练习2doc用计算器求立方根.doc
  18. 计算机图像处理的未来发展,探讨计算机图像处理技术的发展趋势与展望
  19. python里的rindex是什么意思_用Python操作字符串之rindex()方法的使用
  20. js高级程序设计第四部分

热门文章

  1. [Voice communications] 让音乐响起来
  2. VS插件开发——格式化变量定义语句块
  3. C# Revert 单词反转字符串!『测试通过』
  4. Windows窗体的所有菜单
  5. java基础---JVM---java内存区域与内存溢出问题
  6. IMAX融资5000万美元,三年内要打造25个VR项目
  7. 2 关于数据仓库维度数据处理的方法探究系列——无变化维度处理
  8. SCCM2012R2之五创建系统集合
  9. Memcached进程挂掉自动重启脚本
  10. python web server comparison