Diego 1 4WD 2 馬達控制

2021-09-25 22:15:20 字數 3784 閱讀 7075

針對馬達控制我們主要需要修改兩部分:

驅動部分,使其可以支援同時控制4個馬達

pid調速部分,試驗表明,雖然是一樣的型號的馬達,但是給相同的pwm值,馬達的轉速也不一樣,所以我們需要分別對4個馬達進行pid調速

1.馬達驅動

1.1. duall298pmotorshield4wd.**件的修改

增加了4個馬達對應的pwm和方向控制的pin引腳定義,和4個馬達速度的設定函式

#ifndef duall298pmotorshield4wd_h

#define duall298pmotorshield4wd_h

#include

class duall298pmotorshield4wd

;#endif

1.2. duall298pmotorshield4wd.cpp檔案的修改

主要是針對4個馬達速度設定函式的實現,邏輯都是一樣的,這裡只擷取乙個馬達的**,**的邏輯請看**注釋

// set speed for motor 4, speed is a number betwenn -400 and 400

void duall298pmotorshield4wd::setm4speed(int speed)

if (speed > 255) // 限定最大速度為255

speed = 255;

if (reverse) //反轉狀態下

else //正向轉動狀態下

}

在setspeeds函式中分別呼叫4個馬達的速度設定函式。

// set speed for motor 1, 2, 3, 4

void duall298pmotorshield4wd::setspeeds(int m1speed, int m2speed, int m3speed, int m4speed)

duall298pmotorshield4wd.h和duall298pmotorshield4wd.cpp修改完成後,在arduino 的library目錄下新建乙個名為dual-l298p-motor-shield-master-4wd的目錄,將兩個檔案放到此資料夾下

現在我們開啟android ide的library就可以看到我們剛才新增的庫

1.1.3 motor_driver.h的修改

增加4驅馬達控制的函式setmotorspeeds,引數為4個馬達的速度

void initmotorcontroller();

void setmotorspeed(int i, int spd);

#ifdef l298p

void setmotorspeeds(int leftspeed, int rightspeed);

#endif

#ifdef l298p_4wd

void setmotorspeeds(int leftspeed_1, int leftspeed_2, int rightspeed_1, int rightspeed_2);

#endif

1.1.4 motor_driver.ino的修改

#ifdef l298p_4wd

// a convenience function for setting both motor speeds

void setmotorspeeds(int leftspeed_1, int leftspeed_2, int rightspeed_1, int rightspeed_2)

#endif

#else

#error a motor driver must be selected!

#endif

2.pid控制

pid控制都在diff_controller.**件中定義修改

新增兩個在4驅模式下的pid控制變數

#ifdef l298p_4wd

setpointinfo leftpid_h, rightpid_h;

#endif

新增兩個在4驅模式下的pid控制引數

#ifdef l298p_4wd

int left_h_kp=kp;

int left_h_kd=kd;

int left_h_ki=ki;

int left_h_ko=ko;

int right_h_kp=kp;

int right_h_kd=kd;

int right_h_ki=ki;

int right_h_ko=ko;

#endif

新增兩個在4驅模式下的pid控制函式

#ifdef l298p_4wd

/* pid routine to compute the next motor commands */

void dorightpid_h(setpointinfo * p)

#endif

...#ifdef l298p_4wd

/* pid routine to compute the next motor commands */

void doleftpid_h(setpointinfo * p)

#endif

修改readpidin函式,增加在4驅模式下,pidin的讀取

long readpidin(int i) else if (i == right)

#ifdef l298p_4wd

else if (i== right_h)else

#endif

return pidin;

}

修改readpidout函式,增加在4驅模式下,pidout的讀取

long readpidout(int i) else if (i == right)

#ifdef l298p_4wd

else if (i == right_h)else

#endif

return pidout;

}

修改updatepid函式,增加在4驅模式下馬達pid控制的呼叫

void updatepid() 

/* compute pid update for each motor */

dorightpid(&rightpid);

doleftpid(&leftpid);

#ifdef l298p_4wd

dorightpid_h(&rightpid_h);

doleftpid_h(&leftpid_h);

#endif

/* set the motor speeds accordingly */

#ifdef l298p

setmotorspeeds(leftpid.output, rightpid.output);

#endif

#ifdef l298p_4wd

setmotorspeeds(leftpid.output,leftpid_h.output, rightpid.output,rightpid_h.output);

#endif

}

ROS機械人Diego 1 製作總結

1.底盤 diego1 所使用的底盤,總的來說滿足一般機器小車的要求,但也有些不足之處 a.動力不足 最大速度只能在0.2m s,這個是pid輸出已經是最大值255了。b.穩定性不足 因為需要使用pid對兩個電機進行調速,但即使這次調好了,可以走直線,關掉電源,重新開啟,可能就又走不了直線了。c.通...

現代笑話14

爸爸是球 王老先生70大壽,兒女都來祝賀。在席上王老先生致辭 爸爸好像乙個球,當他的使用價值最高時,兒女們你爭我奪,此時是籃球 退休以後,兒女們你推過來,我推過去,此時是排球 到年高體衰時,行動不 便時,兒女們我一腳,你一腳,踢來踢去,此時是足球。這時,他的兒女們忙說 爸爸,您是橄欖球,我們就是摔得...

14 安全加固

一.賬號安全 1.賬號鎖定 passwd l scu passwd u scu 本質 在 etc shadow密碼列前增加 口令策略 vi etc login.defs pass max days 90 密碼最長使用天數 pass min days 0 pass warn age 7 密碼到期提前預...