..’.研究生课程设计报告《直流电机程序设计》课程名称嵌入式系统设计姓名王招治学号1201401011专业电子与通信工程任课教师李国刚开课时间2013-8-17教师评阅意见:报告成绩评阅日期课程设计提交时间:2013年9月10日..’.直流电机程序设计一、设计目的1、熟悉ARM本身自带的PWM,掌握相应寄存器的配置。2、Linux下编程实现ARM系统的PWM输出,从而控制直流电机。3、了解直流电机的工作原理,学会用软件的方法实现步进电机的脉冲分配。4、掌握带有PWM的CPU编程实现其相应功能的主要方法。二、设计内容学习直流电机的工作原理,了解实现电机转动对于系统的软件和硬件要求。学习ARMPWM的生成方法。使用RedhatLinux9.0操作系统环境及ARM编译器,编译直流电机的驱动模块和应用程序。运行程序,实现直流电机的调速转动。1、直流电动机的PWM电路原理晶体管的导通时间也被称为导通角а,若改变调制晶体管的开与关的时间,也就是说通过改变导通角а的大小,如图2.9.1所示,来改变加在负载上的平均电压的大小,以实现对电动机的变速控制,称为脉宽调制(PWM)变速控制。在PWM变速控制中,系统采用直流电源,放大器的频率是固定,变速控制通过调节脉宽来实现。构成PWM的功率转换电路或者采用H桥式驱动,或者采用T式驱动。由于T式电路要求双电源供电,而且功率晶体管承受的反向电压为电源电压的两倍。因此只适用于小功率低电压的电动机系统。而H桥式驱动电路只需一个电源,功率晶体管的耐压相对要求也低些,所以应用得较广泛,尤其用在耐高压的电动机系统中。2、直流电动机的PWM等效电路如图2.9.2a所示:是一个直流电动机的PWM控制电路的等效电路。在这个等效电路中,传送到负载(电动机)上的功率值决定于开关频率、导通角度及负载电感的大小。开关频率的大小主要和所用功率器件的种类有关,对于双极结型晶体管(GTR),一般为lkHz至5kHz,小功率时(100W,5A以下)可以取高些,这决定于晶体管的特性。对于绝缘栅双极晶体管(IGBT),一般为5kHz至l2kHz;对于场效应晶体管(MOSFET),频率可高达2OkHz。另外,开关频率还和电动机电感有关,电感小的应该取得高些。..’.当接通电源时,电动机两端加上电压UP,电动机储能,电流增加,当电源中断时,电枢电感所储的能量通过续流二极管VD继续流动,而储藏的能量呈下降的趋势。除功率值以外电枢电流的脉动量也与电动机的转速无关,仅与开关周期、正向导通时间及电机的电磁时间常数有关。3、开发平台中直流电机驱动的实现开发板中的直流电机的驱动部分如图2.9.3所示;由于S3C2410芯片自带定时器,所以控制部分省去了三角波产生电路、脉冲调制电路和PWM信号延迟及信号分配电路,取而代之的是S3C2410芯片的定时器0、1组成的双极性PWM发生器。PWM发生器用到的寄存器主要有以下几个:..’.TCFG0定时器配置寄存器0参考:Deadzonelength=0;prescalervalue=2。TCFG1定时器配置寄存器1..’.时钟输入频率=PCLK/(prescalervalue+1)/(dividervalue)。prescalervalue有TCFG0决定;dividervalue由TCFG1决定。参考:无DMA模式,dividervalue=2。本系统中PCLK=50.7MHzTCON定时器控制寄存器..’.参考:deadzoneoperationenable;InverteroffTCNTB0&TCMPB0定时器计数缓冲区寄存器和比较缓冲区寄存器TCNTB0决定了脉冲的频率,TCMPB0决定了正脉冲的宽度。当TCMPB0=TCNTB0/2时,正负脉冲宽度相同;当TCMPB0由0变到TCNTB0时,负脉冲宽度不断增加。参考:脉冲频率为1Hz。TCNTO0定时器观察寄存器..’.三、程序分析Linux下的直流电机程序包括模块驱动程序和应用程序两部分。Module驱动程序实现了以下方法:staticstructs3c2410_dcm_fops={owner:THIS_MODULE,open:s3c2410_dcm_open,ioctl:s3c2410_dcm_ioctl,release:s3c2410_dcm_release,};开启设备时,配置IO口为定时器工作方式:({GPBCON&=~0xf;GPBCON|=0xa;})配置定时器的各控制寄存器:({TCFG0&=~(0x00ff0000);\TCFG0|=(DCM_TCFG0);\TCFG1&=~(0xf);\TCNTB0=DCM_TCNTB0;/*lessthan10ms*/\TCMPB0=DCM_TCNTB0/2;\TCON&=~(0xf);\TCON|=(0x2);\TCON&=~(0xf);\TCON|=(0x19);})在s3c2410_dcm_ioctl中提供调速功能接口:caseDCM_IOCTRL_SETPWM:returndcm_setpwm((int)arg);应用程序dcm_main.c中调用:ioctl(dcm_fd,DCM_IOCTRL_SETPWM,(setpwm*factor));实现直流电机速度的调整。具体程序代码da_main.c如下:#includestdio.h#includefcntl.n#includestring.n#includesys/ioctl.n#defineDCM_IOCTRL_SETPWM(0X10)..’.#defineDCM_TCNTB0(16384)staticintdcm_fd=-1;char*DCM_DEV=*/dev/dcm/Oraw*;/延时时间voidDelay(intt){inti;for(;t0;t--)for(i=0;i400;i++);}/主程序intmain(intarac,char**argv){inti=0;intstatus=1;intsetpwm=0;intfartor=DCM_TCNTB0/1024;if((dcm_fd=open(DCM_DEC,O_WRONLY))0{printf(*Erroropening%sdevice\n*,DCM_DEV);return1;}for(;;){for(i=-512;i=512;i++){if(status==1)setpwm=i;elsesetpwn=-i;ioctl(dcm_fd,DCM_IOCTRL_SETPWM,(setpwm*factor));/速度调整Delay(500);printf(*setpwm=%d\n*,setpwm);}status=-status;}close(dcm_fd);return0;}..’.四、操作步骤:1、配置NFS服务器连接好串口线、网络线,接着启动minicom..’.然后设置一下虚拟机:在vm-〉settings-〉hardware虚拟机的设置,修改网络连接方式为BridedPing宿主机(ping192.168.0.121)。然后mountnfs(mount–tnfs–onolock192.168.0.121:/arm2410s/host),查看是否成功:执行ls/mnt,可看到已显示宿主机/arm2410s目录里的内容,显示成功。..’.2、进入/arm2410s/exp/basic/10_dcmotor目录,使用vi编辑器编辑源程序da_main3、编译应用程序运行make产生da可执行文件da_main4、下载调试切换到minicom终端窗口,输入mount–tnfs192.168.0.xxx:/arm2410s/hostinsmod/host/kernel-2410s/drivers/char/s3c2410-dc-motor.ocd/host/exp/basic/10_dcmotor/./dcm_main程序运行结果:直流电机变速转动。..’.五、总结通过学习嵌入式系统设计这门课,我熟悉了Linux开发环境,学会基于S3C2410的Linux开发环境的配置和使用。同时学会使用Linux的armv4l-unknown-linux-gcc编译等编译方法,以及使用基于NFS方式的下载调试,比较深入了解嵌入式开发的基本过程。在这门课的学习过程当中,老师采用理论与实验想结合的方法,使我们对嵌入式这门深奥的专业课更好的理解和撑握,这对于我们这次直流电机程序的顺利完成起了铺垫的作用。通过这次设计,我掌握了ARM本身自带的PWM,掌握相应寄存器的配置了解直流电机的工作原理,学会用软件的方法实现直流电机的脉冲分配。这对以后的学习和工作都起到了一定的作用,同时加强了动手能力和学业技能。由于对嵌入式系统的开发过程掌握得不够熟练,所以刚开始做的时候在配置NFS上花了很长时间,通过这次程序的编译,下载调试直到最后程序运行出正确结果,我感觉到自己所掌握的知识是那么的有限,还有许多需要改进和不足的地方,同时这次设计增加了我对这门学科的兴趣。总体来说,这次设计让我受益匪浅。在摸索该如何设计使之实现所需功能的过程中,培养了我的设计思维,增加了实际操作能力。在让我体会到了设计的艰辛的同时,更让我体会到成功的喜悦和快乐。最后感谢李老师和同学们的指导和帮助!