嵌入式课程设计样ni例文档格式.docx
- 文档编号:22238865
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:102.73KB
嵌入式课程设计样ni例文档格式.docx
《嵌入式课程设计样ni例文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计样ni例文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
三、设计任务及要求
设计一个直流电机驱动程序
(由于开发板所输出的电流比较小,无法驱动直机电机的转动,所以需要在外围设备中加入一个可以放大电流的驱动电路,L298N芯片正符合这个驱动电路,所以直流电机在L298N的驱动下,在开发板PXA270上能够成功运行。
)
四、实现过程
4.1硬件
1、L298N芯片介绍
恒压恒流桥式2A驱动芯片L298N
L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。
4脚VS接电源电压,VS电压范围VIH为+2.5~46V。
输出电流可达2.5A,可驱动电感性负载。
1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。
L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。
5,7,10,12脚接输入控制电平,控制电机的正反转。
EnA,EnB接控制使能端,控制电机的停转。
表1是L298N功能逻辑图。
In3,In4的逻辑图与表1相同。
由表1可知EnA为低电平时,输入电平对电机控制起作用,当EnA为高电平,输入电平为一高一低,电机正或反转。
同为低电平电机停止,同为高电平电机刹停。
2、直流电机的工作原理
直流电机是一种能实现机电能量转换的电磁装置,它能使绕组在气隙磁场中旋转感生出交流电动势,并依靠换向装置,将此交流电变为直流电。
其产生交流电的物理根源在于,电机中存在磁场和与之有相对运动的电路,即气隙磁场和绕组。
旋转绕组和静止气隙磁场相互作用的关系可通过电磁感应定律和电磁力定律来分析。
根据电磁感应定律,在恒定磁场中,当导体切割磁场磁力线时,导体中将感应电动势。
如果磁力线、导体及其运动方向三者互相垂直,则导体中产生的感应电动势的大小为
e=Blv(1—1)
式中,B为磁感应强度,单位为T;
l为导体切割磁力线的有效长度,单位为m;
v为导体切割磁场的线速度,单位为m/s;
e为导体感应电动势,单位为V。
图1—1载流导体在磁场内受到的电磁力及左手定则 依据电磁力定律,当磁场与载流导体相互垂直时,作用在载流导体上的电磁力为
f=Blv(1—2)
式中,为载流导体中电流,单位为A;
为电磁力,单位为N。
电磁力的方向用左手定则确定。
导体受力的方向用左手定则确定。
这一对电磁力形成了作用于电枢一个力矩,这个力矩在旋转电机里称为电磁转矩,转矩的方向是逆时针方向,企图使电枢逆时针方向转动。
如果此电磁转矩能够克服电枢上的阻转矩(例如由摩擦引起的阻转矩以及其它负载转矩),电枢就能按逆时针方向旋转起来。
直流电动机的工作原理是基于载流导体在磁场中受力产生电磁力形成电磁转矩的基本原理。
但要获得恒定方向的转矩,需将其外电路的直流电流变为绕组中的交流电流,即同样需要机械整流装置
直流电机原理图
3.电路的连接
把4、6、9引脚接开发板正5V,5、7引脚分别接开发板69、70脚。
4.2驱动程序设计
1、设备初始化
定义直流电机驱动程序的初始化函数ZLDJ_init(),在该函数中实现向系统注册设备号、设备名称和初始化寄存器。
(1)、向系统注册设备
这里定义电机的主设备号宏符号名为ZLDJ_MAJOR,设备名称为zldj_drv,设备的结构体为&
ZLDJ_ops,则设备的注册函数为:
devfs_register_chrdev(ZLDJ_MAJOR,“zldj_drv”,ZLDJ_ops)
(2)、设备初始化函数
staticint__initHW_zldj_init(void)
{
intret=-ENODEV;
showversion();
ret=devfs_register_chrdev(ZLDJ_MAJOR,"
ZLDJ"
&
zldj_ops);
if(ret<
0)//当返回值小于0时,设备注册失败
{
printk("
init_modulefailedwith%d\n[--kernel--]"
ret);
returnret;
}
else
printk("
zldjregistersuccess!
!
[--kernel--]\n"
);
gpio_init();
}
(3)、驱动程序的file-operation数据结构
由于直流电机驱动程序只控制电机的旋转和停止,因此只需要接口函数ioctl()就够了。
staticstructfile_operationszldj_ops={
ioctl:
zldj_ioctl,
};
2、控制直流电机转动和停止的接口函数ioctl()后,主要是设置寄存器GPSR与寄存器GPCR的值。
GPSR为置位寄存器,当取值为1时,电机开始旋转。
GPSR2|=(0x1<
<
20);
//电机正转
18);
//电机反转
GPCR为复位寄存器,当取值为1时,电机停止旋转。
GPCR2|=(0x1<
//电机正转停止
//电机反转停止
为了能让电机旋转一段时间后,自动停止转动,要使用函数udelay()设置一段时间延迟。
由于函数udelay()是微秒级(1000us=1ms),且该值不能取得太大,否则会产生溢出,因此设置一个循环来加大延时的时间。
3、直流电机驱动源程序
/**************************
*直流电机模块驱动程序
*zldj_drv.c
***************************/
#include<
linux/config.h>
linux/kernel.h>
linux/sched.h>
linux/timer.h>
linux/init.h>
3
linux/module.h>
asm/hardware.h>
linux/delay.h>
linux/interrupt.h>
linux/modversions.h>
linux/version.h>
asm/io.h>
asm/irq.h>
#defineZLDJ_MAJOR112
#defineVERSION"
zldj--2009"
#defineZLDJ_DEBUG
voidshowversion(void)
*********************************************\n"
\t%s\t\n"
VERSION);
*********************************************\n\n"
/*ZLDJ设备的ioctl接口函数*/
ssize_tzldj_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)
intbit[2];
#ifdefZLDJ_DEBUG
zldj_ioctl[--kernel--]\n"
#endif
------------cmd=%x\n"
cmd);
bit[0]=(cmd&
0x10)>
>
4;
//右移4位
bit[1]=(cmd&
0x20)>
5;
//右移5位
switch(bit[0])//gpio84--69
case1:
GPSR2|=(0x1<
20);
//正转
break;
case0:
GPCR2|=(0x1<
//停止
default:
return0;
switch(bit[1])//gpio82--70
case1:
GPSR2|=(0x1<
18);
//正转
break;
case0:
GPCR2|=(0x1<
default:
return0;
udelay(arg);
voidgpio_init()
GPDR0|=(0x1<
11);
//将GPIOR的第11位GPIO11设置为1
GPDR2|=(0x1f<
17);
//设置GPIO81,82,83,84,85
GPDR1|=(0x5<
//设置GPIO52,54
GAFR0_L&
=~(0x3<
22);
//设置GPIO11
GAFR2_U&
=~(0x3ff<
2);
GAFR1_U&
=~(0x33<
8);
//设置GPIO52,54
//-------------------INIT------------------------
//显示版本信息
ret=devfs_register_chrdev(ZLDJ_MAJOR,"
//注册驱动程序
0)//当返回值小于0时,设备注册失败
staticint__initzldj_init(void)
zldj_init[--kernel--]\n"
ret=HW_zldj_init();
if(ret)
staticvoid__exitcleanup_zldj_ctl(void)
cleanup_zldj[--kernel--]\n"
devfs_unregister_chrdev(ZLDJ_MAJOR,"
);
//注销驱动
MODULE_DESCRIPTION("
zldjdrivermodule"
MODULE_LICENSE("
GPL"
module_init(zldj_init);
module_exit(cleanup_zldj_ctl);
4、编写Makefile文件
KERNELDIR=/pxa270_linux/linux
INCLUDEDIR=$(KERNELDIR)/include
CROSS_COMPILE=arm-linux-
CC=$(CROSS_COMPILE)gcc
CFLAGS+=-I..
CFLAGS+=-Wall-O-D__KERNEL__-DMODULE-I$(INCLUDEDIR)
TARGET=zldj_drv.o
all:
$(TARGET)
zldj_drv.o:
zldj_drv.c
$(CC)-c$(CFLAGS)$^-o$@
clean:
rm-f*.o*~core.depend
4.3用户应用程序设计
(1)、直流电机应用程序的功能是在用户空间调用设备驱动程序,其主要设计步骤如下。
fd=open("
/dev/ZLDJ"
O_RDWR);
(2)、调用设备驱动程序中的函数ioctl(),向电机发出控制指令。
ioctl(fd,0x2f,1000);
//正转设置cmd为0x2f
ioctl(fd,0x1f,1000);
//反转设置cmd为0x1f
ioctl(fd,0x0f,1000);
//停止设置cmd为0x0f
(3)、直流电机用户应用程序源程序
*键盘用户应用程序:
zldj_test.c
#include<
stdio.h>
sys/ioctl.h>
fcntl.h>
unistd.h>
intmain()
intfd;
intret;
charbuf[10];
fd=open("
if(fd<
0)
{
printf("
OpendeviceZLDJerror\n"
exit
(1);
("
OpendeviceZLDJsuccess\n"
while
(1)
{
+++++++++++++++++++++++++++++\n"
pleaseselectwhattodo:
\n"
1enter----zhengzhuan\n"
2enter----fanzhuan\n"
3enter----stop!
"
othermeansESC\n"
+++++++++++++++++++++++++++++++\n"
scanf("
%x"
&
ret);
switch(ret)
{
case0x1:
{
printf("
zhengzhuan\n"
ioctl(fd,0x2f,1000);
}
case0x2:
fanzhuan\n"
ioctl(fd,0x1f,1000);
case0x03:
printf("
stop\n"
ioctl(fd,0x0f,1000);
gotoout;
}
}
out:
close(fd);
EndofTest\n"
return0;
4.4编译与运行结果
(1)、运行Makefile文件生成zldj_drv.o文件
#make
(2)、把zldj_drv.o下载到开发板中
(3)、在开发板上创建设备进入点
#mknod/dev/ZLDJc1120
(4)、检查设备进入点是否创建成功
#Ls-1/drv|grepZLDJ
(5)、在开发板上加载驱动程序
#insmodzldj_drv.o
*********************************************
“zldj—2009”
zldjregistersuccess!
[--kernel--]
(6)、用户程序的编译
#arm-linux-gcczldj_test.c–otest_zldj
生成test_zldj文件
(7)、把test_zldj文件下载到开发板
(8)、运行文件test_zldj
#./test_zldj
OpendeviceZLDJsuccess
+++++++++++++++++++++++++++++
pleaseselectwhattodo:
1enter----zhengzhuan
2enter----fanzhuan
3enter----stop!
othermeansESC
+++++++++++++++++++++++++++++++
当按1时再回车直流电机正转,当按2时直流电机反转,当按3时直流电机停止转动。
再按其它键将退出程序。
五、总结
通过这次的课程设计,让我学到了很多的知识。
在这次的设计中,使我学会了怎么样建立嵌入式系统开发环境,并可以通过设计一个驱动电路和驱动程序来驱动直流电机的转动,并通过用户程序来进行对键盘设置它的转动方式,并也能对驱动程序进行设置它的卸载,在学习这门课的过程中,使我体会到设计一个程序的乐趣。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计 ni