linux步进电机驱动程序,基于Linux的步进电机驱动程序设 - 嵌入式操作系统 - 电子发烧友网...

定义时钟节拍函数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中发送步进电机脉冲,并重新添加定时器,从而实现步进电机的转动。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值