定义全局变量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.
");
return -1;
}
request_region(0x28000006, 1, DEVICE_NAME); //申请该I/O端口
init_timer(&ttimer); //初始化定时器ttimer
ttimer.function=time_tick; //填写定时器处理函数为time_tick()
编写ioctl函数用来接收应用程序对于步进电机的控制。
[1] [2] [3]
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。