s3c2440adc实验心得体会.docx
- 文档编号:29622172
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:13
- 大小:19.60KB
s3c2440adc实验心得体会.docx
《s3c2440adc实验心得体会.docx》由会员分享,可在线阅读,更多相关《s3c2440adc实验心得体会.docx(13页珍藏版)》请在冰豆网上搜索。
s3c2440adc实验心得体会
竭诚为您提供优质文档/双击可除
s3c2440,adc实验心得体会
篇一:
一起学mini2440裸机开发(十三)--adc原理与实验
一起学mini2440裸机开发(十三)--adc原理与实验概述
s3c2440的cmos模拟数字转换器adc可以对8通道模拟输入信号进行循环检测,s3c2440的adc和触摸屏公用一个adc转换器,所以学习adc也是学习触摸屏的基础。
s3c2440adc的主要特性如下:
●分辨率:
10位
●最大转换速率:
500ksps
●微分线性度误差:
±1.0lsb
●积分线性度误差:
±2.0lsb
●供电电压:
3.3V
●模拟输入电压范围:
0~3.3V
adc原理
adc是一种将模拟信号转化为数字信号的方法,一般要经过采样、保持、量化、编码4个步骤。
在实际电路中,有些过程是合并进行的,如采样和保持,量化和编码在转换过程中时同时实现的。
由奈奎特采样定理可知,当采样频率大于模拟信号中最高频率的2倍时,采样值才能不失真地反映原来模拟信号。
主要技术指标如下:
●分辨率
通常以输出二进制的位数表示分辨率的高低,一般位数越多,量化单位越小,对输入信号的分辨能力就越高。
例如,输入模拟电压的变化范围为0±~3.3V、分辨率为12位时,可以分辨的最小模拟电压为3.3V/2^12≈0.8mV;而分辨率为10位时,可以分辨的最小模拟电压为3.3V/2^10≈3.2mV。
●转换误差
它是指在零点和满度都校准以后,在整个转换范围内,分别测量各个数字量所对应的模拟输入电压实测范围与理论范围之间的偏差,取其中的最大偏差作为转换误差的指标。
它通常以相对误差的形式出现,并以lsb为单位表示。
●转换速度
完成一次模数转换所需要的时间称为转换时间。
在大多数情况下,转换速度是转换时间的倒数。
adc的转换速度主要取决于转换电路的类型,并联比较型adc的转换速度最高,逐次逼近型adc次之,双积分型adc转换速度最低。
s3c2440处理器adc功能图如图1所示,其中虚线框是与触摸屏有关的功能模块,可以暂不考虑,学完adc基本实验后,再学触摸屏部分也可以。
从图1可以看出,adc共有8路模拟输入,其中xp、xm、yp和ym是触摸屏使用的4路,剩下的4路模拟输入a[3:
0]可以用于一般的adc输入通道。
此外还需要注意adc的输入时钟是如何产生的。
对于s3c2440处理器,adc输入时钟是由pclk分频得到的,如图2所示
adc相关寄存器
使用adc只需要对相应的寄存器进行配置,然后启动adc即可,启动adc有两种方法:
①手动启动
②读取完上一次转换结果后自动启动下一次adc转换
得到adc是否转换完成的信息有两种方法
①查询法:
查询寄存器adccon的第15位(adc转换结束标志位)
②中断法:
转换完成后,产生adc中断信号,如图1中的int_adc信号。
当不使用触摸屏时,与adc相关的寄存器主要有寄存器adccon和寄存器adcdat0。
寄存器adccon主要用于adc的启动方式、设置adc转换时钟以及adc转换结束标志位等,如下图3。
寄存器adcdat0中存放了adc转换所得到的的数据,adc转换结束后,可以通过读该寄存器的值来得到转换结果。
adc初始化
对adc初始化只需要做好以下两个方面的工作:
①设置adc输入时钟。
②选择adc输入通道。
可以使用如下代码初始化:
#definepRsc_en1//允许预分频
#definepRscVl19//预分频值
#definestdbm0//正常工作模式
#defineRead_staRt0//读数时不进行a/d转换
voidadc_init(unsignedcharchannel)
{
adccon
adccon|=(pRsc_en }
此时,对pclk进行50分频,则可以计算出adc输入时钟=pclk/50=1mhz。
adc基础实验
在我的mini2440上有一个可调电位器,如下图所示。
电位器的中间抽头部分接在adc输入通道0上,当电位器滑动头位于最下端时,ain0引脚电压为0V;当电位器滑动头位于最上端时,ain0引脚电压为3.3V;当电位器上、下滑动时,ain0引脚的电压值会在0~3.3V之间变换。
因此,本实验使用adc输入通道0对ain0引脚电压进行a/d转换。
下图为我的adc实验的文件布局:
下面贴出我的实验代码
main.c文件
/************************************************
*调节mini2440上的可调电位器,然后使用adc输入通道2对
*ain2引脚电压尽心转换,将取得的数字量输出到串口
*************************************************/
#include"adc.h"
#include"uart.h"
篇二:
嵌入式实验报告
嵌入式
实验报告
班级:
0611101
学号:
20xx212370
姓名:
余罗
教师:
赵德春
实验一:
ads开发环境与magicaRm2410实验箱的使用
实验目的:
熟悉ads开发环境,了解magicaRm2410实验箱的硬件结构,熟悉使用jtag接口进行aRm开发流程,理解aRm的串口、端口对步进电机、直流电机、ad的转换。
实验内容:
1、连接实验箱与电脑主机
2、h-jtag检验连接是否正常
3、使用codewarrior软件下载步进电机、直流电机等相关程序
4、使用串口调试助手接受和发送相关信息
5、在实验箱上观察现象
实验步骤:
1、连接主机与实验箱,看到指示灯变亮
2、下载步进电机、直流电机程序
3、分别观察实验箱的现象
4、使用串口打印回字符
5、结合上述程序,独立编写综合程序,实现通过串口手动输入控制电机的转速和方向
6、结束本次实验,整理仪器
实验代码:
#include"config.h"
//步进电机控制口线及操作宏函数定义
#definemotoa
#definemotob
#definemotoc
#definemotod
(1 #definegpioset(pin)rgpcdat=rgpcdat|pin/*设置pin输出1,pin为motoa--motod*/
#definegpioclR(pin)rgpcdat=rgpcdat
for(;dly>0;dly--)
for(i=0;i }
voidmoto_mode2(uint8dly)
{
uint32i;
for(i=0;i {
//ab相有效
gpioset(motoa);
gpioset(motob);
delayns(dly);
gpioclR(motoa);
gpioclR(motob);
//bc相有效
gpioset(motob);
gpioset(motoc);
delayns(dly);
gpioclR(motob);
gpioclR(motoc);
//cd相有效
gpioset(motoc);
gpioset(motod);
delayns(dly);
gpioclR(motoc);
gpioclR(motod);
//da相有效
gpioset(motod);
gpioset(motoa);
delayns(dly);
gpioclR(motod);
gpioclR(motoa);
}
}
int(s3c2440,adc实验心得体会)main(void)
{
//步进电机控制口设置
rgpccon=(rgpccon//gpc0、gpc5--7口设置为输出
rgpcup=rgpcup|0x00e1;//禁止gpc0、gpc5--7口的上拉电阻
rgpcdat=rgpcdat//设置gpc0、gpc5--7口输出低电平
while
(1)
{
moto_mode2
(1);//控制步进电机正转
delayns(50);//停止步进电机,延时
}
return(0);
}
#include"config.h"
//定义独立按键key1的输入口
#definekey_con(1 {
uint32i;
for(;dly>0;dly--)
for(i=0;i }
voidwaitkey(void)
{
uint32i;
while
(1)
{
while((rgpFdatfor(i=0;i //等待key键按下//延时去抖
篇三:
s3c2440上adc驱动实例开发讲解
s3c2440上adc驱动实例开发讲解(转载)
[20xx-10-115:
25:
00|by:
Rain_ning]
一、开发环境
主机:
Vmware--Fedora9开发板:
mini2440--64mbnand,kernel:
2.6.30.4编译器:
arm-linux-gcc-4.3.2
二、硬件原理分析
s3c2440内部adc结构图
我们从上面的结构图和数据手册可以知道,该adc模块总共有8个通道可以进行模拟信号的输入,分别是ain0、ain1、ain2、ain3、ym、yp、xm、xp。
那么adc是怎么实现模拟信号到数字信号的转换呢?
首先模拟信号从任一通道输入,然后设定寄存器中预分频器的值来确定ad转换器频率,最后adc将模拟信号转换为数字信号保存到adc数据寄存器0中(adcdat0),然后adcdat0中的数据可以通过中断或查询的方式来访问。
对于adc的各寄存器的操作和注意事项请参阅数据手册。
上图是mini2440上的adc应用实例,开发板通过一个10k的电位器(可变电阻)来产生电压模拟信号,然后通过第一个通道(即:
ain0)将模拟信号输入adc。
三、实现步骤
adc设备在linux中可以看做是简单的字符设备,也可以当做是一混杂设备(misc设备),这里我们就看做是misc设备来实现adc的驱动。
注意:
这里我们获取ad转换后的数据将采用中断的方式,即当ad转换完成后产生ad中断,在中断服务程序中来读取adcdat0的第0-9位的值(即ad转换后的值)。
1、建立驱动程序文件my2440_adc.c,实现驱动的初始化和退出,代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*定义了一个用来保存经过虚拟映射后的内存地址*/
staticvoid__iomem*adc_base;
/*保存从平台时钟队列中获取adc的时钟*/
staticstructclk*adc_clk;
/*申明并初始化一个信号量adc_lock,对adc资源进行互斥访问*/
declaRe_mutex(adc_lock);
staticint__initadc_init(void)
{
intret;
/*从平台时钟队列中获取adc的时钟,这里为什么要取得这个时钟,因为adc的转换频率跟时钟有关。
系统的一些时钟定义在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/
adc_clk=clk_get(null,"adc");
if(!
adc_clk)
{
/*错误处理*/
printk(keRn_eRR"failedtofindadcclocksource\n");
return-enoent;
}
/*时钟获取后要使能后才可以使用,clk_enable定义在arch/arm/plat-s3c/clock.c中*/clk_enable(adc_clk);
/*将adc的io端口占用的这段io空间映射到内存的虚拟地址,ioremap定义在io.h中。
注意:
io空间要映射后才能使用,以后对虚拟地址的操作就是对io空间的操作,
s3c2410_pa_adc是adc控制器的基地址,定义在mach-s3c2410/include/mach/map.h中,0x20是虚拟地址长度大小*/
adc_base=ioremap(s3c2410_pa_adc,0x20);
if(adc_base==null)
{
/*错误处理*/
printk(keRn_eRR"Failedtoremapregisterblock\n");
ret=-einVal;
gotoerr_noclk;
}
/*把看adc注册成为misc设备,misc_register定义在miscdevice.h中
adc_miscdev结构体定义及内部接口函数在第②步中讲,misc_dynamic_minoR是次设备号,定义在miscdevice.h中*/
ret=misc_register(
if(ret)
{
/*错误处理*/
printk(keRn_eRR"cannotregistermiscdevonminor=%d(%d)\n",misc_dynamic_minoR,ret);gotoerr_nomap;
}
printk(deVice_name"initialized!
\n");
return0;
//以下是上面错误处理的跳转点
err_noclk:
clk_disable(adc_clk);
clk_put(adc_clk);
err_nomap:
iounmap(adc_base);
returnret;
}
staticvoid__exitadc_exit(void)
{
free_irq(iRq_adc,1);/*释放中断*/
iounmap(adc_base);/*释放虚拟地址映射空间*/
if(adc_clk)/*屏蔽和销毁时钟*/
{
clk_disable(adc_clk);
clk_put(adc_clk);
adc_clk=null;
}
misc_deregister(/*注销misc设备*/
}
/*导出信号量adc_lock在触摸屏驱动中使用,因为触摸屏驱动和adc驱动公用
相关的寄存器,为了不产生资源竞态,就用信号量来保证资源的互斥访问*/
expoRt_symbol(adc_lock);
module_init(adc_init);
module_exit(adc_exit);
module_license("gpl");
module_authoR("huanggang");
module_deion("my2440adcdriver");
2、adc_miscdev结构体定义及内部各接口函数的实现,代码如下:
#include
/*设备名称*/
#definedeVice_name"my2440_adc"
/*定义并初始化一个等待队列adc_waitq,对adc资源进行阻塞访问*/
staticdeclaRe_wait_queue_head(adc_waitq);
/*用于标识ad转换后的数据是否可以读取,0表示不可读取*/
staticvolatileintev_adc=0;
/*用于保存读取的ad转换后的值,该值在adc中断中读取*/
staticintadc_data;
/*misc设备结构体实现*/
staticstructmiscdeviceadc_miscdev=
{
.minor=misc_dynamic_minoR,/*次设备号,定义在miscdevice.h中,为255*/
.name=deVice_name,/*设备名称*/
.fops=
/*字符设备的相关操作实现*/
staticstructfile_operationsadc_fops=
{
.owner=this_module,
.open=adc_open,
.read=adc_read,
.release=adc_release,
};
/*adc设备驱动的打开接口函数*/
staticintadc_open(structinode*inode,structfile*file)
{
intret;
/*申请adc中断服务,这里使用的是共享中断:
iRqF_shaRed,为什么要使用共享中断,因为在触摸屏驱动中
也使用了这个中断号。
中断服务程序为:
adc_irq在下面实现,iRq_adc是adc的中断号,这里注意:
申请中断函数的最后一个参数一定不能为null,否则中断申请会失败,如果中断服务程序中用不到这个
参数,就随便给个值就好了,我这里就给个1*/
ret=request_irq(iRq_adc,adc_irq,iRqF_shaRed,deVice_name,1);
if(ret)
{
/*错误处理*/
printk(keRn_eRR"iRq%derror%d\n",iRq_adc,ret);
return-einVal;
}
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- s3c2440adc 实验 心得体会
![提示](https://static.bdocx.com/images/bang_tan.gif)