ARM
期
末
考
试
论
文
班级:电气XX
姓名:XXXX
学号:XXXXXX 完成日期:20XXXXX
基于ARM的5通道数据采集系统
摘要:随着计算机技术的发展,对数据进行采集和处理越来越重要,尤其是对数据的处理更要求实现多通道与精确度。从而51单片机、ARM7/ARM8等各种微处理器的广泛应用,为数据采集系统提供了一个广阔有效的平台。一个完整的数据采集系统应该包括信号、传感器或者执行机构、信号调理、数据采集设备和软件等方面。本文介绍基于ARM7处理器的高速高精度、多通道数据采集系统的设计,首先介绍数据采集系统的总体设计,其次介绍了基于ARM7处理器S3C44BOX和模数转换芯片AD7663的接口电路,然后对模拟信号调理电路设计进行了讨论,利用ARM7处理器S3C44B0X丰富的接口功能以及较高的工作频率来实现对多通道信号的采集和数据处理的功能。将系统化分成各个功能单元并对各个功能模块进行分析,并编写了程序。该系统具有成本低、功耗低、识别性能强及智能程度高等优点。因此本文设计的是5通道数据采集系统。
关键词:S3C44B0X 数据采集多通道 ARM
1.论文的内容介绍
ARM处理器在现实生活中广泛的被使用,在手机、电脑以及路由器等电子产品中。本文以基于ARM7的嵌入式系统为核心,综合应用高精度数据采集方法和网络通信接口技术,实现了基于ARM7的通用数据采集装置。考虑到数据的采集速度、精度和系统可扩展性,实现高速和高精度信号采集、显示及传输等功能。因此我选用了Samsung公司的ARM7微控制器S3C44B0X,设计出了一个5通道数据采集系统。
第一、首先介绍系统的设计方案以及ARM7微控制器S3C44B0X,说明数据采集的基本原理和数据采集系统的总体设计。
第二、介绍采集系统的硬件设计。首先说明硬件总体设计,然后根据总体设计划分的模块对各个模块进行了详细的设计和实现。
第三、介绍数据采集系统的软件设计。数据采集模块功能实现以及一些子程序的设计。第四、编写程序实现功能。
2.数据采集系统的总体设计
2.1 数据采集系统设计目标
本文设计了一种基于ARM7微处理器S3C44B0X的高速、高精度、多通道数据采集系统。主要设计目的是
(1) 可靠性高。它是系统设计的一个重点。由于数据采集系统往往是安放在被控对象的工作环境中。所以不仅温度、湿度大,干扰也很多。要求系统有较好的抗干扰能力和采集速度。
(2) 实时性强。系统的主要工作是对大量的过程状态参数实时监测、数据存储、数据处理、进行实时数据分析等。因此要求硬件上必须要有实时时钟和优先级中断信息处理电路。(3) 结构简单、功耗低、性能好。
(4)具有强大能力处理数据,分辨率高、采样速率高。
2.2 系统的整体设计
本文设计的高速高精度数据集系统有硬件和软件两部分组成。
硬件部分主要完成数据采集、存储功能,软件部分则完成对硬件控制、对采集数据进行处理。
2.3 微控制器S3C44B0X
系统的控制核心S3C44B0X。本设计基于Samsung公司的S3C44B0X(ARM7TDMI内核)微处理器,配合ADI公司的16bit/250kSPS模数转换芯片AD7663,设计出了一个多通道数据采集系统。S3C44B0X是Samsung公司推出的16/32位采用了ARM7TDMI核的处理器,最高为66MHz。为了降低系统成本和减少外围器件,S3C44B0X提供了丰富的内置部件,包括:8KB Cache、内部SRAM, LCD控制器、带自动握手的2通道UART、4通道DMA、外部存储器控制器、带有PWM功能的5通道定时器、71个通用IO口、实时时钟(RTC)、8通道10位ADC、8个外部中断源、I2C总线控制器、I2S总线控制器、同步SIO接口和PLL倍频器等。此外,S3C44B0X 还采用基于ARM的嵌入式数据采集与显示系统研制了一种新的总线结构,即SAMBA II(三星ARM CPU嵌入式微处理器总线结构)。S3C44B0X通过提供全面的、通用的片上外设,大大减少了系统电路中除处理器以外的元器件配置从而最小化了系统的成本。
2.4 模块化说明
系统以S3C44B0X为数据采集模块核心处理器。采用模块化方法设计按照功能的不同,分为电源电路、通道选择电路、模数转换电路、通信电路、多路开关及信号调理电路、计算机人机交互界面部分等。多通道数据采集系统整体结构图2-4所示
图2-4 多通道数据采集系统整体结构图
2.5 高速高精度数据采集系统的电路框图
多通道数据采集系统工作流程:
传感器输入的模拟信号经过信号调理电路的处理,包括隔离、变换、放大、滤波等各种处理,以满足数模转换芯片对输入电平和信号质量的要求,然后通过多路开关进行信号选择 选通的信号由高性能高速电压反馈放大器AD8021的进一步的处理获得更精确度更高的模拟信号。在微处理器的控制下模拟信号通过16位逐次渐近型模数转换器AD7663的转换处理存入数据缓存,进一步通过S3C44B0X处理器的控制的显示、键盘模块实现人机交换功能。同时多路开关的选择与控制有微处理器控制。
软件部分的设计分为两个部分:分别为数据采集系统控制软件和数据程序处理两个部分。软件设计共包括五部分:开关通道选择、数据采集处理、数据存储、数据显示和键盘控制。系统各模块功能概述
(1) 多路开关及信号调理模块
模拟多路开关是数据采集系统的一个重要部分。通常在多路被测信号共用一路A/D转换器的采集系统中用来把多路信号有条理的传送到A/D转换器中去,以完成多路信号的数据采集。信号调理电路主要用来对传感器输入的信号进行隔离、变换、放大、滤波等各种处理。多路
开关由微处理器S3C44B0X进行控制选择。
(2) 模数转换模块
本模块由两部分组成,信号驱动放大器AD8021与具有低噪声、高精度和出色的长期稳定特性的基准电压源ADR421提供基准电压的模数转换芯片AD7663。
传感器输入的信号通过多路开关及信号调理模块处理后得到比较符合要求的模拟信号 进一步通过信号驱动放大电路AD8021的处理得到精度较高的、稳定的模拟信号,通过模数转换芯片AD7663的作用,输出符合要求的数字信号,完成模数转换。
(3) 存储模块
本设计采用的是SST39VF160芯片.它具有成本低和密度大的优点,能很好的完成本系统的存储要求,把通过内部AD7663模块转换成数字量,经通信端口送入计算机进行下一步处理。
(4) 键盘模块
键盘扫描过程就是有规律的时间间隔查看键盘,以确定是否有键被按下。一旦处理器判定有一个键被按下键盘扫描程序就会消抖然后再判定是哪个键被按下。本设计就是采用的是普通键盘,完成人机交换的键盘控制。
(5) 显示模块
微处理器S3C44B0X内部有一个LCD控制器,只需要在外部接一个液晶驱动模块就可以具有显示功能了。本设计设置了LCD液晶显示驱动模块与S3C44B0X的连接模式,包括接口方式,寄存器的编程。本模块达到了微处理器与显示器的数据传输实现了显示的功能。
本设计主要有这五个模块组成,他们在一起共同组成了本数据采集系统的硬件。软件设计是数据采集系统的硬件控制部分,它们共同构成了高速高精度多通道数据采集系统。
如图 2-5高速高精度数据采集系统的电路框图。
2-5 高速高精度数据采集系统的电路框图
3.硬件电路设计
3.1 多路开关及信号调理模块设计
3.1.1 信号调理模块
信号采集系统中,绝大多数模拟量输入都带有大量的噪声不能直接输入到模数转换器中去需要对信号进行调理。信号调理电路用来对传感器输入的信号进行隔离、变换、放大、滤波等各种处理,以满足模数转换芯片对输入电平和信号质量的要求。调理电路如图3-1-1所示。
图3-1-1 信号调理电路
AD623是高精度、低噪声的仪表放大器。R1是输入限流电阻,R2是增益电阻,调节此电阻的值可改变AD623的增益G。算式为G=100/R1(kΩ)+1。
MAX291是滤波器。截止频率其由电容C1决定。若设为100Hz:fc(kHz)=1000/3C1(pF)计算得C1取值为3300pF。使用中还要注意MAX291的零点漂移达-200mV~-400mV 因而可在输出端串接一个10μF左右的钽电容,隔去MAX291引入的直流分量。
3.1.2 多路开关的选择
本系统选用的是8通道的模拟数据选择器MAX308,输出哪路信号通过总线控制。带串行接口的16位模数转换集成电路,ADC它的转换速度快、功率消耗低,功耗为210mW。该输入可以接收TTL或CMOS的信号电平,时钟频率0.1-5.5MHz。
其电路图如图3-1-2所示。
图3-1-2多路开关MAX308
IN1~IN8是模拟输入通道,模拟信号由此输入。A0~A2是通道选择信
号,其选择由微处理器S3C44B0X控制。若数据采集系统,有5路模拟量输入通道,每路信号最高频率可达50KHz,若要保证采样的信号不失真,则多路开关的切换速度(采样速度)不低于至少为400KHz。
3.1.3 模数转换模块
模数转换是把数据采集系统采集到的模拟信号转换成系统可以识别并处理的数字信号。它
的精度与速度如何将影响到系统的现实性和系统的性能。
3.1.4 基准电压源ADR421
高分辨率的模数转换系统需要精准可靠的基准电压 ADR421是基于XFET技术的基准电压源,具有极高的精度和极低的噪声。可想AD7663输出稳定的2.500V基准电压电。电路图如图3-1-4。
图3-1-4 基准电压源ADR421
3-1-5 模数转换芯片的选择
A/D转换器实际上是将模拟信号转换成数字量的装置 其转换工程主要包括采样、量化、编码三个步骤。
A/D芯片是数据采集系统的关键部件。
图3-1-5 模数转换接口电路
对于一般的工业采集系统在保证精度和速度的条件下,要尽量提高采样速度,以满足实时采集、实时处理和实时控制的要求。若数据采集系统,有5路模拟量输入通道,每路信号最高频率可达50KHz,若要保证采样的信号不失真,则多路开关的切换速度(采样速度)不低于至少为400KHz。根据这些参数本系统中选择开关电容结构的16位并行A/D转换器AD7663。 3-1-6 计算机RS-232串行通信接口
计算机一般提供了2个25针或者9针的RS-232标准串行口,简称COM1和COM2。我们还可以通过插通信卡来获得额外的RS-232标准串行口。利用这些串口可以与其他数字设备进行一般的数据通信,计算机串行接口主要应用于远程通信和低速输出设备。由于串行数据通信传输线条数最少。而且有许多较便宜的专用芯片来实现它,发送和接受器也简单。因而对数据传输速度不高的计算机和数字设备间的进程通信,多采用串行通信实现。
随着计算机的迅速普及和计算机控制技术的发展,计算机被广泛应用于控制领域之中。在控制系统中,下位机主要完成对现场数据采集和对设备一级的监控,上位机则要完成对整个系统的采集、分析、处理和控制以及数据、图形显示、打印、人机对话等工作。上位机与下位机大多是通过PC机的RS-232串行接口实现通信。文中的ARM开发板与PC机之间也是通过RS-232串行接口实现通信。
串口主要是用于通信的。串口负责打印一些必要的调试信息和交互一些人机命令以及完成大固件程序的下载和升级。另外由于串行RS-232的电平和S3C44B0X的I/O口电平不同电平的转换使用了串行接口芯片MAX3232。其接口电路如图3-1-6所示。
3-1-6 串口接口电路
因此可以使采样速度不低于400Khz数据通过串口2显示出来。
4.采集系统的软件设计
4-1数据采集模块程序框图
图4-1 数据采集模块程序框图
4-2 数据转换程序图
图 4-2 数据转换程序图
AD7663的输入阻抗仅为3.41kΩ 若MAX308输出的信号直接输入AD7663进行A/D转换时会产生较大的增益误差。因此,必须用阻抗极低的信号源来驱动AD7663的输入端。这里选用了信号驱动放大器AD8021。为了实现高速高精度数据采集与存储的同步,实现了数据的实时采集。AD转换是数据采集的核心,它决定着系统数据采集的精度和速度。
本设计采用的是AD7663模数转换器。AD7663是一款16位、250KSPS、低功耗、逐次逼近型模数转换器,采用5V单电源供电,并提供8位或16位并行口和一个串行口。AD7663具有分辨率高、采样速率高、功耗小等优点。在高速高精度的数据采集系统中得到了广泛的应用。
4-3 多通道数据采集系统
描述:用ADC连续采集5路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。
主程序如下:
#include "stm32f10x.h"
#include "eval.h"
#include
#define N 400
#define M 5
vu16 AD_Value[N][M];
vu16 After_filter[M];
int i;
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
}
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0x08); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph _GPIOC|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1, ENABLE ); RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
}
void ADC1_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode=ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = M;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6, ADC_SampleTime_239Cycles5 ); ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /
DMA_InitStructure.DMA_BufferSize = N*M;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
}
void Init_All_Periph(void)
{
RCC_Configuration();
GPIO_Configuration();
ADC1_Configuration();
DMA_Configuration();
//USART1_Configuration();
USART_Configuration(9600);
}
u16 GetVolt(u16 advalue)
{
return (u16)(advalue * 330 / 4096); }
void filter(void)
{
int sum = 0;
u8 count;
for(i=0;i<5;i++)
{
for ( count=0;count { sum += AD_Value[count][i]; } After_filter[i]=sum/N; sum=0; } } int main(void) { u16 value[M]; init_All_Periph(); SysTick_Initaize(); ADC_SoftwareStartConvCmd(ADC1, ENABLE); DMA_Cmd(DMA1_Channel1, ENABLE); while(1) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); filter(); for(i=0;i<5;i++) { value[i]= GetVolt(After_filter[i]); printf("value[%d]:\t%d.%dv\n",i,value[i]/100,value[i]0) ; delay_ms(100); } } 总结: 该程序中的两个宏定义M和N分别代表有多少个通道,每个通道转换多少次,可以修改其值。将转换值由二进制转换为十进制时,要先扩大100倍,方便显示小数。