嵌入式系统概论第十一章_第1页
嵌入式系统概论第十一章_第2页
嵌入式系统概论第十一章_第3页
嵌入式系统概论第十一章_第4页
嵌入式系统概论第十一章_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章基础实验本章首先通过实验让学生熟悉Linux系统下嵌入式开发的过程,进而掌握多线程程序设计的基础,然后介绍了嵌入式开发所涉及的串口、A/D及D/A接口、CAN总线、RS-485通信、直流电机和LED的工作原理及编程方法,每个实验的设计都有不同的针对性,以便读者掌握嵌入式开发的基础知识。目录11.1熟悉Linux开发环境11.2多线程应用程序设计11.3串行端口程序设计11.4A/D接口实验11.5D/A接口实验11.6CAN总线通讯实验11.7RS-485通讯实验11.8直流电动机实验11.97段LED和点阵式LED实验

11.1.1实验目的熟悉Linux开发环境,掌握Linux下的编程方法和编译过程,以及ARM开发板的使用和开发环境的设置,使用NFS将上位机上编译好的文件下载到下位机上运行,了解嵌入式开发的基本过程。

11.1.2实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)。11.1熟悉Linux开发环境11.1.3实验内容

本次实验使用RedhatLinux9.0操作系统,学习Linux下的C语言编程、编译及运行过程,在上位机的“/labs”目录下,创建一个新目录,如Lab01,然后在该目录下编写以下三个C语言程序及相应的Makefile文件。

1.使用输出函数printf显示一串提示信息“Hello,welcometoembeddedworld!”,源文件可命名为“hello.c”;

2.使用包含在time.h中的三个函数gmtime、time、asctime显示当前的日期和时间,可将源文件命名为“showtime.c”;

3.使用C语言中的流文件操作函数,编程显示一个文本文件的内容,可将源文件命名为“cat_txt.c”;在上位机上使用“make”编译调试源程序,然后使用NFS方式连接上位机和下位机,在下位机上运行程序查看结果。11.1.4实验步骤

三个C语言程序的编辑、编译及运行过程类似,故本次实验以“hello.c”为例,介绍相关步骤:

1.编辑源程序

2.编写Makefile文件

3.编译应用程序

4.下载调试11.1.5习题

1.Makefile是如何工作的?其中的宏定义分别是什么意思?

2.嵌入式开发的基本过程有哪几步?11.2多线程应用程序设计

11.2.1实验目的掌握Linux系统下多线程程序设计的基本原理和API,分析求解生产者-消费者问题的实例程序“pthread.c”的源代码,理解多线程间的资源竞争、共享和同步,学习pthread库函数的使用。11.2.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)。11.2.3实验内容1.分析“pthread.c”的源代码,掌握几个重要的pthread库函数的使用;2.掌握互斥锁、条件变量和信号量的使用方法;3.运行“make”产生可执行文件“pthread”,使用NFS方式连接上位机和下位机,运行程序查看结果。11.2.4多线程程序设计

学习多线程程序设计相关的知识,了解生产者-消费者问题。

11.2.5实验步骤

1.使用命令“cd/labs/Lab_2”进入上位机多线程实验目录,使用vi编辑器阅读理解源代码,运行“make”产生“pthread”可执行文件。

2.切换到下位机的minicom

终端窗口,使用NFSmount上位机的“/labs”目录到下位机“/host”目录。进入下位机的“/host/Lab_2”目录,运行“./pthread”,查看运行结果。11.2.6习题1.在生产者-消费中实例中,加入一个新的线程用于处理键盘的输入,并在按键为ESC时钟指所有线程。2.使用信号量控制方式编写多线程程序,设4个线程,其中两个线程负责从文件中读取数据到公共的缓冲区,另两个线程从缓冲区读取数据做不同的处理(加和乘运算)。3.线程的优先级的控制。11.3串行端口程序设计

11.3.1实验目的掌握ARM的串口工作原理,学习串口的主要属性及设置方法,熟悉I/O函数的使用,学习使用多线程来完成串口的收发处理,学习编程实现ARM的UART通信及利用串口通信的方法。11.3.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.3.3实验内容1.学习串行通信原理,了解串行通信控制器;2.读懂串口编程实例的源代码,学习终端I/O函数的使用方法;3.学习将多线程编程应用到串口的接收和发送程序设计中,利用串口,将宿主机上某个文本文件内容传输给开发板,输出显示。1.异步串行通信学习异步串行通信的基本概念,掌握串行接口标准;2.串行接口及其编程技术了解S3C2410的串行接口,学习串口编程技术,通过实例掌握串口编程方法。11.3.4实验原理1.使用命令“cd/labs/Lab_3”进入实验目录,使用vi编辑器阅读理解源代码“term.c”。2.运行“make”命令产生“term”可执行文件。3.切换到下位机的minicom窗口,使用NFS挂载命令将上位机的“/labs”挂载到下位机的“/host”目录。4.进入“/host/Lab_3”目录,运行“./term”命令,查看运行结果。11.3.5实验步骤11.4A/D接口实验

11.4.1实验目的熟悉S3C2410芯片的8通道10位A/D控制器及相应寄存器,了解Linux环境下对A/D操作与控制方法,编程实现ARM系统的A/D功能。11.4.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.4.3实验内容1.学习A/D转换接口原理,了解实现A/D转换所需的系统软、硬件要求。2.阅读ARM芯片文档,掌握ARM的A/D相关寄存器的功能,熟悉ARM系统硬件的A/D相关接口。3.利用外部模拟信号编程实现ARM循环采集0~2路通道,并且在超级终端上显示。1.A/D转换器

A/D转换器是模拟信号源和CPU之间联系的接口,它的任务是将连续变化的模拟信号转换为数字信号,以便计算机和数字系统进行处理、存储、控制和显示。在工业控制和数据采集及许多其他领域中,A/D转换是不可缺少的。

(1)双积分型的A/D转换器11.4.4实验原理

(a)电路工作原理图

(b)双积分图示图11-9双积分型的A/D转换器(2)逐次逼近型的A/D转换器逐次逼近型A/D转换器工作原理是:将被测电压和由D/A转换生成的电压进行比较,用对分搜索的方法来逐次逼近被测电压。

原理框图如11-10(a)所示,电路内部由4个部分组成:逐次逼近寄存器SAR、D/A转换器、电压比较器和控制逻辑电路。它的实质是逐次把设定的SAR寄存器中的数字量经D/A转换后得到电压Vc

与待转换模拟电压V,进行比较。

(a)逐次逼近式A/D转换器原理框图(b)逐次逼近式A/D转换过程图11-10逐次逼近式A/D转换器

比较时,先从SAR的最高位开始,逐次确定各位的数码应是“1”还是“0”,其工作过程如下:转换前,先将SAR寄存器各位清零。转换开始时,控制逻辑电路先设定SAR寄存器的最高位为“1”,其余位为“0”,此试探值经D/A转换成电压Vc,然后将Vc

与模拟输入电压Vx

比较。

如果Vx≥Vc,说明SAR最高位的“1”应予保留;如果Vx<Vc,说明SAR该位应予清零。然后再对SAR寄存器的次高位置“1”,依上述方法进行D/A转换和比较。如此重复上述过程,直至确定SAR寄存器的最低位为止。过程结束后,状态线改变状态,表明已完成一次转换。

最后,逐次逼近寄存器SAR中的内容就是与输入模拟量V相对应的二进制数字量。显然A/D转换器的位数N决定于SAR的位数和D/A的位数。图11-10(b)表示四位A/D转换器的逐次逼近过程。转换结果能否准确逼近模拟信号,主要取决于SAR和D/A的位数。位数越多,越能准确逼近模拟量,但转换所需的时间也越长。2.A/D转换的重要指标

(1)分辨率(Resolution)

分辨率反映A/D转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟输入的电平值表示。n位A/D能反应1/2n满量程的模拟输入电平。由于分辨率直接与转换器的位数有关,所以一般也可简单地用数字量的位数来表示分辨率,即n位二进制数,最低位所具有的权值,就是它的分辨率。

(2)精度(Accuracy)

精度有绝对精度(AbsoluteAccuracy)和相对精度(RelativeAccuracy)两种表示方法。绝对误差:在一个转换器中,对应于一个数字量的实际模拟输入电压和理想的模拟输入电压之差并非是一个常数。我们把它们之间的差的最大值,定义为“绝对误差”。通常以数字量的最小有效位(LSB)的分数值来表示绝对误差,例如:±1LSB等。绝对误差包括量化误差和其它所有误差。相对误差:是指整个转换范围内,任一数字量所对应的模拟输入量的实际值与理论值之差,用模拟电压满量程的百分比表示。例如,满量程为10V,10位A/D芯片,若其绝对精度为±1/2LSB,则其最小有效位的量化单位:9.77mV,其绝对精度为=4.88mV,其相对精度为0.048%。

(3)转换时间(ConversionTime)

转换时间是指完成一次A/D转换所需的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。转换时间的倒数称为转换速率。例如AD570的转换时间为25us,其转换速率为40KHz。(4)电源灵敏度(powersupplysensitivity)

电源灵敏度是指A/D转换芯片的供电电源的电压发生变化时,产生的转换误差。一般用电源电压变化1%时相当的模拟量变化的百分数来表示。

(5)量程量程是指所能转换的模拟输入电压范围,分单极性、双极性两种类型。例如,单极性量程为0~+5V,0~+10V,0~+20V;双极性量程为-5~+5V,-10~+10V。(6)输出逻辑电平多数A/D转换器的输出逻辑电平与TTL电平兼容。在考虑数字量输出与微处理的数据总线接口时,应注意是否要三态逻辑输出,是否要对数据进行锁存等。

(7)工作温度范围由于温度会对比较器、运算放大器、电阻网络等产生影响,故只在一定的温度范围内才能保证额定精度指标。一般A/D转换器的工作温度范围为(0~700C),军用品的工作温度范围为(-55~+1250C)。3.ARM自带的10位A/D转换器(1)ARMS3C2410的A/D转换器

ARMS3C2410芯片自带一个8路10位A/D转换器,并且支持触摸屏功能。ARM2410开发板只用作3路A/D转换器,其最大转换率为500K,非线性度为正负1.5位,其转换时间可以通过下式计算:如果系统时钟为50MHz,比例值为49,则:A/D转换器频率=50MHz/(49+1)=1MHz

转换时间=1/(1MHz/5cycles)=1/200kHz(相当于5us)=5usA/D转换的数据可以通过中断或查询的方式来访问,如果使用中断方式,全部的转换时间(从A/D转换的开始到数据读出)要更长。如果是查询方式,则要检测ADCCON[15](转换结束标志位)来确定从ADCDAT寄存器读取的数据是否是最新的转换数据。A/D转换开始的另一种方式是将ADCCON[1]置为1,这时只要有读转换数据的信号,A/D转换才会同步开始。(2)A/D的相关寄存器与A/D相关的寄存器主要有A/D转换控制寄存器(ADCCON)和A/D转换数据寄存器ADCDAT0。A/D转换控制寄存器ADCCON的地址和意义如下表11-5、表11-6所示。表11-5A/D转换控制寄存器的地址寄存器地址读/写描述复位值ADCCON0x58000000R/WADC控制寄存器0x3FC4表11-6A/D转换控制寄存器的位描述ADCCON位描述复位值ECFLG[15]转换标志位(只读)0=A/D转换1=A/D转换结束0PRSCEN[14]A/D转换预分频使能0=禁止1=允许0PRSCVL[13:6]A/D转换预分频值数据值:1-2550xFFSEL_MUX[5:3]通道号选择000=AIN0001=AIN1010=AIN2011=AIN3100=AIN4101=AIN5110=AIN6111=AIN7(XP)0STDBM[2]Standby模式选择0=正常操作模式1=Standby模式1READ_START[1]读操作使能转换0=禁止1=使能0ENABLE_START[0]转换使能位如果READ_START开启,则此位失效0=无操作1=A/D转换开始,在开始后此位自动清零0ADCCON寄存器的第15位是转换结束标志位,为1时表示转换结束。第14位表示A/D转换预定标器使能位,1表示该预定标器开启。第13-6位表示预定标器的数值,需要注意的是如果这里的值为N,则除数因子是(N+1)。第5-3位表示模拟输入通道选择位。第2位表示待用模式选择位。第1位是读使能A/D转换开始位,第0位置1则A/D转换开始(如果第1位置1,则此位是无效的)。

寄存器地址读/写描述复位值ADCDAT00x5800000CRA/D转换数据寄存器-表11-7A/D转换数据寄存器ADCDAT0是A/D转换结果数据寄存器,其地址如表11-7所示。该寄存器的前10位([9:0])表示转换后的结果,全为1(0xFF)时为满量程3.3V。(3)A/D转换器在扩展板的连接

A/D转换器在扩展板的接法如图11-11所示,前三路通过电位器接到3.3v电源上。图11-11A/D转换器在扩展板上的接法4.A/D转换器编程

(1)A/D转换器驱动程序结构在Linux操作系统中,用户程序不能直接对上述寄存器端口进行操作,而需调用操作系统原语来完成读取A/D转换结果的操作。A/D转换器被作为一个设备文件供应用程序访问,相应的驱动程序提供了4个操作函数:open():打开A/D转换器,并初始设置通道号和转换因子。write():设置A/D转换通道号和转换因子。read():读取A/D转换结果。close():关闭A/D转换器。用户程序读A/D转换器驱动程序的总体结构如图11-12所示。图11-12A/D转换器的总体结构在上述模块中,初始化函数用于加载整个设备驱动程序,中断处理程序用于处理由A/D转换引起的中断,open、read和write等则提供了Linux标准文件访问的功能。对于A/D转换器,通过write调用可以配置A/D转换器的参数,通过read操作可以读取A/D转换器的结果。(2)A/D转换驱动程序系统提供了A/D转换器驱动程序“s3c2410-adc.o”,将A/D转换器作为一个字符设备文件,用户只需在自己的程序里使用open、read、write、release等内核函数即可对其进行操作。本实验采用模块方式加载,可在下位机的“/mnt/yaffs/ad/”中找到A/D的驱动程序s3c2410-adc.o,使用命令“insmods3c2410-adc.o”加载即可。(3)用户程序用户程序只需要调用A/D转换驱动程序提供的open、write、read、close等函数,就可将A/D转换器当作一个设备文件进行访问,读取A/D转换结果。详细代码放在本次实验目录中。1.使用命令“cd/labs/Lab_4”进入本次实验目录,使用vi编辑器阅读理解源代码。2.编译用户程序,运行“make”命令产生可执行文件“ad”。3.下载调试,切换到下位机的minicom窗口,使用命令“mount–tnfs192.168.0.252:/labs/host”命令,将上位机的“/labs”目录挂载到下位机的“/host”目录。4.使用命令“cd/labs/Lab_4/drivers”进入相应目录,查看是否存在A/D转换驱动程序“s3c2410-adc.o”,若存在则使用命令“insmods3c2410-adc.o”以模块方式加载该驱动程序。5.进入“/host/Lab_4/”目录,执行“./ad”程序,可以通过调节开发板上的三个黄色的电位器,来查看a0、a1、a2的变化。11.4.5实验步骤1.修改用户程序,将三个电位器的多次转换的结果写入一个文件中。2.逐次逼近型的A/D转换器原理是什么?3.A/D转换的重要指标包括哪些?4.ARM的A/D功能的相关寄存器有哪几个,对应的地址是什么?5.如何启动ARM开始转换A/D,有几种方式?转换开始时ARM是如何知道转换哪路通道的?如何判断转换结束?11.4.6习题11.5D/A接口实验

11.5.1实验目的学习D/A转换原理,掌握MAX504D/A转换芯片的使用方法,了解D/A驱动程序加入内核的方法。11.5.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.5.3实验内容1.学习D/A接口原理。2.了解实现D/A系统对于系统的软件和硬件要求。3.阅读MAX504芯片文档,掌握其使用方法。4.编程实现正弦波信号的输出,利用示波器试验输出。1.D/A转换器原理

D/A转换器的内部电路构成无太大差异,一般按输出是电流还是电压、能否作乘法运算等进行分类。大多数D/A转换器由电阻阵列和n个电流开关(或电压开关)构成。按数字输入值切换开关,产生比例于输入的电流(或电压)。(1)电压输出型(如TLC5620)一般采用内置输出放大器以低阻抗输出。直接输出电压的器件仅用于高阻抗负载,由于无输出放大器部分的延迟,故常作为高速D/A转换器使用。(2)电流输出型(如THS5661A)电流输出型D/A转换器很少直接利用电流输出,大多外接电流—电压转换电路得到电压输出。(3)乘算型(如AD7533)D/A转换器中有使用恒定基准电压的,也有在基准电压输入上加交流信号的,后者能得到数字输入和基准电压输入相乘的结果而输出,因而称为乘算型D/A转换器。(4)一位D/A转换器一位D/A转换器将数字值转换为脉冲宽度调制或频率调制的输出,然后用数字滤波器作平均化而得到一般的电压输出(又称位流方式),用于音频等场合。11.5.4实验原理2.D/A转换器的主要技术指标

(1)分辩率(Resolution)

分辨率用输入二进制数的有效位数表示。在分辨率为n位的D/A转换器中,输出电压能区分2n个不同的输入二进制代码状态,能给出2n个不同等级的输出模拟电压。分辨率也可以用D/A转换器的最小模拟输出量(对应数字量仅最低位为“1”)与最大量(对应数字量所有有效位为“1”)之比来表示。(2)建立时间(SettingTime)

这是D/A的一个重要性能参数,通常定义为:在数字输入端发生满量程码的变化以后,D/A的模拟输出稳定到最终值1/2LSB时,所需要的时间。其他指标还有线性度(Linearity),转换精度,温度系数/漂移。

3.MAX50410位D/A转换器的特点本开发板上使用的MAX504是10位D/A转换器,其特点如下:由单个5V电源供电电压输出缓冲内部2.048V参考电压电压不随温度变化可变的输出范围:0V~VDD,VSS~VDD

上电复位串行输出MAX504D/A转换器各个管脚的功能如表11-8所示。表11-8MAX50410位D/A转换器的管脚定义管脚名称功能1BIPOFF双级性偏移/增益寄存器2DIN串行数据输入3CLR清零。异步使DAC寄存器所有位数设置为04SCLK串行时钟输入5CS片选,低电平有效6DOUT菊花链串行数据输出7DGND数字地8AGND模拟地9REFIN参考输入10REFOUT参考输出,2.048V,不使用时连接到VDD11VSS负电源供电12VOUTDA输出DAC13VDD正电源供电14RFB反馈电阻4.MAX504在开发板上的连接MAX504在开发板中的连接如图11-14所示。图11-14MAX504在开发板中的连接

RFB连接VOUT、BIPOFF连接AGND,使得输出电压范围为0~2VREFIN,即0~4.069V。时钟和输入、输出信号分别与同步串口的时钟、发送和接收端相连。MAX504可接收12位的数据,但低两位不起作用。所以发送数据时应先将数据左移两位,然后先发送高八位,再发送低八位数据。5.MAX504(10位D/A)转换器编程(1)D/A转换器驱动程序在上位机的“/labs/Lab_5/drivers”目录下提供了D/A转换器驱动程序“s3c2410-exio.o”,用户可以使用该驱动程序提供的open、ioctl、release等函数操作D/A转换器。用户还可在该目录下找到其源程序“s3c2410-exio.c”进行分析。之间采样40个点生成正弦波信号输出。参考代码见“/labs/Lab_5”下的程序“da_sin.c”。(2)用户程序本实验编写用户程序,在1.阅读理解源码,进入上位机的“/labs/Lab_5”目录,使用vi编辑器阅读理解源代码。2.运行“make”命令,产生可执行文件“da_sin”。3.切换到下位机的minicom窗口,使用NFSmount上位机的“/labs”到下位机的“/host”目录,然后进入“/host/Lab_5/drivers”目录,用“insmods3c2410-exio.o”命令加载D/A驱动,并用“lsmod”命令查看是否已经插入。4.进入“/host/Lab_5”目录,运行“./da_sin”,部分运行结果如图11-15所示,并使用示波器观察输出波形是否正弦波。11.5.5实验步骤1.修改用户程序,产生余弦波形信号,并使用示波器观察输出波形。2.修改用户程序,产生方波信号,并使用示波器观察输出波形(参考代码为“da_fang.c”)。3.D/A转换器的分类。4.D/A转换器的主要技术指标。5.MAX504的特点及使用方法。11.5.6习题11.6CAN总线通讯实验

11.6.1实验目的掌握CAN总线通讯原理,学习MCP2510的CAN总线通讯的驱动开发,掌握Linux系统中断在CAN总线通讯程序中使用。11.6.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.6.3实验内容1.学习CAN总线通讯原理,了解CAN总线的结构;2.阅读CAN控制器MCP2510的芯片文档,掌握MCP2510的相关寄存器的功能和使用方法;3.编程实现两台CAN总线控制器之间的通讯;4.ARM接收到CAN总线的数据后会在终端显示,同时使用CAN控制器发送的数据也会在终端反显。5.MCP2510设置成自回环的模式,CAN总线数据自发自收。1.CAN总线

CAN,全称为“ControllerAreaNetwork”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN总线被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中均嵌入CAN控制装置。一个由CAN总线构成的单一网络中,理论上可以挂接无数个节点。但是,实际应用中节点数目受网络硬件的电气特性所限制。例如,当使用PhilipsP82C250作为CAN收发器时,同一网络中允许挂接110个节点。CAN可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN的抗电磁干扰能力。11.6.4实验原理2.CAN总线的电气特征

CAN能够使用多种物理介质进行传输,例如:双绞线、光纤等。最常用的就是双绞线。信号使用差分电压传送,两条信号线被称为CAN_H

和CAN_L,静态时均是2.5V左右,此时状态表示为逻辑1也可以叫做“隐性”。用CAN_H比CAN_L高表示逻辑0,称为“显性”。此时,通常电压值为CAN_H=3.5V和CAN_L=1.5V。当“显性”位和“隐性”位同时发送的时候,最后总线数值将为“显性”。这种特性,为CAN总线的仲裁奠定了基础。

3.CAN总线的MAC帧结构

CAN总线的帧数据有两种格式:标准格式和扩展格式,如图11-17所示。在MCP2510中,同时支持下面两种CAN总线的帧格式。图11-17CAN总线的帧数据4.S2410的CAN总线控制器MCP2510UP-TECHS2410/P270DVP上采用MicroChip

公司的MCP2510CAN总线控制器,采用RJ11标准接口作为CAN总线接口,接口如图11-18所示。系统中,S3C2410通过SPI同步串行接口和MCP2510相连。MCP2510的片选信号,通过接在S3C2410的Bank5上的锁存器(74HC753)来控制。图11-18CAN总线接口与MCP2510芯片5.MCP2510的初始化

MCP2510的初始化如下步骤:(1)软件复位,进入配置模式(2)设置CAN总线波特率(3)关闭中断(4)设置ID过滤器(5)切换MCP2510到正常状态(Normal)(6)清空接受和发送缓冲区(7)开启接收缓冲区,开启中断(可选)6.MCP2510发送和接收数据

MCP2510中有3个发送缓冲区,可以循环使用。也可以只使用一个发送缓冲区,但是,必须保证在发送的时候,前一次的数据已经发送结束。

MCP2510中有2个接收缓冲区,可以循环使用。数据的发送和接收均可使用查询或者中断模式,这里,为编程简单,收发数据都采用查询模式。通过状态读取命令(ReadStatusInstruction)来判断是否接收到(或者发送出)数据。本实验中,CAN总线以模块的形式编译在内核源码中,进行CAN总线实验的步骤如下:1.编译CAN总线模块首先切换到“/arm2410cl/kernel/linux-2.4.18-2410cl”目录,然后使用命令“makemenuconfig”,进入MainMenu/Characterdevices菜单,选择CANBUS为模块加载,如图11-24所示。11.6.5实验步骤图11-24选择CANBUS模块加载其次,使用下列命令编译内核模块:

makedepmakemakemodules编译结果为:“/arm2410cl/kernel/linux-2.4.18-2410cl/drivers/char/s3c2410-can-mcp2510.o”

注意:本次试验已经在目录“/labs/Lab_6/drivers”下,放置了编译后的驱动模块,将其改名为“can.o”,用户可以直接使用该驱动模块。2.编译应用程序在上位机的“/labs/Lab_6”目录下,执行“make”命令编译应用程序。3.下载调试切换到minicom终端窗口,使用NFSmount开发主机的“/labs”到“/host”目录,然后切换到“drivers”目录,使用命令“insmod

can.o”插入CAN驱动模块。4.运行应用程序在目录“Lab_6”下运行应用程序canchat,查看结果。

1.CAN总线通讯最少需要几根线?如果多个节点应该如何连接?2.为什么CAN总线的可靠性高,传输数率却可以速度比串口快(可达到1Mbps)?3.如果要在现有的系统上构建复杂的CAN总线通信协议需要进行怎样的扩展?11.6.6习题11.7RS-485通讯实验

11.7.1实验目的学习RS-485通信原理,掌握MAX485芯片的使用方法,掌握ARM的串行口工作原理。11.7.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.7.3实验内容1.学习RS-485通信原理,阅读MAX485芯片文档,掌握其使用方法。2.熟练ARM系统硬件的UART使用方法,编程实现RS-485通信的基本收发功能。3.利用示波器观测MAX485芯片的输入和输出波形。4.将两个平台连接起来利用PC键盘发送数据,超级终端观察收到的数据。1.串行接口标准

RS-485是串行数据接口标准,最初是由电子工业协会(EIA)制订并发布的。RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。(1)平衡传输

RS-485数据信号采用差分传输方式,使用一对双绞线,将其中一线定义为A,另一线定义为B。通常,发送驱动器A、B之间的正电平在+2~+6V,是一个逻辑状态,负电平在-6V~-2V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。(2)RS-485电气规定

RS-485需要在传输线上接终接电阻。可以采用二线与四线方式,二线制可实现真正的多点双向通信。而采用四线连接时,只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,无论四线还是二线连接方式总线上可多接到32个设备。

RS-485的共模输出电压是是-7V至+12V之间,其最大传输距离约为1219米,最大传输速率为10Mb/s。11.7.4实验原理2.通信方式

RS-485接口可连接成半双工和全双工两种通信方式。半双工通信的芯片有SN75176、MAX485、MAX1487、MAX3082、MAX1483等;全双工通信的芯片有SN75179、MAX488~MAX491、MAX1482等。本实验采用的是MAX485的半双工通信方式。3.MAX485接口芯片

MAX485是Maxim公司的一种RS-485芯片。采用单一电源+5V工作,额定电流为300μA,采用半双工通讯方式。它完成将TTL电平转换为RS-485电平的功能。MAX485芯片的结构和引脚都非常简单,内部含有一个驱动器和接收器,其引脚结构图如图11-28所示。

MAX485是半双工通信器件,8脚为电源VCC,5脚接地GND。有一个总线接收/驱动器,6脚为A,7脚为B。发送、接收均有使能端,1脚为接收RO,4脚为发送DI;2脚为接收使能RE,0有效,3脚为发送使能DE,1有效;通常将2、3脚连在一起,控制其收发。图11-28MAX485接口芯片引脚4.本实验RS-485原理图本次实验RS-485原理图如图11-29所示。其中TXD2和RXD2为S3C2410XUART的第二个通道的发送和接收端,GPH1为1时是发送使能,GPH1为0时是接收使能。图11-29RS-485原理图5.RS-485编程

(1)RS-485驱动程序在上位机的“/labs/Lab_7/drivers”目录下提供了RS-485驱动程序“s3c2410-485.o”,用户可以使用该驱动程序提供的open、ioctl、release等函数操作RS-485,控制MAX485以半双工方式通信。用户可在该目录下找到其源程序“s3c2410-485.c”进行分析。(2)用户程序因为RS-485是半双工的,比起RS-232,需要多加一个I/O口来控制RS-485的方向,该I/O口在发送数据时置高,接收数据时置低。发送数据时:ioctl(fd485,_485_IOCTRL_RE2DE,_485_DE);/*fd485:方向控制I/O口驱动设备文件的fd*/write(fdcom2,&buf,1);

/*fdcom2:串口驱动设备文件的fd*/接收数据:ioctl(fd485,_485_IOCTRL_RE2DE,_485_RE);/*设置RS-485工作模式为接收*/ read(fdcom2,&c,1);/*通过串口2读取接收数据*/

本次实验用户程序“485_test.c”实现的功能是:上位机通过RS-485向下位机传送一个文件文件的内容。

1.使用命令“cd/labs/Lab_7”进入本实验目录,运行“make”编译生成可执行文件“485_test”。2.切换到下位机的minicom窗口,使用NFSmount上位机的“/labs”到下位机的“/host”目录,然后进入“/host/Lab_7/drivers”目录,用“insmods3c2410-485.o”命令加载RS-485驱动,并用“lsmod”命令查看是否已经插入。3.使用命令“./485_test1.txt”执行测试程序,将上位机当前目录下的“1.txt”文件内容传递给下位机,实现两台设备之间的通讯。11.7.5实验步骤1.修改用户程序,将上位机上的若干个字符串传递给下位机。2.RS-485通信特点。3.建立自己的高层通信协议,完成设备间的多机通信。11.7.6习题11.8直流电动机实验

11.8.1实验目的熟悉ARM本身自带的PWM,掌握相应寄存器的配置及Linux下编程实现ARM系统的PWM输出,从而控制直流电机。了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配,掌握带有PWM的CPU编程实现其相应功能的主要函数。11.8.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.8.3实验内容1.学习直流电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。2.学习ARMPWM的生成方法。3.编程实现直流电机的调速转动。1.直流电机的PWM电路原理

PWM(Pulse-WidthModulation)是脉宽调制技术的简称,可用于控制高性能的直流电机调速系统。其原理为:晶体管的导通时间也被称为导通角,通过控制晶体管的开通与断开时间来改变导通角的大小,就可以调节加在负载上的平均电压的大小,以实现对电动机的变速控制,这就是PWM变速控制技术的基本原理,如图11-32所示。在PWM变速控制中,系统采用直流电源,放大器的频率是固定,变速控制通过调节脉宽来实现。11.8.4实验原理图11-32PWM调速原理由上图可知,电动机两端得到的电压平均值可用下式表示为:式中:为开关每次接通的时间,为开关断开的时间周期,为占空比,由公式可见,改变脉冲的占空比,电动机两端的电压平均值也随之改变,从而控制电机的变速。2.S3C2410的PWM发生器(1)S3C2410的PWM发生器的结构用分立器件组成PWM电路一般需要如下几个部分:三角波产生电路、脉冲调制电路、PWM信号延迟及分配电路。本实验所用的目标板上的S3C2410处理器,其内部已经集成了包含上述三个部分的PWM发生器,只要对相关寄存器进行简单的设置,就可以产生需要的PWM信号。经典开发平台将S3C2410的定时器输出都引到了扩展槽,并分别用定时器0和1组成了双极性PWM发生器。(2)PWM发生器的原理

(以定时器0为例)

时钟信号PCLK经过可编程的8位预分频器和时钟除法器分频后,驱动定时器内的逻辑控制器进行工作。逻辑控制器的核心,是一个16位的减法计数器。可以赋于计数缓冲寄存器(TCNTB0)

和比较缓冲寄存器(TCMPB0)不同的初始值,当定时器使能时,这两个寄存器中的数据将被分别载入到减法计数器(TCNT0)和比较寄存器(TCMP0)。计时过程为:

从PCLK过来的时钟信号到达逻辑控制器时,减法计数器的值自动减1,当减法计数器的值为0时,定时器会向CPU发送中断请求,一轮计时操作完成。在自动装载模式下,计数缓冲寄存器中的初始值会由硬件控制自动载入减法计数器,进行下一轮的计时操作。PWM发生器的原理比较缓冲寄存器(TCMPB0)中设定的初值用来产生PWM信号。信号的产生规则是:每当TCNT0的值和TCMP0的值相等时,定时器的输出逻辑电平翻转。PWM脉冲频率由TCNT0决定,而脉冲宽度由TCMP0决定。TCMP0的值越大,PWM脉冲的占空比越大,也即平均输出电压越大,反之亦然。

(3)PWM发生器相关的寄存器

PWM发生器用到的寄存器主要有:TCFG0(定时器配置寄存器0)、TCFG1(定时器配置寄存器1)、TCON(定时器控制寄存器)、TCNTB0&TCMPB0(定时器0计数缓冲区寄存器和比较缓冲区寄存器)、CNTO0(定时器0观察寄存器),它们各自的地址和位描述参见教材。3.直流电机调速编程

直流电机的转速取决于脉冲宽度,而脉冲由定时器0产生,因此只需初始化定时器,并给定时器0计数缓冲赋不同的值,便可调节转速。本次实验中,Linux下的直流电机程序包括“模块驱动程序”和“应用程序”两部分。在上位机的“/arm2410cl/kernel/drivers/char”目录下提供了直流电机驱动程序“s3c2410-dc-motor.o”,用户可以使用该驱动程序提供的open、ioctl、release等函数控制直流电机便速转动。用户可在该目录下找到其源程序“s3c2410-dc-motor.c”进行分析。1.使用命令“cd/labs/Lab_8/”进入本实验目录,使用运行“make”编译生成可执行文件“dcm_main”。2.切换到下位机的minicom窗口,使用NFSmount上位机的“/labs”到下位机的“/host”目录,然后进入“/host/Lab_8/drivers”目录,用“insmods3c2410-dc-motor.o”命令加载直流电机驱动,并用“lsmod”命令查看是否已经插入。3.使用命令“./dcm_main”执行用户程序,控制直流电机变速转动,查看程序运行结果。11.8.5实验步骤1.修改测试程序,控制直流电机以恒定速度或变速转动。(参考代码为dcm_c_v.c)2.简述PWM的基本原理,思考其基本参数的变化对电机转动的影响。3.尝试使用实验箱上的电位器旋钮控制直流电机的转向和转速。11.8.6习题11.97段LED和点阵式LED实验

11.9.1实验目的学习LED的相关知识,掌握74HC273芯片的工作原理,了解SPI接口的相关知识。11.9.2

实验设备

1台已安装Linux的PC机作为宿主机(上位机),1台已烧写ARMLinux的博创经典UP-TECH-S2410/P270-DVP实验箱作为目标板(下位机)11.9.3实验内容1.学习LED相关知识,掌握7段LED和点阵式LED的显示原理。2.了解74HC273芯片对LED电量的工作机制,熟练阅读74HC273芯片资料,掌握对它的使用。3.编程控制7段LED显示数字,编程控制点阵式LED显示字符或简单汉字。11.9.4实验原理1.LED显示控制原理(1)7段(或8段)LEDLED的7个字段分别称为a、b、c、d、e、f、g,有时还有一个小数点段h,图11-34(a)所示。通过7个(或8个)发光段的不同组合,显示0~9和A~F共16个字母数字,从而实现十六进制的显示。为使7段显示器显示数字或字符,就需点亮相应的段,每个段分别由数据线进行控制,通常数据线D0~D7顺序控制a~h段,如图11-34(b)所示,所需的控制信号称为段码。由于数字与段码之间没有规律性,因此必须进行数字与段码之间的转换以便显示数字。常用的转换方法是将要显示字形的段码列成一个表,称为段码表。显示时,根据字符查段码表,取出其对应的段码送到数据线上来控制显示。图11-348段LED显示器外形及各段对应的数据线

LED有两种不同的形式一种是8个发光二极管的阳极都连在一起,称为共阳极,如图11-35(a)所示;另一种是8个发光二极管的阴极都连在一起,称为共阴极,如图11-35(b)所示。图11-358段LED显示器原理图(2)点阵式LED

点阵式LED的显示单元一般由8行8列LED组成,其外形及内部连接如图11-30所示,可以再由这8行8列的LED拼成更大的LED阵列。点阵式LED显示器能显示各种字符、汉字及图形、

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论