硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3489|回复: 19
收起左侧

[有问必答] 又来求助大家了,关于RTX操作系统的电机控制

[复制链接]

10

主题

39

回帖

69

积分

初级会员

积分
69
发表于 2018-8-22 20:28:26 | 显示全部楼层 |阅读模式
怎样让任务1、2执行的时候,任务3、4停止,
         任务3、4执行的时候,任务1、2停止,
         由于必须保证电机1、2同时运动,电机3、4同时运动,
         我采用了RTX操作系统,有哪位大哥能帮我看看这个问题吗?不胜感激!
         (我试着用了 标志位,不知道什么原因任务就执行不了了)

1234.jpg
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2018-8-22 23:29:06 | 显示全部楼层
本帖最后由 taobaofarmer 于 2018-8-22 23:30 编辑

这几个动作要放到一个任务里,不能分开,万一任务执行错乱的话后果严重,不要用操作系统的思想来实现好几个伺服动力之间的逻辑
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-8-23 01:16:48 | 显示全部楼层
将这四个合并到1个任务里面实现,通过命令控制此任务就行。控制方式可以采用事件标志组。
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-23 10:13:44 | 显示全部楼层
taobaofarmer 发表于 2018-8-22 23:29
这几个动作要放到一个任务里,不能分开,万一任务执行错乱的话后果严重,不要用操作系统的思想来实现好几个 ...

放到一个任务中,怎么实现电机1、2同时运动呢?
因为我解决不了电机1、2同时运动这个问题才不得以用操作系统的。还请帮忙看看哈
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-23 10:16:45 | 显示全部楼层
eric2013 发表于 2018-8-23 01:16
将这四个合并到1个任务里面实现,通过命令控制此任务就行。控制方式可以采用事件标志组。

放到一个任务中,怎么实现电机1、2同时运动呢?使用 事件标志组吗?
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2018-8-23 11:03:23 | 显示全部楼层
为何电机12放到同一个任务里不能同时运动呢,操作系统的任务也是分时运行的
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-23 11:17:34 | 显示全部楼层
taobaofarmer 发表于 2018-8-23 11:03
为何电机12放到同一个任务里不能同时运动呢,操作系统的任务也是分时运行的

我理解的操作系统是 任务1 任务2 是同时进行,但是任务1 里面的程序还是按顺序从上到下执行,所以 任务1中      “电机1正转10秒; 电机2正转5秒”  是不能同时进行的,所以我分成了两个任务,才实现了 “电机1正转10秒;
      电机2反转5秒” 同时进行,不知道朋友你有什么建议?
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-23 11:19:01 | 显示全部楼层
eric2013 发表于 2018-8-23 01:16
将这四个合并到1个任务里面实现,通过命令控制此任务就行。控制方式可以采用事件标志组。


u8 flag1=0;
u8 flag2=0;

__task 任务1
{
  while(1)
  {  
   if(flag1==0)
    {
          flag1=1;
      电机1正转10秒;
      电机2正转5秒;
      flag2=1;       
    }
        else 电机1 、2停止
  }
}

任务2
__task 任务2
{
  while(1)
  {
   if(flag1==0)
   {
          flag1=1;
      电机2反转5秒;
      电机1反转10秒;       
      flag2=1;
    }
        else 电机1 、2停止
  }
}

任务3
__task 任务3
{
  while(1)
  {
   if(flag2==1)
    {
          flag2=0;
      电机3正转10秒;
      电机4正转5秒;
          flag1=0;
    }
        else 电机3 、4停止
  }
}
任务4
__task 任务4
{
  while(1)
  {
   if(flag2==1)
    {
          flag2=0;
      电机4反转5秒;
      电机3反转10秒;
      flag1=0;       
    }
        else 电机3 、4停止
  }
}

困惑 怎样让任务1、2执行的时候,任务3、4停止,
     任务3、4执行的时候,任务1、2停止,
         由于必须保证电机1、2同时运动,电机3、4同时运动,
         我采用了RTX操作系统,有哪位大哥能帮我看看这个问题吗?不胜感激!
         (我试着用了 标志位,不知道什么原因任务就执行不了了)
这个是刚改的程序,还请坛主你帮忙看看哈,感谢了!         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-23 11:19:20 | 显示全部楼层
taobaofarmer 发表于 2018-8-23 11:03
为何电机12放到同一个任务里不能同时运动呢,操作系统的任务也是分时运行的


u8 flag1=0;
u8 flag2=0;

__task 任务1
{
  while(1)
  {  
   if(flag1==0)
    {
          flag1=1;
      电机1正转10秒;
      电机2正转5秒;
      flag2=1;        
    }
        else 电机1 、2停止
  }
}

任务2
__task 任务2
{
  while(1)
  {
   if(flag1==0)
   {
          flag1=1;
      电机2反转5秒;
      电机1反转10秒;        
      flag2=1;
    }
        else 电机1 、2停止
  }
}

任务3
__task 任务3
{
  while(1)
  {
   if(flag2==1)
    {
          flag2=0;
      电机3正转10秒;
      电机4正转5秒;
          flag1=0;
    }
        else 电机3 、4停止
  }
}
任务4
__task 任务4
{
  while(1)
  {
   if(flag2==1)
    {
          flag2=0;
      电机4反转5秒;
      电机3反转10秒;
      flag1=0;        
    }
        else 电机3 、4停止
  }
}

困惑 怎样让任务1、2执行的时候,任务3、4停止,
     任务3、4执行的时候,任务1、2停止,
         由于必须保证电机1、2同时运动,电机3、4同时运动,
         我采用了RTX操作系统,有哪位大哥能帮我看看这个问题吗?不胜感激!
         (我试着用了 标志位,不知道什么原因任务就执行不了了)
这个是刚改的程序,还请朋友你帮忙看看哈,感谢了!         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
         
回复

使用道具 举报

65

主题

432

回帖

632

积分

金牌会员

积分
632
发表于 2018-8-23 11:39:52 | 显示全部楼层
挺简单的事儿,搞的这么复杂
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-23 14:25:57 | 显示全部楼层
taobaofarmer 发表于 2018-8-23 11:39
挺简单的事儿,搞的这么复杂

???大佬有什么解决办法?还请赐教啊
回复

使用道具 举报

0

主题

138

回帖

138

积分

初级会员

积分
138
QQ
发表于 2018-8-23 23:26:12 | 显示全部楼层
电机控制用啥操作系统啊,直接大循环。而且你的同一个电机居然在不同任务里边控制?不怕程序错乱吗?
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-24 09:37:24 | 显示全部楼层
wx_D4tOZzZO 发表于 2018-8-23 23:26
电机控制用啥操作系统啊,直接大循环。而且你的同一个电机居然在不同任务里边控制?不怕程序错乱吗?

得要求舵机同步,并且不同转速,怎么大循环??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-8-25 00:23:28 | 显示全部楼层

这样,我们换一个实现思路,你用裸机的时候如何实现你的功能,你方便的话,你写出来,我看看。

然后我们就直接把这裸机的改到一个RTX的任务里面实现。
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-25 10:17:57 | 显示全部楼层
eric2013 发表于 2018-8-25 00:23
这样,我们换一个实现思路,你用裸机的时候如何实现你的功能,你方便的话,你写出来,我看看。

然后我 ...

好的
__task void Sevor1(void)
{

for(;;)
{                         
                while(!flag)  /* PA0 定时器2 Channl 1 */
                {          
                        if(led1pwmval<110)/* 膝舵机后摆 */
                        {
                                led1pwmval++;
                        }
                        else
                                flag=1;
                          os_dly_wait(15);
                          TIM_SetCompare1(TIM2,led1pwmval);
                 }               
         while(!flag2)  /* PA1 定时器2 Channl 2 */
                {          
                        if(led2pwmval<100) /* 髋舵机后摆 */
                        {
                                led2pwmval++;
                        }
                        else
                                flag2=1;
                          os_dly_wait(35);
                          TIM_SetCompare2(TIM2,led2pwmval);
                }       
}
}
__task void Sevor2(void)
{
for(;;)
{                       
         while(flag2)
                {
                        if(led2pwmval>50) /* 髋舵机前伸 */
                        {
                                led2pwmval--;                               
                        }
                        else
                                flag2=0;
                          os_dly_wait(30);
                          TIM_SetCompare2(TIM2,led2pwmval);
                }
  while(flag)
                {
                        if(led1pwmval>50) /* 膝舵机前伸 */
                        {
                                led1pwmval--;                               
                        }
                        else
                                flag=0;
                          os_dly_wait(8);
                          TIM_SetCompare1(TIM2,led1pwmval);
                }
}       
}

__task void Sevor3(void)
{
        for(;;)
        {       
          //os_dly_wait(1000);
                while(!flag4)  /* PA1 定时器2 Channl 2 */
                {
                        if(led4pwmval<100) /* 髋舵机后摆 */
                        {
                                led4pwmval++;
                        }
                        else
                                flag4=1;
                          os_dly_wait(35);
                          TIM_SetCompare4(TIM2,led4pwmval);
                }
                while(!flag3)  /* PA0 定时器2 Channl 1 */
                {
                        if(led3pwmval<110)/* 膝舵机后摆 */
                        {
                                led3pwmval++;
                        }
                        else
                                flag3=1;
                          os_dly_wait(15);
                          TIM_SetCompare3(TIM2,led3pwmval);
                }
  }       
}
__task void Sevor4(void)
{
for(;;)
{       
   while(flag3)
                {
                        if(led3pwmval>50) /* 膝舵机前伸 */
                        {
                                led3pwmval--;                               
                        }
                        else
                                flag3=0;
                          os_dly_wait(8);
                          TIM_SetCompare3(TIM2,led3pwmval);
                }               
        while(flag4)
                {
                        if(led4pwmval>50) /* 髋舵机前伸 */
                        {
                                led4pwmval--;                               
                        }
                        else
                                flag4=0;
                          os_dly_wait(30);
                          TIM_SetCompare4(TIM2,led4pwmval);
                }
}       
}
感谢了!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-8-25 10:31:06 | 显示全部楼层
wx_UcY3CH1i 发表于 2018-8-25 10:17
好的
__task void Sevor1(void)
{

贴下你不使用RTX的裸机实现方式。
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-25 10:35:59 | 显示全部楼层
eric2013 发表于 2018-8-25 10:31
贴下你不使用RTX的裸机实现方式。

                while(!flag)  /* PA0 定时器2 Channl 1 */
                {          
                        if(led1pwmval<110)/* 膝舵机后摆 */
                        {
                                led1pwmval++;
                        }
                        else
                                flag=1;
                          os_dly_wait(15);
                          TIM_SetCompare1(TIM2,led1pwmval);
                 }               
         while(!flag2)  /* PA1 定时器2 Channl 2 */
                {          
                        if(led2pwmval<100) /* 髋舵机后摆 */
                        {
                                led2pwmval++;
                        }
                        else
                                flag2=1;
                          os_dly_wait(35);
                          TIM_SetCompare2(TIM2,led2pwmval);
                }

         while(flag2)
                {
                        if(led2pwmval>50) /* 髋舵机前伸 */
                        {
                                led2pwmval--;                               
                        }
                        else
                                flag2=0;
                          os_dly_wait(30);
                          TIM_SetCompare2(TIM2,led2pwmval);
                }
  while(flag)
                {
                        if(led1pwmval>50) /* 膝舵机前伸 */
                        {
                                led1pwmval--;                               
                        }
                        else
                                flag=0;
                          os_dly_wait(8);
                          TIM_SetCompare1(TIM2,led1pwmval);
                }

                while(!flag4)  /* PA1 定时器2 Channl 2 */
                {
                        if(led4pwmval<100) /* 髋舵机后摆 */
                        {
                                led4pwmval++;
                        }
                        else
                                flag4=1;
                          os_dly_wait(35);
                          TIM_SetCompare4(TIM2,led4pwmval);
                }
                while(!flag3)  /* PA0 定时器2 Channl 1 */
                {
                        if(led3pwmval<110)/* 膝舵机后摆 */
                        {
                                led3pwmval++;
                        }
                        else
                                flag3=1;
                          os_dly_wait(15);
                          TIM_SetCompare3(TIM2,led3pwmval);
                }

   while(flag3)
                {
                        if(led3pwmval>50) /* 膝舵机前伸 */
                        {
                                led3pwmval--;                               
                        }
                        else
                                flag3=0;
                          os_dly_wait(8);
                          TIM_SetCompare3(TIM2,led3pwmval);
                }               
        while(flag4)
                {
                        if(led4pwmval>50) /* 髋舵机前伸 */
                        {
                                led4pwmval--;                               
                        }
                        else
                                flag4=0;
                          os_dly_wait(30);
                          TIM_SetCompare4(TIM2,led4pwmval);
                }
这就是,只能让动作一步一步做,没办法做到几个同步,我想做个双足机器人,尽量是他的步态平滑,多谢坛主了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-8-26 01:13:07 | 显示全部楼层
wx_UcY3CH1i 发表于 2018-8-25 10:35
while(!flag)  /* PA0 定时器2 Channl 1 */
                {          
                        if(led1pwmval50) /* 膝舵机前伸 */

好,有了这个代码后,我们分配四个任务,任务1,2,3,4。将这个四个任务的优先级设置相同。

其中任务1仅配置电机1,任务2仅配置电机2,依次类推。

然后看你的楼主位的执行情况,电机1只有两种情况。那么我们就可以通过事件标志组实现两个命令,命令1的时候实现电机1正传10秒,命令2的时候实现电机1反转10秒,其他任务一样。

你把这个的代码写出来,我看下。
回复

使用道具 举报

10

主题

39

回帖

69

积分

初级会员

积分
69
 楼主| 发表于 2018-8-26 18:20:44 | 显示全部楼层
eric2013 发表于 2018-8-26 01:13
好,有了这个代码后,我们分配四个任务,任务1,2,3,4。将这个四个任务的优先级设置相同。

其中任务1 ...

感谢坛主这么上心的帮助,我采用另一种办法解决了,让任务12先启动,隔段时间再启动任务34,然后机器人的左右腿就能交替进行了。
还有个问题就是 控制板重新上电,舵机会从断电前的位置迅速回到任务要求的位置,有没有什么办法让控制板上电后,舵机继续从上次停止的位置继续转动呢?我的想法是采用EEPROM记住断电前的pwm值,重新上电后再取这个值,不知道坛主你有什么想法?
回复

使用道具 举报

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2018-9-28 13:06:59 | 显示全部楼层
电机驱动就是IO翻转吧,有时候IO翻转很快也可以用RTX吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 23:15 , Processed in 0.358667 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表