上海四宏电机有限公司主营产品:低压伺服电机、交流伺服电机、步进电机、无刷电机以及配套驱动器。
全国服务热线:021-59751541
13482895970
13482896782
 
新闻资讯
常见问题行业资讯公司新闻
联系我们
电话:021-59751541
邮箱:jina@sihengmotor.com
传真:021-59754896
地址:上海市青浦区崧春路399弄8号
你现在所在的位置:网站首页 > 新闻资讯 > 步进电机驱动程序设计

步进电机驱动程序设计

信息来源:步进电机供应商上海四宏电机有限公司    添加时间:2018-03-16

由于步进电机用到了I/O端口,而在ARM9中操纵端口要用虚拟地址而非实际的物理地址,所以要修改内核代码。

修改文件内核源代码中间的smdk.c,在结构体

static struct map_desc smdk_io_desc] __initdata = {

{ vCS8900_BASE, pCS8900_BASE, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 },

{ vCF_MEM_BASE, pCF_MEM_BASE, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 },

{ vCF_IO_BASE, pCF_IO_BASE, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 },

LAST_DESC

};

中添加一行数组元素{ 0xd3000000, 0x28000000, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 },则步进电机的物理地址0x28000006对应的虚拟地址为0xd3000006,在驱动程序中应对这个地址进行操纵。

定义全局变量num和status用来控制步进电机的速度和方向:

static int num=1;

static enum{off,clockwise,anticlockwise} status=off;

定义步进电机的整步模式正转脉冲表:

unsigned char pulse_table[] =

{

0x05, 0x09, 0x0a, 0x06,

};

定义时钟节拍函数time_tick()

static void time_tick(unsigned long data)

{

static int i=0;

switch(status)

{

case off: break;

case clockwise:

if(++i==num){

i=0;

if( row == 4 ) row = 0;

(*(char *)0xd3000006)=pulse_table[row++];

}

ttimer.expires=jiffies+1;

add_timer(&ttimer);

break;

case anticlockwise:

if(++i==num){

i=0;

if( row == -1 ) row = 3;

(*(char *)0xd3000006)=pulse_table[row--];

}

ttimer.expires=jiffies+1;

add_timer(&ttimer);

break;

case default: break;

}

}

在time_tick()函数中判定步进电机的状态,是停止、正转还是反转。若是正转,则按正向顺序发送脉冲,并添加定时器ttimer;若是反转,则按反向顺序发送脉冲,并添加定时器ttimer;若是停止则不再发送脉冲,也不再添加定时器。

在stepper_module_init()函数中申请I/O端口,并初始化定时器ttimer:

if(check_region(0x28000006, 1)) //看该I/O端口是否已经被占用

{

printk("The stepper port is used by another module.\n");

return -1;

}

request_region(0x28000006, 1, DEVICE_NAME); //申请该I/O端口

init_timer(&ttimer); //初始化定时器ttimer

ttimer.function=time_tick; //填写定时器处理函数为time_tick()

编写ioctl函数用来接收应用程序对于步进电机的控制。

int device_ioctl( struct inode *inode, struct file *file, unsigned int ioctl_num,

unsigned long ioctl_param)

{

struct stepper * s;

/* 根据实际程序中的不同需求更改ioctl函数的调用*/

switch (ioctl_num)

{

case IOCTL_SET_MSG:

s = (struct stepper*) ioctl_param;

switch (s->CmdID)

{

case 0: /*开始*/

status=clockwise;

ttimer.expires=jiffies+1; //开启定时器

add_timer(&ttimer);

break;

case 1: status=off; break; /*停止*/

case 2: /*反转*/

if(status==clockwise){ status=anticlockwise; }

if(status==anticlockwise){ status=clockwise; }

break;

case 3: if(num!=1)num--; break; /*加速*/

case 4: num++; break; /*减速*/

}

}

return 0;

};

通过s指针得到stepper结构中的表示命令类型的参数,根据该参数判定命令类型,0是start起动,1是stop停止,2是reverse反向,3是up电机加速,4是down电机减速,通过改变全局变量num和status来控制电机。电机的起动是通过在start分支中起动一个定时器ttimer,然后在定时器处理函数time_tick中发送步进电机脉冲,并重新添加定时器,从而实现步进电机的转动。


上海四宏电机有限公司主营产品:步进电机、无刷电机、伺服电机、步进电机驱动器、刹车电机、直线电机等各类型号的步进电机,欢迎来电咨询。电话:021-59751541
上海四宏电机有限公司热销产品推荐
步进电机相关行业资讯
1、五金机电业整合资源 开创循环经济试点
2、步进电机在未来有四大发展趋势
3、步进电机13个常见故障解答
4、检查时要注意步进电机举刷机构的三点情况
5、使用前要对步进电机做好两方面情况进行检查
6、如何减少步进电机的发热
7、为何开机时步进电机在抖动
8、上海四宏电机----步进电机制造行业中的翘楚!
9、步进电机在使用中出现异常振动的原因以及解决方法
10、如何检修步进电机驱动器烧掉的MOS管
11、步进电机全闭式环控制
12、电励磁步进电机是一种怎样的电机
13、步进电机驱动器电流、电压如何确定
14、步进电机具有哪些方面的优势
15、步进电机和步进电机缺优点对比分析
关于我们
▪ 公司简介
▪ 组织架构
▪ 企业文化
▪ 人才招聘
产品中心
▪ 伺服电机
▪ 步进电机
▪ 步进电机驱动器
▪ 直流电机
▪ 减速器
▪ 控制系统
下载中心
▪ 伺服电机驱动器
▪ 其它资料下载
▪ 驱动器系列
▪ 步进电机系列
▪ 伺服电机系列
▪ 无刷电机系列
新闻资讯
▪ 常见问题
▪ 行业资讯
▪ 公司新闻
CONTACT  联系我们
电话:021-59751541
邮箱:jina@sihengmotor.com
地址:上海市青浦区崧春路399弄8号
上海四宏电机有限公司版权所有     ICP备案号:沪ICP备17052886号     公安部备案号:31011802003254
在线客服
无刷电机
步进电机
伺服电机
无刷驱动
伺服驱动
步进驱动
021-59751541
关闭