分享TI LM3S811开发板使用心得 之高精度采集卡制作

2019-08-06 16:38发布

本帖最后由 lilihua0721 于 2011-11-30 21:51 编辑

   以下是我使用TI MCU制作高精度采集卡的全部资料,包括硬件搭建原理图、软见工程文件,液晶资料及ADS1211资料,详情请参考附件。
分别放在以下连续的8个楼层中,有不足的地方请大家指教!
效果图展示:


采集界面.jpg 采集结果显示.jpg 差分正向数据接3.3反向输入端接0.jpg
一、基于LM3S811ADS1211数据采集卡设计硬件部分(全部电路请参考附件)
对于硬件我是采用以前的做的一块ADS1211采集卡板跳线来完成实验的,目前并没有针对LM3S811设计PCB板,在这里给出测试原理图。
1、电源部分及ADS1211的外围电路设计:
在测量过程中,电源是影响测量精度大的因素,所以电源必须要稳定。
以下是我设计的电源部分及ADS1211的外围电路设计。 电源与ADS1211电路.JPG

2、ADS1211差分输入信号的隔离:
采用了LM324用于电压跟随,在此没有做放大(测试差分输入电压为0~5V
具体如下图:
差分隔离输入电路.JPG

3、串口通信电路:
考虑到通讯的距离及稳定性采用了MAX232转换为RS232电平,
具体参考如下: RS232连接电路.JPG

3、LM3S811ADS板接口连接: 接口部分.JPG

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
lilihua0721
2019-08-06 19:32
本帖最后由 lilihua0721 于 2011-11-27 20:57 编辑

一、基于LM3S811ADS1211数据采集卡设计软件部分(完整工程文件请参照附件工程文件)
ADS1211读写流程.JPG
ADS1211读写流程
1、mian.c

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "ADS1211U.h"
#include "Type.h"
#include <stdio.h>
#include <string.h>
#include <math.h>

double UVal;//计算电压值,
char str[60];//存放显示字符串
INT32U ADdata; //24 AD转换器采集到的AD
INT32U  Value; //存放转换电压值放大10000倍的结果
INT16U  integer=0;// 待转换为字符串整数部分
INT16U  decimal=0;// 待转换为字符串小数部分
INT8U i=0; // 记录当前显示通道

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

/**************************************************************************************
函数名: void UARTIntHandler(void)
  : 接受中断处理
  : 从接受FIFO中取出数据然后发送出去
  入:无

  出:无
  他:无
**************************************************************************************/

void UARTIntHandler(void)
{
INT32U ulStatus;

//
获取中断状态

ulStatus = UARTIntStatus(UART0_BASE, true);

//
清中断

UARTIntClear(UART0_BASE, ulStatus);

//
查接受FIFO是否存在数据

while(UARTCharsAvail(UART0_BASE))

{
//
从接受FIFO接受到数据后然后通过发送FIFO发送出去

UARTCharPutNonBlocking(UART0_BASE, UARTCharGetNonBlocking(UART0_BASE));

}

}
/*****************************************************************************
函数名: CreanLcd(INT16U
usColor,INT16U X0,INT16U Y0,INT16U X1,INT16U Y1)

  : 清指定区域的,用usColor颜 {MOD}对指定区域进行填充
  : 清液晶指定区域
  入:usColor填充颜 {MOD}
      X0 Y0第一点左上坐标
               X1
Y1
第一点右下坐标

  出:无
  他:无
*******************************************************************************/
void CreanLcd(INT16U
usColor,INT16U X0,INT16U Y0,INT16U X1,INT16U Y1)

{
INT8U
CmdData[6]={0xAA,0x64,0xCC,0x33,0xC3,0x3C};

INT8U
i=0;

//
发送帧头

for(i=0;i<2;i++)

{

UARTCharPutNonBlocking(UART0_BASE, CmdData);

}

SysCtlDelay(2*SysCtlClockGet()/3000);

//
发送填充颜 {MOD}

UARTCharPutNonBlocking(UART0_BASE, usColor>>8);

UARTCharPutNonBlocking(UART0_BASE, usColor);

SysCtlDelay(2*SysCtlClockGet()/3000);

//
发送左上LCD地址

UARTCharPutNonBlocking(UART0_BASE, X0>>8);

UARTCharPutNonBlocking(UART0_BASE, X0);

UARTCharPutNonBlocking(UART0_BASE, Y0>>8);

UARTCharPutNonBlocking(UART0_BASE, Y0);

SysCtlDelay(2*SysCtlClockGet()/3000);

//
发送右下LCD地址

UARTCharPutNonBlocking(UART0_BASE, X1>>8);

UARTCharPutNonBlocking(UART0_BASE, X1);

UARTCharPutNonBlocking(UART0_BASE, Y1>>8);

UARTCharPutNonBlocking(UART0_BASE, Y1);

SysCtlDelay(2*SysCtlClockGet()/3000);

//
发送帧尾及校验位

for(i=2;i<6;i++)

{

UARTCharPutNonBlocking(UART0_BASE, CmdData);

SysCtlDelay(SysCtlClockGet()/3000);

}

}

一周热门 更多>