From 55786270abc76a8661af92a2501690ce4d3de92e Mon Sep 17 00:00:00 2001 From: Andy Lindsay Date: Wed, 4 Oct 2017 12:28:31 -0700 Subject: [PATCH] demo branch updates 1.4.1 and 1.4.1.3 1.4.1 Fix enable warning enable function was commented in servo360.h and causing compiler warnings when called. 1.4.3 servo360 - Disable serial monitor I forgot to comment the #define for this setting. It more than doubles the amount of space the library takes. --- .../Motor/libservo360/cmm/libservo360.a | Bin 52878 -> 45818 bytes .../Motor/libservo360/servo360.c | 6 ++++++ .../Motor/libservo360/servo360.h | 11 +++++++++-- .../Motor/libservo360/servo360_connect.c | 1 + .../libabdrive360/cmm/libabdrive360.a | Bin 18260 -> 17690 bytes version.txt | 2 +- 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Learn/Simple Libraries/Motor/libservo360/cmm/libservo360.a b/Learn/Simple Libraries/Motor/libservo360/cmm/libservo360.a index ab5cf292c23498fbb75e4511c28f6b2df81744fe..cff7fa29cde573371bc3d1c41a80b0f86cee1119 100644 GIT binary patch delta 5834 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 DAX8qn delta 12861 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 VPxs}18sf4u|7d%e`JO=Ge*?4U(m? 500) compensate = 500; // Limits pulse deviation to 50 us @@ -131,6 +133,8 @@ void servo360_mainLoop() { int compensate = _fs[p].lag - _fs[_fs[p].couple].lag; compensate = _fs[p].coupleScale * compensate / S360_SCALE_DEN_COUPLE; + //if(_fs[p].accelerating || _fs[_fs[p].couple].accelerating) + // compensate *= 4; if(compensate > 500) compensate = 500; if(_fs[_fs[p].couple].speedOut > 0) _fs[_fs[p].couple].speedOut -= compensate; @@ -598,6 +602,7 @@ void servo360_speedControl(int p) { if( abs(speedDifference) > _fs[p].rampStep) { + _fs[p].accelerating = 1; if(speedDifference > 0) { _fs[p].speedTarget += _fs[p].rampStep; @@ -609,6 +614,7 @@ void servo360_speedControl(int p) } else { + _fs[p].accelerating = 0; _fs[p].speedTarget = _fs[p].speedReq; //speedUpdateFlag = 0; } diff --git a/Learn/Simple Libraries/Motor/libservo360/servo360.h b/Learn/Simple Libraries/Motor/libservo360/servo360.h index b89e4e07..c7db9568 100644 --- a/Learn/Simple Libraries/Motor/libservo360/servo360.h +++ b/Learn/Simple Libraries/Motor/libservo360/servo360.h @@ -10,7 +10,13 @@ */ -#define _servo360_monitor_ + + + +//#define _servo360_monitor_ + + + #ifndef SERVO360_H @@ -162,7 +168,7 @@ int servo360_couple(int pinA, int pinB); int servo360_setCoupleScale(int pinA, int pinB, int scale); -// int servo360_enable(int pin, int state); +int servo360_enable(int pin, int state); /* Private */ void servo360_run(void); @@ -290,6 +296,7 @@ typedef volatile struct servo360_s volatile int drive; volatile int stepDir; volatile int lag; + volatile int accelerating; // position control system volatile int Kp; diff --git a/Learn/Simple Libraries/Motor/libservo360/servo360_connect.c b/Learn/Simple Libraries/Motor/libservo360/servo360_connect.c index 2f70f506..eda4d5b3 100644 --- a/Learn/Simple Libraries/Motor/libservo360/servo360_connect.c +++ b/Learn/Simple Libraries/Motor/libservo360/servo360_connect.c @@ -93,6 +93,7 @@ int servo360_connect(int pinControl, int pinFeedback) _fs[p].couple = 0; _fs[p].coupleScale = 0; + _fs[p].accelerating = 0; _fs[p].feedback = 1; diff --git a/Learn/Simple Libraries/Robotics/ActivityBot360/libabdrive360/cmm/libabdrive360.a b/Learn/Simple Libraries/Robotics/ActivityBot360/libabdrive360/cmm/libabdrive360.a index 07f32bba39ce45ec00c8f924ab0d1b89026448ae..0ca2b0e8affea532873cd821cfd0d7daa64ee2a6 100644 GIT binary patch delta 1465 zcmb7EU1(cn7=FK`Cv~l+ZIb4v&6=c1|7&~FBwb?qYqL`4Dq$-_p=F6}R?B9RHpfyS zpweAT!8Pl1GelTxZv;oF9xuG`LZK)MgB1rB9MVA%FLp8SRA%uzCpm2yL-4>keBXDz z=Y5{vs3{1l3iyJ5fPIPNFi)|9dO#M8+ke znmwZ0IFbDxQT;WdhCU+C8jUa>F0h|6*pcjRzR@o=4F~e1XD8^v4G~%HlugfxQ zS{jAwGNPP(qkNe$T4e$G)f0nEzE$zsVVr|Xn@$X3rRofl&&upR*y$FCmONX7zs4&_ zI-*%TcuvNU$%@;fX529jz+5$@>EL+g$MvcMw*M4p8t-{zI8A9rSTU7AAskfNnaDZ+ zVGo}ITI77w2-n7y1Yxr_p@Pp~%4#mMhVV+%jtX--CYv4DvHpx_EUma}(?l1z=(HMS z*B(dMp|F4EIAk~0+3;ai2jX>KvIKTcZm_I+Rv(8&u~WZ{8D|t3R~^1}9y0zHD57w! zy4<`}BAhDi>e6&_ci{JSK#bjGd;F*yC0nzqLdBa{qoVHRz)P!Mi=gHf56W!%-msFB zHcWcA*)@248;}}&LX5*kxTQd$X#~GCMUEjN!7x^=FJjzm#B%cwYy#sg8|)kPWLq5f ziE2o`HLFxBYTMpdU3K8=w#j2rcsDD&a-!YIgdyIw27GRD312ZH#sduFw+<7Goz`QJ zNKi>-8?JQzE}Yd9C2*tKi~RHX68Wc`d>x*ypHSAl&d0nE9N6yGSl3++42XZTM@RN3 z`RJd;8$EHQfw0$eNwsLIMEZxxR^|`)hSl1C6xe5mk9qBH6>I--D1Rc$)t0N;=gaGb z3El!@@_O$wlY`+gCSQ$gvr;6^&5Ax3qPwbs78LrlGFswdmsHop(IM>iSL4tACERba zqc9LV(!xUUH+R4}xWzhgXK;hpl+roX99^fP9}iW-Ib6rj5FPd$;dG%>yl>i7p!fu^ yfhRfVdh$Zh=Ed8L@coDuE;($|hy6Vm6#r8DuvBN<$a(uL#L+mvOC+2PjQtBv`llEG delta 2183 zcmb7_O-vg{6vt;48&e=;P5c4akR^7(alov>7`xDbgAbr8kz1l1P!phLp(w?+V1r17 z0;oBVep0%5}u1QHgKb5>Zt9oJ8 z=2$#%J1wV&G)aK$R)(_=>Tk`AO=k|o8Bsh#vSje8afWo6 zLTzpEi1WZESCQZ5;@C|42y$MhDcBVjA=BW?XG~d)Z-cdTom;~2d*z8zfmHA+hV1Ey zeB9#3{46HzM5?Qp75(`vKUy}6Eov=L{>K-Fb=;CjdjxX+lh9M$2%l8s@h(`8t>Xs} zb9&6zIfSO+>$)V&A4%|&45?vZt=R#;9(h$GL!jys6Pymza2@T8Tfl!Cm@;MVctj|( z3Vh1Q^;uJ9sun)AUMvz}*?x-1EWmAt4>FYtI*|($*k?=db4J*zZH~b#b{!0dA?x?U zJ^K!4D}g6xnqcomjhH3JRwe%6OdOWyuF>SZS5qW9OTwLDdSbEmp?RJlY9QzEz=nGP z#ywthhD*=Z2!y(R86A-mH!jkOV3^v=V7a!=c7jW)A}fb zr(7<0xuFQJ#cJiN&TP`EH^b_2Ed@*aDR^#`o(ftTmV<+kZM5lBcZn)`ukkyag-0jW z@hWYo^8`Dn6`$`nY8AZwrD~hPVz3!jytYz001?Op93|1P3cY8qg@3$1o8K%!Xq4o5 z4R2ET27%v&T+>gmVKG(e2LKwmTKJ&(21|s~cSX+)g*%kG zjKQ$Kx}97cm?t*d1seK#chfon($4l^4$WuB_l6VfoQp<&WptA+@1IEQN93ChxmR#5OxX2}1 z)pFgBZgFMmh~0ll>#r4}_Zrn(74L(;x_N%ysF`e4aP=ga=Ea~3ZuP`9{*xXj7g71Q zdLNkk2(FTjTdHpXXJ|VJ#3#@YeHN24bM!|(bf}J)zCE-rjk>oFeZQc!w^1LLWJ_6? zO5FH!;(BS^9S_ep7-GRkq!rg