21ic问答首页 - 求多任务系统中步进减速电机平稳运行的思路
求多任务系统中步进减速电机平稳运行的思路
showmyself2022-08-03
调了好几天都没搞定,发现步进电机驱动起来很简单,但是要想电机转动平稳太难了,尤其是在多任务的系统中。用的是24BJY48步进减速电机,四相八拍方式,步距角是5.625°,用的是脉冲驱动方式。
我的系统现在有多个任务,就是在while(1)循环中有好几个函数需要执行,步进电机驱动是其中一个,现在如果把步进电机测试函数
单独放在while(1)中,如下
int main(void)
{
while(1)
{
motor_test(); //步进电机驱动
}
}
那么步进电机运转很丝滑,很平稳,我通过多次调试找到了延时设置为1500us时,电机运转最平稳,当然这只限于while(1)中只有这一个函数时,
如果我同时运行其他任务,如下
int main(void)
{
while(1)
{
motor_test(); //步进电机驱动
read_sensor();
status_update();
}
}
void motor_test()
{
PAH; PBL;PCL;PDL;
SysTick_delay_us(1500);
PAH; PBH;PCL;PDL;
SysTick_delay_us(1500);
PAL; PBH;PCL;PDL;
SysTick_delay_us(1500);
PAL; PBH;PCH;PDL;
SysTick_delay_us(1500);
PAL; PBL;PCH;PDL;
SysTick_delay_us(1500);
PAL; PBL;PCH;PDH;
SysTick_delay_us(1500);
PAL; PBL;PCL;PDH;
SysTick_delay_us(1500);
PAH; PBL;PCL;PDH;
SysTick_delay_us(1500);
}
那么,电机会转起来,但是会产生震动,怎么调整延时值都没用,1500上下的延时我都试过了,一样震动,可能有人会说,用定时器中断,我当然试过,而且调试了很长时间,一样的结果也是震动,我知道是其他程序影响了电机运转,但不至于对时间要求这么精确把?其他的程序执行会分掉时间,但不至于会影响到电机这么严重吧?
实际项目中不可能只有电机控制这一个函数,肯定是多个函数一起运行的。
我甚至把这两个函数read_sensor();和status_update();用时间片轮询的方法写了一遍,就是给他们分配更长的执行时间,让步进电机执行时间尽可能短,也还是不行,还是震动。
真的没有思路了,大家有什么好的思路吗?可以解决震动问题
我的系统现在有多个任务,就是在while(1)循环中有好几个函数需要执行,步进电机驱动是其中一个,现在如果把步进电机测试函数
单独放在while(1)中,如下
int main(void)
{
while(1)
{
motor_test(); //步进电机驱动
}
}
那么步进电机运转很丝滑,很平稳,我通过多次调试找到了延时设置为1500us时,电机运转最平稳,当然这只限于while(1)中只有这一个函数时,
如果我同时运行其他任务,如下
int main(void)
{
while(1)
{
motor_test(); //步进电机驱动
read_sensor();
status_update();
}
}
void motor_test()
{
PAH; PBL;PCL;PDL;
SysTick_delay_us(1500);
PAH; PBH;PCL;PDL;
SysTick_delay_us(1500);
PAL; PBH;PCL;PDL;
SysTick_delay_us(1500);
PAL; PBH;PCH;PDL;
SysTick_delay_us(1500);
PAL; PBL;PCH;PDL;
SysTick_delay_us(1500);
PAL; PBL;PCH;PDH;
SysTick_delay_us(1500);
PAL; PBL;PCL;PDH;
SysTick_delay_us(1500);
PAH; PBL;PCL;PDH;
SysTick_delay_us(1500);
}
那么,电机会转起来,但是会产生震动,怎么调整延时值都没用,1500上下的延时我都试过了,一样震动,可能有人会说,用定时器中断,我当然试过,而且调试了很长时间,一样的结果也是震动,我知道是其他程序影响了电机运转,但不至于对时间要求这么精确把?其他的程序执行会分掉时间,但不至于会影响到电机这么严重吧?
实际项目中不可能只有电机控制这一个函数,肯定是多个函数一起运行的。
我甚至把这两个函数read_sensor();和status_update();用时间片轮询的方法写了一遍,就是给他们分配更长的执行时间,让步进电机执行时间尽可能短,也还是不行,还是震动。
真的没有思路了,大家有什么好的思路吗?可以解决震动问题
赞0
评论
2022-08-30
赞0
评论
2022-08-16
赞0
评论
2022-08-09
赞0
评论
2022-08-07
赞0
既然你用单任务测量出来了平滑运行的刷新速度,那么time中断独占肯定可以实现你需要的目标,当然关键是这个中断在多任务系统中保持最高优先级,这在我们类似需要高水平独立稳定时钟处理问题,像类似软UART当中就经常碰到,记得给予对应的time中断在所有中断里面最高优先级,如果有示波器你可以在该中断里面设置一个IO端口翻转命令,然后用示波器去测量在多任务都开启的条件下,该IO翻转命令导致的方波是不是稳定和准确就成了。
评论
2022-08-07
赞0
我程序上用了一些任务调度机制,已经把别的任务的执行时间间隔拉长了,然后让电机这边尽可能得到更多的执行机会了,但仍然没有太大作用,后来我觉得是电机的运行间隔时间要求太短了,导致背的任务无论怎么调整都不能满足这个时间间隔的要求,所以可能最终还是需要放在中断中来弄
评论
2022-08-06
赞0
应该不是细分的问题,是多任务影响了电机运行的时间,因为如果就驱动电机的话,运转很平稳
评论
2022-08-06
赞0
while(1) { motor_test(); //步进电机驱动 read_sensor(); status_update(); }
这电机走几步,刚动起来,就丢下去干别的事情,
别的事情占多少,示波器一抓电机驱动就知道了,
评论
2022-08-06
赞0
评论
2022-08-06
您需要登录后才可以回复 登录 | 注册