1203150139谷晓波 嵌入式_嵌入式开发零基础起步
1203150139谷晓波 嵌入式由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“嵌入式开发零基础起步”。
嵌入式系统设计
嵌入式技术设计作业
——ADC数据采集系统设计
姓
名:谷晓波
系
别:信息工程系
学
号:1203150139
班
级:物联网应用技术
指导教师:张华
2014年11月
嵌入式系统设计
目录
1.设计目的..................................................................................................................1 2.设计内容..................................................................................................................1 3.设计要求..................................................................................................................1 4.设计原理..................................................................................................................1 5.裸机下实现对电压值的采集...................................................................................2
5.1设计步骤...........................................................................................................2 5.2程序设计...........................................................................................................2 6.硬件设计..................................................................................................................2 7.软件程序设计..........................................................................................................5
7.1主程序流程图及其程序...................................................................................5 8.实验步骤...................................................................................................................11 心得体会......................................................................................................................12 参考文献......................................................................................................................13
嵌入式系统设计
1.设计目的本设计包括确定控制任务、系统总体设计、硬件系统设计、软件程序的设计等,使我们进一步学习理解计算机控制系统的组成原理、接口电路与应用程序,巩固与综合专业基础知识和相关专业课程知识,提高学生运用理论知识解决实际问题的实践技能。
2.设计内容
把一个电位计输出电压到S3C2440A 的AIN0管脚,电路图如下图所示。应用ADC,编写程序得到其电压值。
(1).使用S3C2440实验箱的ADC采集模块;(2).设计相关的程序并加注释;(3).实现对电压值的采集及显示。
3.设计要求
(1)裸机下实现对电压值的采集及显示。(2)在Linux下实现对电压值的采集及显示。
4.设计原理
A/D转换的基本原理:
A/D(模/数)转换是指通过一定的电路将模拟量转变为数字量。
在实现A/D转换时,主要涉及以下几个参数:分辨率、精度、转换时间等 模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。
A/D转换后,输出的数字信号可以有8位、10位、12位和16位等。
嵌入式系统设计
5.裸机下实现对电压值的采集
5.1设计步骤
(1)单片机采集某一电压值,即经过AD转换,将电压值转换成二进制数的数字量。
(2)经过标度变换,将AD转换成二进制数的数字量变换成带有单位(伏特)的实际电压值。
(3)将计算出的实际电压值送人lcd上显示
5.2程序设计
汇编程序:
AREA INIT,CODE,READONLY
ENTRY
CODE32
LDR R0,=0x53000000
MOV R1,#0
STR R1,[R0]
LDR SP,=1024*4
IMPORT Main
B Main
END 6.硬件设计
(1)S3C2440介绍
S3C2440具有8通道模拟输入的10位CMOS工艺制作的ADC(模数转换器)。2.5MHz转换时钟下最大的转换率在500KSPS。AD转换器支持片上采样和保持功能。
3C2440的内核 ARM920T由ARM9TDMI、存储管理单元(MMU)和高速缓存三部分组成。它采用了新的总线架构Advanced Micro controller Bus Architecture(AMBA)。其低功耗、精简、高效,满足对成本和功率要求比较高的产品开发。下图是ARM920T的结构图,以及其系统组成部分的对应功能。
嵌入式系统设计
S3C2440A的A/D转换器和触摸屏接口电路
(2)S3C2440特征
1)手持设备和通用嵌入式应用的集成系统
2)16/32-位RISC架构和以ARM920T CPU为核心的强大的指令集 3)增强ARM架构的MMU支持WinCE,EPOC32和Linux 4)指令缓存,数据缓存,写缓冲和物理地址TAG RAM性能,以减少主内存带宽和 延迟的效果(3)A/D转换程序流程图
A/D 转换过程:将8路模拟量持续输入ADC0809模拟量输入端IN01T、7『。首先将 OE,START,ALE。A,B,C都置0,然后ALK置 1再清零.进
嵌入式系统设计
行转换通道地址的锁存.即选择转换通道打开。将START置1再清零,发送一启动脉冲,即启动A/D转换。此时转换结束信号EOC变为低电平。查看EOC是否为高电平。为高电平则表示MD转换完毕。等待MD转换完毕后将输出允许信号输入端(0E)置高电平,此时就可将转换的一路数据输入到单片机某一存储空间中。将OE置低电平,即停止ADC0809。
A/D转换程序流程图
(4)A/D转换器的选取
转换速度是指完成一次A/D转换所需时间的倒数,是一个很重要的指标。A/D转换器型号不同,转换速度差别很大。通常,8位逐次比较式ADC的转换时间为100us左右。由于本系统的控制时间允许,可选8位逐次比较式A/D转换器。
(5)ADC 控制寄存器特征
ADC 控制寄存器(ADCCON)是可读/写状态,地址为0x58000000,复位后的值为0x3FC4。
ADC 转换数据寄存器0(ADCDAT0)是可读/写状态,地址为0x5800000C,嵌入式系统设计
复位后的值不确定
(6)ADC驱动程序设计流程
7.软件程序设计
系统的软件的设计采用的是c语言,对单片机进行编程实现各种功能。
程序是在linux环境下采用keil软件编写的,可以实现对八路数据的采集与处理,能实现对数据、地址的显示.7.1主程序流程图及其程序
主程序流程图
测试程序:adc_test.c #include #include #include #include
嵌入式系统设计
int main(void){
} 主程序: adc.c #include
/*module_init()*/ #include /* printk()*/ #include
/* __init __exit */ int fd,err;int data;fd=open(“/dev/s3c2410_adc”,O_RDONLY);//打开设备 if(fd
} while(1){
} if(read(fd,&data,2))//读ad转换的值 printf(“adc is %dn”,data);printf(“Can't open s3c2410_adc!n”);return 0;sleep(1);#include /* file_operation */ #include
/* copy_to_user, copy_from_user */ #include /*cla ,cla_create ,device_create 等*/ #include /* Error number */ #include /* mdelay ,ndelay*/ #include
/* udelay */ #include
// S3C2410_ADCCON #include #include
//ioremap()
//clk_get(), clk_enable()
嵌入式系统设计
#define DRIVER_NAME “s3c2410_adc” static void __iomem
*regs_adc;#define ADCCON
(*(volatile unsigned long *)(regs_adc + S3C2410_ADCCON))//ADC control #define ADCDLY
(*(volatile unsigned long *)(regs_adc + S3C2410_ADCDLY))//ADC start or Interval Delay #define ADCDAT0(*(volatile unsigned long *)(regs_adc + S3C2410_ADCDAT0))static int MAJOR_NR = 233;static int MINOR_NR = 0;struct cla *my_cla;
/* Driver Major Number */ //次设备起始号
//========================================== //名称:static void initADIO(void)//功能:初始化ADC,配置IO口 //参数: 无 //返回值: 无
//========================================== static void initADIO(void){ } //=========================================== //名称:static int GetAD_Enable(void)//功能:采用置位使能方式启动AD转换 //参数: 无 //返回值: 无
//=========================================== static int GetAD_Enable(void){ int i;int val=0;
ADCCON =(0
嵌入式系统设计
} for(i=0;i
} val = val/16;return val;
//计算ADC平均转换值 ADCCON |= 0x1;
//使能ADC 转换
while(ADCCON & 0x1);//判断是否使能ADC转换
//判断ADC转换是否结束 while(!(ADCCON & 0x8000));val +=(ADCDAT0 &0x03ff);udelay(10);
//取出ADC转换值
/* Driver Operation Functions */ static int s3c2410_ADC_open(struct inode *inode, struct file *filp){
struct clk *adc_clk;printk(“myDriver open called!n”);adc_clk = clk_get(NULL, “adc”);
clk_enable(adc_clk);
} static ize_t s3c2410_ADC_read(struct file *filp, char *buf, size_t count, loff_t *f_pos){ volatile int value=0;volatile int voltage=0;
//S3C2410_PA_ADC是ADC控制器的基地址0x58000000,//定义在mach-s3c2410/include/mach/map.h中
//0x20是虚拟地址长度大小(总寄存器占地址空间长度)regs_adc = ioremap(S3C2410_PA_ADC, 0x20);//得到虚地址偏移量 initADIO();return 0;
嵌入式系统设计
volatile unsigned char temp[2];value = GetAD_Enable();voltage =
//voltage/3.3
=
330*value/1023;value/1023=>voltage=(3.3*value)/1023)*100(为了方便计算放大100倍)
temp[0] = voltage&0xff;temp[1] =(voltage>>8)&0xff;copy_to_user(buf, &temp, 2);
return 1;} static int s3c2410_ADC_release(struct inode *inode, struct file *filp){ printk(“myDriver release called!n”);/*释放虚拟地址映射空间*/
iounmap(regs_adc);} /* Driver Operation structure */ static struct file_operations myDriver_ADC_fops = {
};static int __init myModule_init(void){
int re=-1;re= register_chrdev(MAJOR_NR, DRIVER_NAME, &myDriver_ADC_fops);if(re
return 0;.owner = THIS_MODULE,.read = s3c2410_ADC_read,.open = s3c2410_ADC_open,.release = s3c2410_ADC_release,嵌入式系统设计
} return 0;my_cla=cla_create(THIS_MODULE,DRIVER_NAME);device_create(my_cla,NULL,MKDEV(MAJOR_NR,MINOR_NR), NULL,DRIVER_NAME);
} static void __exit myModule_exit(void){
} module_init(myModule_init);module_exit(myModule_exit);MODULE_LICENSE(“GPL”);文件:Makefile ifneq($(KERNELRELEASE),)obj-m := adc.o
unregister_chrdev(MAJOR_NR, DRIVER_NAME);device_destroy(my_cla,MKDEV(MAJOR_NR, MINOR_NR));cla_destroy(my_cla);printk(“register myDriver OK!Major = %dn”, MAJOR_NR);return 0;else KERNELDIR ?=/home/linux-2.6.29 PWD := $(shell pwd)modules: $(MAKE)-C $(KERNELDIR)M=$(PWD)modules clean: rm-rf *.o *~ core.depend.*.cmd *.ko *.mod.c.tmp_versions.PHONY: clean Endif
嵌入式系统设计
8.实验步骤
(1)编写驱动程序adc.c(2)编写Makefile文件(3)编写应用程序test.c(4)在home目录下建立linuxadc目录,并将adc.c、Makefile、test.c拷贝到该目录下。
(5)将XP系统中的D:ARMARM实验箱配套光盘Source中的linux-2.6.29.tar.bz2拷贝到Linux的home目录下,并解压,解压后重命名为linux-2.6.29(6)进入linux-2.6.29目录,修改sapp-config文件为.config,再执行make menuconfig命令,不做任何修改,直接保存退出。(7)执行make zImage命令。
(8)进入linuxadc目录,执行make命令生成adc.ko文件(9)执行arm-linux-gcc test.c –o test命令生成test文件
(10)在XP系统下建立超级终端,点击传送—发送文件,将生成的adc.ko文件和test文件发送到实验箱中。
(11)在超级终端中执行insmod adc.ko命令,加载模块。(12)在超级终端中执行chmod 777 test命令,添加可执行权限。(13)./test,运行应用程序。
嵌入式系统设计
心得体会
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
嵌入式系统设计
参考文献
[1]江力主编《单片机原理与应用技术》清华大学出版社2006年第1版
[2]李萍主编《AT89C51单片机原理开发与实例应用》中国电力出版社2008年第1版
[3]林高主编《单片机应用实例开发》西安电子科技大学出版社 2009年第1版
[4] 李全利编《单片机原理及应用(第一版)》北京:北京清华大学出版社,2006