miaoichi 發表於 2012-1-8 17:29:45

Roboard 的 PWM 好像會干擾?

以下範例程式是輸入要執行的pin,channel, period, duty 來控制某一個pwm
但是一執行,很多其他的pwn好像也都會有信號送到其他馬達,
請問是哪裡有問題?是軟體還是硬體?




int main(int argc, char **argv)
{
int i;
roboio_SetRBVer(RB_100;
for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++) //只初始 1~4 , 11~24的pwm
if(i<RCSERVO_PINS5 || i>RCSERVO_PINS10)
    rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB); // select the servo model as non-feedback servo
if (rcservo_Init(RCSERVO_USEPINS1TO24) == false) // set PWM/GPIO pin 1~4 , 11~24 as Servo mode
{
printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
return -1;
}

rcservo_EnterPWMMode(); // make all servo-mode pins go into PWM mode
printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
rcservo_SendCPWM((atoi(argv) - 1),atol(argv),atol(argv));
printf("Press ENTER to stop.\n"); getchar();
rcservo_StopPWM(channel);
rcservo_Close(); // close RC Servo lib
}

mzw2008 發表於 2012-1-8 23:28:17

咦?! 是說給這三個參數去控制某馬達
結果其他的也一起動?
上面的程式看起來不會耶

那些被干擾的馬達也動到一樣的位置?!

mzw2008 發表於 2012-1-8 23:30:37

rcservo_StopPWM(channel);
channel 這個變恕宣告在哪裡? 怎麼沒看到呢?

miaoichi 發表於 2012-1-10 21:57:32

本帖最後由 miaoichi 於 2012-1-10 21:59 編輯

感謝m大幫忙,我把程式重貼了,請幫我再看一下。謝謝



int main(int argc, char **argv)
{
    roboio_SetRBVer(RB_100);// first set the correct RoBoard version
    if(InitServo())
       return -1;
    if(argc == 4)
   {
       BodyServoDrive((atoi(argv) - 1),atol(argv),atol(argv));
       return 0;
    }
    else if(argc == 3)
   {
      rcservo_OutPin((atoi(argv) -1), atoi(argv));
    }
    else
   {
      printf("input example-- %s channel period duty \n",argv);
      printf("channel : from 1 to 19 \n");
      printf("period 10ms => 10000\n");
      printf("duty 1500us => 1500\n");
    }

    return -1;
}



int InitServo(void)
{
   int i;
   for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
   if(i<5 || i>10)
         rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);   // select the servo model as non-feedback servo
   if (rcservo_Init(RCSERVO_USEPINS1TO24) == false)// set PWM/GPIOas Servo mode
    {
      printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
      return -1;
    }
    return 0;
}

void BodyServoDrive(int channel, long period, long duty)
{
    rcservo_EnterPWMMode();// make all servo-mode pins go into PWM mode
    printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
    rcservo_SendCPWM(channel, period, duty);
    printf("Press ENTER to stop.\n"); getchar();
    rcservo_StopPWM(channel);
    rcservo_Close();// close RC Servo lib
}





miaoichi 發表於 2012-1-10 22:02:59

有用到的pwm 共18個
PWM1 -> Servo
PWM2 -> Servo
PWM3-> Servo
PWM4-> Servo
PWM11-> Servo
PWM12-> Servo
PWM13-> Servo
PWM14-> Servo
PWM15-> Servo
PWM16-> Servo
PWM17-> Servo
PWM18-> Servo
PWM19-> Servo
PWM20-> Servo
PWM21-> Servo
PWM22-> Servo
PWM23-> Servo
PWM24-> Servo

roboardgod 發表於 2012-1-12 11:53:02

請教下...
rcservo_Init(RCSERVO_USEPINS1TO24)
裡面的RCSERVO_USEPINS1 TO 24 這個您是從哪找到的??
因為我沒看過這東西...

然後你的問題[很多其他的pwm好像也都會有信號送到其他馬達]
是怎樣的情況?

*已測試過兩顆RS-0263馬達未出現你說的情況...

mzw2008 發表於 2012-1-12 14:15:10

哈哈
RB魔人出現了
而且有很壯觀的新辦公室耶XD

roboardgod 發表於 2012-1-12 16:24:59

本帖最後由 roboardgod 於 2012-1-12 16:34 編輯

哈哈
RB魔人出現了
而且有很壯觀的新辦公室耶XD
mzw2008 發表於 2012-1-12 14:15 http://www.robofun.net/forum/images/common/back.gif

既然已經被鯨魚大大注意到了, 本魔就順便自介一下吧!
自介:
稱號: RoBoard魔人(還是隻嫩魔而已啦)等級: RoBoard初學者, 機器人菜鳥職業: DMP象牙塔小書僮目標: 成為RoBoard神人夢想: 用RoBoard控制BigDog
本魔受 DMP 象牙塔上焚書坑儒的萬惡罪魁──藏鏡人指示, 專門來此地服務 lu 大, 幫忙解答關於 RoBoard 的技術問題!
本魔目前大二,剛開始進入RoBoard與機器人的領域學習, 知識層面或許有很多不足的地方, 不足之處未來還請版上諸位大大不吝指導!
lu 大, 我來拜碼頭啦! 以後本魔萬一在版上搞出笑話, 還要請您多罩一下囉!{:3_106:}

roboardgod 發表於 2012-1-12 16:27:21

順便預告: 等 lu 大進駐新總部, 我會代替大家採訪 lu 大的高級專屬辦公室喔!
敬請期待~~{:3_95:}

lakers3411 發表於 2012-1-12 17:37:56

用rb控制bigdog好像不太好喔
黑道大哥會不爽

(小聲)他都很常來偷看喔,快改成控制老戴一號吧~

miaoichi 發表於 2012-1-12 23:16:55

本帖最後由 miaoichi 於 2012-1-12 23:21 編輯

請教下...
rcservo_Init(RCSERVO_USEPINS1TO24)
裡面的RCSERVO_USEPINS1 TO 24 這個您是從哪找到的??
因 ...
roboardgod 發表於 2012-1-12 11:53 http://www.robofun.net/forum/images/common/back.gif

歹勢,這是我寫的但是我忘了貼上去。

    #define RCSERVO_USEPINS1TO24 (RCSERVO_USEPINS1+RCSERVO_USEPINS2+RCSERVO_USEPINS3+RCSERVO_USEPINS4+RCSERVO_USEPINS5+RCSERVO_USEPINS6+RCSERVO_USEPINS7+RCSERVO_USEPINS8+RCSERVO_USEPINS9\
+RCSERVO_USEPINS10+RCSERVO_USEPINS11+RCSERVO_USEPINS12\
+RCSERVO_USEPINS13+RCSERVO_USEPINS14+RCSERVO_USEPINS15+RCSERVO_USEPINS16\
+RCSERVO_USEPINS17+RCSERVO_USEPINS18+RCSERVO_USEPINS19+RCSERVO_USEPINS20\
+RCSERVO_USEPINS21+RCSERVO_USEPINS22+RCSERVO_USEPINS23+RCSERVO_USEPINS24)



我的問題是我把18個馬達都接上去,然後用我自己寫的程式去一個一個下command控制,
例如: sudo ./hexapod.exe 110000   1500
                ./hexapod.exe channel   period    duty

但是一執行下去,其他的馬達也會跟著亂動。

mzw2008 發表於 2012-1-13 00:02:08

原來是這樣寫...
其實那些常數剛好都是2的整數次方, 直接用迴圈跑次方相加也是可以

剛剛心血來潮亂接了20顆(11顆MG995/祥儀的兩顆/7顆RS1270, 供三種不同電壓)
然後亂數送資料他也不會亂動耶
你是馬達都直接接RB?
還是像我一樣用共地另接電源

通通直接接RB100會有電力不穩的情況 , 馬達啟動時板子會不穩, 110因為SERVO獨立供電不會這樣
你的是100要單獨供喔

mzw2008 發表於 2012-1-13 00:03:14

既然已經被鯨魚大大注意到了, 本魔就順便自介一下吧!
自介:
稱號: RoBoard魔人(還是隻嫩魔而已啦)等級 ...
roboardgod 發表於 2012-1-12 16:24 http://www.robofun.net/forum/images/common/back.gif

哈哈
這種介紹好像在玩角色扮演遊戲
出場值設定嗎?

lucrece_lu 發表於 2012-1-13 09:36:32

哇魔人駕到..... 請受小弟一拜

roboardgod 發表於 2012-1-13 09:57:49

本帖最後由 roboardgod 於 2012-1-13 09:58 編輯

m大
你先確定下你RB背面的PULL-UP/DOWN開關 有切到PULL-DOWN位置
請再進一步確認BIOS裡面 Chipset > SouthBridge Configuration > Multi-Function Port Configuration選單的Port0~2的每個Bit都有切成OUT 0


如果沒有這樣設定的話 馬達在呼叫rcservo_Init()的時候 PWM腳位可能會從1變成0導致馬達誤認為收到pulse亂動歐{:3_95:}

roboardgod 發表於 2012-1-13 10:43:53

本帖最後由 roboardgod 於 2012-1-13 12:34 編輯

程式有些小問題

M大的codeint main(int argc, char **argv){
    roboio_SetRBVer(RB_100);// first set the correct RoBoard version
    if(InitServo())
       return -1;
    if(argc == 4)   {
       BodyServoDrive((atoi(argv) - 1),atol(argv),atol(argv));
       return 0;
    }    else if(argc == 3)   {
      rcservo_OutPin((atoi(argv) -1), atoi(argv));//你在前面InitServo()這個function就已經把所有PWM切成Servo-Mode PIN了所以這個 GPIO-Mode PIN function :rcservo_OutPin() 在這使用會沒有效果喔~
    }    else   {
      printf("input example-- %s channel period duty \n",argv);
      printf("channel : from 1 to 19 \n");
      printf("period 10ms => 10000\n");
      printf("duty 1500us => 1500\n");
    }
    return -1;
}


int InitServo(void){
   int i;
   for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
   if(i<5 || i>10)//RCSERVO_PINS5其實不等於5喔~RCSERVO_PINS10也不等於10!   這邊建議改成 if(i<RCSERVO_PINS5 || i>RCSERVO_PINS10 ) 喔   ^^
         rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);   // select the servo model as non-feedback servo
   if (rcservo_Init(RCSERVO_USEPINS1TO24) == false)// set PWM/GPIOas Servo mode
    {
      printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
      return -1;
    }
    return 0;
}
void BodyServoDrive(int channel, long period, long duty){
    rcservo_EnterPWMMode();// make all servo-mode pins go into PWM mode
    printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
    rcservo_SendCPWM(channel, period, duty);
    printf("Press ENTER to stop.\n");
    getchar();
    rcservo_StopPWM(channel);
    rcservo_Close();// close RC Servo lib//rcservo_Close()最好要放在程式結束的地方
}   




魔人修過的code
//程式使用PIN S1~S4 及 S11~S24為Servo-Mode PIN
#define USEDPINS(RCSERVO_USEPINS1+RCSERVO_USEPINS2+RCSERVO_USEPINS3+RCSERVO_USEPINS4+RCSERVO_USEPINS11+RCSERVO_USEPINS12+RCSERVO_USEPINS13+RCSERVO_USEPINS14+RCSERVO_USEPINS15+RCSERVO_USEPINS16+RCSERVO_USEPINS17+RCSERVO_USEPINS18+RCSERVO_USEPINS19+RCSERVO_USEPINS20+RCSERVO_USEPINS21+RCSERVO_USEPINS22+RCSERVO_USEPINS23+RCSERVO_USEPINS24)

int InitServo(void);
void BodyServoDrive(int channel, long period, long duty);
int main(int argc, char **argv)
{
    roboio_SetRBVer(RB_100);// first set the correct RoBoard version
    if(InitServo())
       return -1;
    if(argc == 4)
   {
       BodyServoDrive((atoi(argv) - 1),atol(argv),atol(argv));
    }
    else if(argc == 3)
   {
      if((atoi(argv) -1) >=RCSERVO_PINS5 && (atoi(argv) -1) <=RCSERVO_PINS10 )
             rcservo_OutPin((atoi(argv) -1), atoi(argv));
      }else
   {
      printf("input example-- %s channel period duty \n",argv);
      printf("channel : from 1 to 19 \n");
      printf("period 10ms => 10000\n");
      printf("duty 1500us => 1500\n");
    }
    rcservo_Close();
    return -1;
}

int InitServo(void)
{
   int i;
   for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
          if(i< RCSERVO_PINS5 || i> RCSERVO_PINS10 )
                rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);   // select the servo model as non-feedback servo
   if (rcservo_Init(USEDPINS) == false)// set PWM/GPIOas Servo mode
    {
      printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
      return -1;
    }
    return 0;
}

void BodyServoDrive(int channel, long period, long duty)
{
    rcservo_EnterPWMMode();// make all servo-mode pins go into PWM mode
    printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
    rcservo_SendCPWM(channel, period, duty);
    printf("Press ENTER to stop.\n"); getchar();
    rcservo_StopPWM(channel);
}

試過基本上是沒問題
有問題在提出來吧^^~

roboardgod 發表於 2012-1-13 12:21:27

哇魔人駕到..... 請受小弟一拜
lucrece_lu 發表於 2012-1-13 09:36 http://www.robofun.net/forum/images/common/back.gif


   不不不~ lu大駕到.....請受小魔一拜

miaoichi 發表於 2012-1-13 22:31:59

回復 12# mzw2008


   我是RB-100,所以我要分開供電?(主板一個電源,全部馬達一個電源,接地共接這樣嗎?)
如果是,我想應該是這個問題。那我再修改一下電路再來試試。

謝謝

miaoichi 發表於 2012-1-13 22:33:11

程式有些小問題

M大的code




魔人修過的code
試過基本上是沒問題
有問題在提出來吧^^~
roboardgod 發表於 2012-1-13 10:43 http://www.robofun.net/forum/images/common/back.gif

感謝魔人大的指正,小的馬上再來試試。等結果上po上來吧
謝謝

mzw2008 發表於 2012-1-13 23:47:50

回復mzw2008
   我是RB-100,所以我要分開供電?(主板一個電源,全部馬達一個電源,接地共接這樣嗎? ...
miaoichi 發表於 2012-1-13 22:31 http://www.robofun.net/forum/images/common/back.gif
因為我之前常有這種問題
而且因為接多種不同電壓的馬達
這樣做也可以徹底搞定
畢竟RB-100 要驅動馬達太容易了
理論上應該是隨便作都會動啊
頁: [1] 2
查看完整版本: Roboard 的 PWM 好像會干擾?