EraSoC-1000C的家用电脑绣花机解决方案
- 发布时间:2009/4/1 14:29:35
- 浏览次数:1709
如今,美国胜家、日本兄弟以及中国飞跃都相继上市家用电脑绣花机或刺绣机,以期待缝纫机再次敲开老百姓的家门,可受限于芯片技术的发展,使得家用电脑绣花机的智能化程度、制造成本、维修方式都难于达到民品的标准。为此,北京中科亿芯信息技术有限公司使用本公司自主设计的EraSoC-1000C处理器芯片所开发的家用电脑绣花机方案,采用了linux2.6内核,并添加实时补丁(rtlinux)以使其具备更完善的实时系统功能;精致的Qtapia图形系统软件(以下简称QT),避免了采用WinCE而带来的昂贵*费用,大大降低了电子控制系统的制造成本,使得电脑绣花机走入家庭变得指日可待。
系统简介
EraSoC-1000系列芯片作为国内*的基于龙芯内核的高性能SoC,凭借其强大的CPU处理能力、64位浮点运算能力,的总线架构、可实现低功耗的动态变频技术、丰富的片上设备,已广泛地应用在国内各种嵌入式领域。
基于EraSoC-1000C的电脑绣花机系统主要由三个电机协调工作实现绣花功能:一个主轴电机,采用交流伺服交流来控制针头的上下运动;X、Y轴步进电机各一个,以实现工作面的横向与纵向移动,系统控制框图示于图1。
硬件设计
根据图1所示的整个系统方案的控制实现原理,我们把此方案的主控制单元分为上、下位机结构,并由一颗EraSoC-1000C芯片来完成上、下位机的协同工作。
上位机结构
上位机主要负责人机交互、文件读取与解析、部分传感器信号的处理;
·STN/TFTLCD显示与触摸控制的实现
此部分作为人机交互的主要平台,通过控制触摸屏来控制电机做出相应的动作就是在此部分实现的。其中液晶部分对东芝T6963CFGLCD驱动芯片的控制是由EraSoC-1000C引出的8位数据线和5个GPIO实现的,本次用的黑白屏,如果需要可以用彩色屏,尺寸也可以任意选择。而触摸屏的控制是由EraSoC-1000C的spi信号线和片选线时钟线经过触摸屏控制器ADV7843实现的。
·传感器通过GPIO与EraSoC-1000C的通讯
该绣花机一共用到了6个传感器分别由EraSoC-1000C提供的6个可以作为中断输入的GPIO控制。这些传感器分别是x轴方向电机的传感器,y轴方向的电机传感器,z轴方向的电机传感器,测试绣花针是不是在上针位(此时针在所有位置的zui高点)的传感器,测试绣花针是不是离开布的传感器,和一个用于是否绕线的辅助功能的传感器。
下位机结构
下位机主要负责输出电机控制信号(PWM)、协同工作以及部分传感器信号的处理。
·PWM对交流伺服电机的控制
在EraSoC-1000C芯片中一共有六路脉冲宽度调节/定时/计数控制器(以下简称PWM)。每一路PWM工作和控制方式*相同,都有两路输入信号(gate_clk_pad_i,capt_pad_i)和一路脉冲宽度输出信号(pwm_o)。由于系统时钟高达60MHz,计数寄存器和参考寄存器均32位数据宽度,这样开发人员可通过编成让PWM产生各种复杂的近似线性的输出信号,非常适合电机的控制。
·步进电机的驱动
主要采用专门的步进电机驱动芯片,有EraSoC-1000C给出控制信号,控制电机按照要求运动。本次设计步进电机的驱动芯片用的是UTC公司的L6219,只需用EraSoC-1000C的4个GPIO控制一个L6219来控制电机的转动速度和所转的角度。
·主轴电机的控制
同步检测:由1个外部中断完成,为了能够控制直流电机转动速度,用了一个时钟作为计数器来计数一个时间段的针数,如果快了或者慢了就做出调整。
电机控制:由1个GPIO完成,此GPIO用来控制电机电源的开通与关闭。
图2和图3分别为系统方案的电路构造图和电路板实图。
软件设计和系统程序移植
Bootloader
EraSoC-1000C的bootloader使用PMON2000。经过裁剪和增加相关驱动的代码在EraSoC的*可直接下载。用户只需按照EraSoC-1000C的用户手册进行配置和编译即可。
内核移植
EraSoC-1000C使用Linux2.4.17和Linux2.6.18.1内核。经过移植后的源代码可以在EraSoC的*下载。
交叉编译工具链mipsel-linux-gcc也可以在该下载。
配置内核使用erasoc_defconfig配置文件,用户可根据自己需要裁剪不用的驱动和文件系统等。
Qtapia编译
QT是目前在linux上使用较广的一个图形系统。在网上下载以下软件的源码包之后,按照EraSoC的QT*安装手册,编译生成QT的可执行代码。
qt-embedded-2.3.7.tar.gz
qt-x11-2.3.2.tar.gz
qtopia-free-1.7.0.tar.gz
tmake-1.11.tar.gz
e2fsprogs-1.35.tar.gz
驱动及fireware开发
基于EraSoC-1000C的电脑绣花机方案成功将Linux引入缝纫设备的控制是一个业界的技术突破。以前普遍认为Linux不适合应用于像缝制设备行业这类对功能集成度和实时性要求高的工控行业,其实是不正确的。正因为凭借EraSoC-1000C芯片处理能力强、总线速度高、设备集成度高的特点,使得系统在运行linux时,处理器可以很好的完成实时性工作,同时把任务调度、协议处理、数据交换、人际交互交由linux来处理,用户会发现整个系统开发过程会变得轻松自如。
X,Y轴步进电机驱动开发
X和Y轴步进电机驱动的原理是:每隔一定的时间间隔通过GPIO发送一个步进信号,电机行走一个相位。而时间间隔的大小通过EraSoC-1000C的实时时钟来控制,时间计数一到,实时时钟产生一个中断,CPU在中断处理并向步进电机发送一个步进命令。X,Y轴电机的速度就通过这些时间间隔的大小调整。当需要加速时,减小每次的时间间隔,反之就是减速。X和Y轴驱动程序里分别注册了一个时钟中断处理程序,并在驱动里提供一个写函数控制实时时钟的计时大小和开始计时。当绣花程序启动,通过该驱动的写函数,启动实时时钟计时。当预定时间到达,中断产生,中断处理程序驱动电机步进一个相位,此时根据一个信号量来确定是否继续要驱动电机,如果需要继续驱动,则再次初始化实时时钟的计时。
voidx_timer_start(unsignedinttime)//初始化x轴的实时时钟,time的单位9600秒
{
era_wri((time*32768)/9600+
era_readl(ICTRTC_READ0),
ICTRTC_MATCH1);
}
staticirqreturn_tx_step_irq(intirq,void*_host,structpt_regs*regs)
{
structera_host*host=_host;
x_step_go();//x轴电机步进一个相位
if(x_go)//如果x轴需要继续运转,该
变量是全局变量,由主函数改变值
{
x_time=x_get_time(host);//计算下次
步进的时间间隔
x_timer_start(x_time);
}
}
Z轴电机的驱动开发:
Z轴电机使用EraSoC-1000C的PWM进行控制。EraSoC-1000C的PWM驱动采用Linux通用的PWM驱动接口,所以我们只要在应用层开发相应的控制程序就可以了。
例如,EraSoC的PWM驱动提供一个write函数给用户层,用户通过该函数的参数可以控制PWM的输出方波:
ssize_tpwm_write(structfile*filp,constchar*buf,size_tcount,loff_t*f_pos)
{
#defineCLK_PER_NS48//48Mhz
busfreq
staticunsignedcharpBuf[3];
/*pBuf[0]高电平时间(ns),
pBuf[1]低电平时间(ns),
pBuf[2]是否使能PWM电平输出*/
copy_from_user(pBuf,buf,3);
era_wri(0,RPTC_CTRL);//停止PWM
if(pBuf[2]&GO)//pBuf[2],是否使
能PWM输出
{
era_wri(pBuf[0]*CLK_PER_NS,RPTC_HRC);
era_wri(pBuf[1]*CLK_PER_NS,RPTC_LRC);
era_wri(OE,RPTC_CTRL);//使能
PWM方波输出
}
returncount;
}
显示屏驱动
EraSoC-1000C的Linux内核包含标准的framebuffer接口的LCD驱动程序,用户也只需按照标准的控制LCD的函数接口编写应用程序。通过open(“/dev/fb0,O_RDWR”)打开LCD显示设备,然后通过mmap函数将显存映射到用户空间,用户现在就可以通过简单的读写来控制显存,以达到控制LCD显示的目的。
触摸屏驱动
EraSoC-1000C的Linux内核也已经包含触摸屏的标准驱动,采用SPI接口。用户只需在编译QT的时候将该触摸屏驱动加入,就可以直接在QT下使用。
U盘驱动
EraSoC-1000C的U盘驱动也是标准的Linux驱动。用户只需简单的使用mount命令将U盘挂载,然后通过open,read,write等标准函数对U盘进行读写。
NANDFlash驱动
EraSoC-1000C采用的Yaffs2文件系统管理NANDFlash。用户接口也是十分的简单,如同访问其他文件系统一样,可直接通过读写函数访问。
蜂鸣器,断线,压脚,绕线检测等驱动
这些功能均使用GPIO实现,我们为这些功能分别实现了驱动,在驱动里提供一个读函数来控制。用户只需简单的使用open函数打开设备,就可以使用read函数读取这些传感器的状态。
interasoc_gpio_read(intsignal)
{
if(signal>=96)
return0;
if(signal>=64)
{
return((1<<(signal-64))&era_readl(ERASOC_GPIO2_DATRD))?1:0;
}
elseif(signal>=32)
{
return((1<<(signal-32))&era_readl(ERASOC_GPIO1_DATRD))?1:0;
}
else
{
return((1<