From bf27cb673e8fb48d9466120fb6cfcdfb8f44dc47 Mon Sep 17 00:00:00 2001 From: Benjamin Vedder Date: Wed, 28 Feb 2018 10:22:25 +0100 Subject: [PATCH] Removed software servo driver, fixed hw servo driver to work with all hardwares --- CHANGELOG | 4 + Makefile | 1 - build_all/410_o_411_o_412/VESC_0005ohm.bin | Bin 199708 -> 199708 bytes build_all/410_o_411_o_412/VESC_default.bin | Bin 199708 -> 199708 bytes .../VESC_default_no_hw_limits.bin | Bin 199468 -> 199468 bytes build_all/410_o_411_o_412/VESC_ws2811.bin | Bin 200508 -> 200508 bytes build_all/46_o_47/VESC_0005ohm.bin | Bin 199868 -> 199868 bytes build_all/46_o_47/VESC_33k.bin | Bin 199836 -> 199836 bytes build_all/46_o_47/VESC_default.bin | Bin 199868 -> 199868 bytes build_all/46_o_47/VESC_ws2811.bin | Bin 200652 -> 200652 bytes build_all/46_o_47/VESC_ws2811_33k.bin | Bin 200604 -> 200604 bytes build_all/48/VESC_0005ohm.bin | Bin 199756 -> 199756 bytes build_all/48/VESC_default.bin | Bin 199756 -> 199756 bytes build_all/48/VESC_ws2811.bin | Bin 200540 -> 200540 bytes build_all/60/VESC_default.bin | Bin 202860 -> 202860 bytes build_all/60/VESC_default_no_hw_limits.bin | Bin 202604 -> 202604 bytes build_all/60/VESC_servoout.bin | Bin 199884 -> 199884 bytes build_all/60/VESC_ws2811.bin | Bin 203660 -> 203660 bytes build_all/DAS_RS/VESC_default.bin | Bin 200572 -> 200572 bytes commands.c | 5 - conf_general.h | 1 - hwconf/hw.h | 1 - hwconf/hw_40.c | 17 - hwconf/hw_40.h | 4 +- hwconf/hw_410.c | 17 - hwconf/hw_410.h | 2 + hwconf/hw_45.c | 17 - hwconf/hw_45.h | 2 + hwconf/hw_46.c | 17 - hwconf/hw_46.h | 2 + hwconf/hw_48.c | 17 - hwconf/hw_48.h | 2 + hwconf/hw_49.c | 17 - hwconf/hw_49.h | 2 + hwconf/hw_60.c | 17 - hwconf/hw_60.h | 2 + hwconf/hw_das_rs.c | 17 - hwconf/hw_das_rs.h | 2 + hwconf/hw_palta.c | 17 - hwconf/hw_palta.h | 2 + hwconf/hw_r2.c | 17 - hwconf/hw_r2.h | 2 + hwconf/hw_rh.c | 17 - hwconf/hw_rh.h | 2 + hwconf/hw_tp.c | 17 - hwconf/hw_tp.h | 2 + hwconf/hw_victor_r1a.c | 17 - hwconf/hw_victor_r1a.h | 4 +- irq_handlers.c | 10 - main.c | 6 - pi_stm32.cfg | 17 + servo.c | 525 ------------------ servo.h | 267 --------- servo_simple.c | 29 +- 54 files changed, 69 insertions(+), 1048 deletions(-) create mode 100644 pi_stm32.cfg delete mode 100644 servo.c delete mode 100644 servo.h diff --git a/CHANGELOG b/CHANGELOG index 8cdfe248c..09d003ace 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +=== FW 3.35 === +* Added option to disable nRF transmission (option in Transmit Power parameter). +* Fixed servo output driver for all hardwares and removed software servo driver. + === FW 3.34 === * Added motor PID position to COMM_GET_VALUES. * Inverted direction angle normalization in mc_interface. diff --git a/Makefile b/Makefile index 016d10d28..f8b952622 100644 --- a/Makefile +++ b/Makefile @@ -133,7 +133,6 @@ CSRC = $(STARTUPSRC) \ mcpwm.c \ servo_dec.c \ utils.c \ - servo.c \ servo_simple.c \ packet.c \ terminal.c \ diff --git a/build_all/410_o_411_o_412/VESC_0005ohm.bin b/build_all/410_o_411_o_412/VESC_0005ohm.bin index 120bceacfc72fcc144528f5ecb1ae9819f73d6ac..2906db5b32dc5446734a043209e68f2b34c0f453 100755 GIT binary patch delta 767 zcmX|;e@IhN6vywqlR4iewM^O+Wot;$7%oD=Qe0Lx?T3FvAy_!UaLxXTpjbbAqk>Q{ z$kny9CiRE)qOpZx{(xrDR5B{)pOT#Y(H;f&vDNJDm#%kbdEs&{=X}mN-+RtrziO~w z#a@LYs9j$5rYU%E;#9C9*ytuQ<`cMO4gn~0+4PTMtKfo)0LnFv@zWUAXk zrZ~yol`Os|M{V#i&d5;>JdbN~(TO|_)W8_&P$ebQ>+<6oqk+4n6teZdv_H7YZrYQoL zlsK6VkviO?Kw4vxeJ%vLqr&>6<#&wzOiH*8f#W=6w=*K}&X_Rm%*LXB*h>6ffr`6k z*`%mhamUSOpI{l6ZZ|MmBE4*xpZe(A;{pS~SR0%5jz_^dOXQ4eNeFPXOqPhwv6S+= ze1b#L@+v(Nrh+9V+bZxYxF&}q3k-hSRq@{2-buT-wHXqRARe1d&jOuU8tN>ozd^Iqi5|C|(viI-?2gZfDdl%Yk& zR2yr2N*nCKttw>178S}Vo?ltyr7bRlvWT?9RjS!bsZvUn!`t|V3KedYg+l~!`}p(% P&;fcvKsP$6Lbl9b=A41M delta 785 zcmX|| zIk=YE#Qw-0Xiki93Jy^$qhHWJCN}@k7s0)}+17h*%k}PtUbvjgIiGvZ_ndnN`*nl; zI{qP?LN_uh7Md0tXKpUmE!KNT8uy)~bB6mtrToGC1q;#iJZpV4kz_RT&sB?uGEgfV#fc153Gd>{OmrkoCO^}P_+NSez_T3lD~WfeOV<2?j&u&;>nT$2R2 zm^>Q~lC!u+gYt_N{w)o3hv>nm?avm!LXHUSR1mzx=8~xB3ezQ5G8PK+W%!E*6}p%B zsGPUsQLNSpYV)hR8x-55C%oCmeC#~b1qMKIRrtfWKLifgq}yE)8W32TBoSKX8TF=X zf;v?#^YN)oCRk;Xr2<FUfQ18}@|k4~_5z4p>@XhsVIvN!*!*dW^S}RA0-n zAQ=@tDPS0y;XtdXdbQ0pQTYrm;?Q|_J#%m@93;I$iP&48=g>PIpG%(u#(aCBBgeii zH^*XfTU@ibD+h#Ps+^;OM1KoT`btO_S=}5Fnm`}R*4dCPhNx3WlM-CVv@hAx-`KAW zc85)}NrD`^TQ2%A;ZPY|$0jW@W>+O(8D}wkJzlddzs8res6u}@u_}6$602#N&8;f@ z84qYtehE&jkc;X|uotl<$M}9uq7ESiO^)9at+bY#ppFv~?I;M#ZoHvICjD3pn9(|C zsR}oau_DztUx!W>uI;RgQMuqBFss@8Dd6fj0}Ko(F74p9<$e{CsMBu|cRz|%#WKaADFS?K} diff --git a/build_all/410_o_411_o_412/VESC_default.bin b/build_all/410_o_411_o_412/VESC_default.bin index 7b0806a83003c8b871eaa9a685c3bcb949314766..d8e9e657c4f9a8665ed6b40249d79aed03226ee6 100755 GIT binary patch delta 767 zcmX|;e@IhN6vywqlR4iewM^O+Wot;$7%oD=Qe0Lx?T3FvAy_!UaLxXTpjbbAqk>Q{ z$kny9CiRE)qOpZx{(xrDR5B{)pOT#Y(H;f&vDNJDm#%kbdEs&{=X}mN-+RtrziO~w z#a@LYs9j$5rYU%E;#9C9*ytuQ<`cMO4gn~0+4PTMtKfo)0LnFv@zWUAXk zrZ~yol`Os|M{V#i&d5;>JdbN~(TO|_)W8_&P$ebQ>+<6oqk+4n6teZdv_H7YZrYQoL zlsK6VkviO?Kw4vxeJ%vLqr&>6<#&wzOiH*8f#W=6w=*K}&X_Rm%*LXB*h>6ffr`6k z*`%mhamUSOpI{l6ZZ|MmBE4*xpZe(A;{pS~SR0%5jz_^dOXQ4eNeFPXOqPhwv6S+= ze1b#L@+v(Nrh+9V+bZxYxF&}q3k-hSRq@{2-buT-wHXqRARe1d&jOuU8tN>ozd^Iqi5|C|(viI-?2gZfDdl%Yk& zR2yr2N*nCKttw>178S}Vo?ltyr7bRlvWT?9RjS!bsZvUn!`t|V3KedYg+l~!`}p(% P&;fcvKsP$6Lbl9b=A41M delta 785 zcmX|| zIk=YE#Qw-0Xiki93Jy^$qhHWJCN}@k7s0)}+17h*%k}PtUbvjgIiGvZ_ndnN`*nl; zI{qP?LN_uh7Md0tXKpUmE!KNT8uy)~bB6mtrToGC1q;#iJZpV4kz_RT&sB?uGEgfV#fc153Gd>{OmrkoCO^}P_+NSez_T3lD~WfeOV<2?j&u&;>nT$2R2 zm^>Q~lC!u+gYt_N{w)o3hv>nm?avm!LXHUSR1mzx=8~xB3ezQ5G8PK+W%!E*6}p%B zsGPUsQLNSpYV)hR8x-55C%oCmeC#~b1qMKIRrtfWKLifgq}yE)8W32TBoSKX8TF=X zf;v?#^YN)oCRk;Xr2<FUfQ18}@|k4~_5z4p>@XhsVIvN!*!*dW^S}RA0-n zAQ=@tDPS0y;XtdXdbQ0pQTYrm;?Q|_J#%m@93;I$iP&48=g>PIpG%(u#(aCBBgeii zH^*XfTU@ibD+h#Ps+^;OM1KoT`btO_S=}5Fnm`}R*4dCPhNx3WlM-CVv@hAx-`KAW zc85)}NrD`^TQ2%A;ZPY|$0jW@W>+O(8D}wkJzlddzs8res6u}@u_}6$602#N&8;f@ z84qYtehE&jkc;X|uotl<$M}9uq7ESiO^)9at+bY#ppFv~?I;M#ZoHvICjD3pn9(|C zsR}oau_DztUx!W>uI;RgQMuqBFss@8Dd6fj0}Ko(F74p9<$e{CsMBu|cRz|%#WKaADFS?K} diff --git a/build_all/410_o_411_o_412/VESC_default_no_hw_limits.bin b/build_all/410_o_411_o_412/VESC_default_no_hw_limits.bin index 69a8e45ae9301df2a643697621bbcb2b64aa62ee..84f567728801a22758d619332ebd5438d0bf9410 100755 GIT binary patch delta 755 zcmX|8Z%9*76udIq%z!F{~d*4sZ_@6PhV;aq;_ch32pbEe0Or^k!g zYw!sg$gh9X5k4}1HryI+^AZ*Fk>oMPD}18i>g!`xQaEy__j;hz8J8a=Lk^xS4Ex9e zr}(>y$20k;7e2rxYSaiX;-hNRQ>2G_*bTbD5PqyiRycsasZovgd2rsnk^siORv&R; zQvouWoQ_3tl8MWPjQvC^xIU5Nd}O~z5(Q68T=e8((LZb*<_l2y;1ZjX z_3Pe*%@z>tbBYZEi(MLJ%|VLMzi$Xk083MB$v+nbC3fljP+Sagv`mf>U1ljOI1~`w zik4TIClM-G;pAF{euXz>P_;f%=Gof5DF$CCL^>G2Hww{+>3d>hp0{b9+~?jWz$7%o ziBp1tYPwodas#d@LWc((6kuqWC!<`oFxsYf>0CFP^Iif|nX}wg>P*U=>9l+%qmKNS z0itO|MkObSKRLHJ#UTOi1h;eotO8@S+NE}l5Eb2=O3E_*v%%abv2^4I&7m9YkRU^I z>x3Xq7NJ_$iK`i8(l%ycEn_u)*xizpr*IF0>Me%sir`J`wN=g1eKp0F{kH`#(HeMi zP$|)G*e5!efauy2m$i6-K^3I||7F4U52S>c9LG@xRp}n4ff=nb)}~n73~g`#pVJ@< zKCVG|j9G-&%aRfH#qJ0xVj0wbW02gYa18syCW E1)qO;oB#j- delta 785 zcmX|AGh_4;+4n-|usNzwhsN&gfv? z=wKdyhns|5nKg6G^Jk{7&Ns|AdWZ&nBN@nWE2LE4o;_zF*?o`N?)nNHQF$UZQy(J1 zUM~p>s(q|lJeCRDxDi~Sg~z!rd{zrDfN%U~ic2-mw2&=a2>_Z+R4})kp0Cb@u|ZUAoVk{LIJBPkO)*Fxw&@#sgtcV3)4-L}^f9X;MUZk!RGa z9v^k7T4ocIYfP}pq)G+X=XPW;wO&%})-~-2*%f}q>z!PM-oYIJ4<>M5HtaL5De1lz z;~_F4d{)3PXX1w1MAe(yQnw+Wz{hgn>F!46Kr9?0{X)6e-&pL_Iq#jym;uHTN2#;W z5tCcuak)K_y|yg}gyX85{endQ2rl|u$PiiGLXj&211#H(rhG9>U4lkRqRuIQs-=JN z-@n)$Hpym*L+oy~=*OEmu!?KJl?WR1ZAq>QSqxtf)y3o&xDCM?-QMJ~=uyh8Wm9Z! zw#XO!62X%40%eJuS6_m?h&?sN_cIc83TbF!{HAE7^~gt^MN-vlN#TObWw9A|)m0p^NM6q6sSkVIVpi@5zcx}(YQ Y%(W1KLamti0SthxP};uzlnWin|Ja$3K>z>% diff --git a/build_all/410_o_411_o_412/VESC_ws2811.bin b/build_all/410_o_411_o_412/VESC_ws2811.bin index d2d0f63ee8ef14138c46ac35ed7672df3c5e514e..4c9f9666060d2d7d7867369361feb100bc81e80f 100755 GIT binary patch delta 767 zcmX|;e@IhN6vywqlc=}NZ7sAvchwCQi*n}pNGfX^C@8LtPcH!086bn6C6zfjXiPJyCg(7nkG*qXIV;xy&=IZ zYk84<8mEF~CSNMD7+sS=)dq;cv$1ha3~p8<9Sq@4HR>~M%dPe^or#hA+?x~_f@V0- z#>-x1%i**nVtpYx(&L~GhK6ILpR3^e8;V^z*VVd$31Bj`m%8-rX{j)skxpmV#sA9y z$&4&x3zrbSb8g`thj_RZ+|co`9QbIq?nWh_6x^I5@rUUe3Fli8Gx4wV51pVh0U7$Y ziVx$tLR1NF;&&QUWB|!wcKQkB)6!BFRx(!O+a0phHe91Y)t2|!dETGeWh)<{v#S+n zgSU7;QJ2KXK{;Jl$zH+1gap@4Q96e2YEYRz6uiLO{y8ZiN|m%wx$a>Gn9%}btrZ&{ z(*han)FKPEX;DF`FT23YTU-I=guKI5swGINkCdu_O}IykiZ&_YF@m^5{FfiV2;}ok Lw!@FK=z8uiwSj~e delta 785 zcmX|YZ-R?wRRea`Rq{r%3F=+{p4 zYxz5H1T}KyQ}xqz<5#Dvr)#`K!_AR2&Uh;lE4w{;(MtArKW(`i$acueYBE$6A>l3` z2@9%yrds@fLoIL+|KZSScmrEA(BJl{4Hs>A*A@m3mZem`f~(-dM4%Xq3&ZLjH`q z^(eo%erujIs4u}@#GV@C`;bJP!VWa-zbV>i6&Ik+V-j^2$jV9lRga1cLvdh6OPsYr zt{Y-Sws3kDI$roVu_SIPr?!Au%{I0JH2E3ujRBStH@BfQsE|ZmV^(qZb9Ah2`}ZwJ X2olbTKYjxvP}jG6vT>rqk>ZM zj~v}pX#QutXl!AaKcJa3l??hLf)bnmvDrAq4xqcs+ z<0LyGSzM<;UGN3=DNr4}iB}cqVu23oU`9^9xz7I+x4{|LN)i})ntjBH zgGyvHI_wL=7_%XcBxhV7lfe32y0W2X{3?;TeWcTU9bAT|t2H3lrls2t%(mDdYYI{yefvCM6qxH1OaAFN*kg-b^K1wqj+V(2@nx1$K~F$% zNm|}#C!$oa#N=CreusBtP_;gyckgT65rcOzNDBkFm_Y-^?&S7=7Bdm@ocojnW6%Ug zFY%IB)!vjAYwwM54e+P_uN2#;WkrFRtGGcdjcl5su z5YI?5%DI^Ei*pI%9OB^t@L0>k3NS>g-D*|walysOVmYRFDwzLDA`|^dbLa%yVvwP^ z)qD^?RG}*P6?@dENDtzZ?BZ+6r^LD(tYR#N&xe{);y5NMRAVm5t?=ID5o^U1on3um z+5eRH5=}{joRrG-mK+!COh9lRPKb~2IW;OP4ES&J)_+b4B*YuEQHAzp2AI$qW2sNH zyrK;naZZiQcukGur7K%&ytKtlV2VjQ+@{+7lq#oGC47P_HK=I6EE*w*JH=;z00W>W M0t}O#8sy0R1slbIJOBUy delta 785 zcmX|g-;<=DKG?4;+4n-|usNzwhsN&P1Za5=!a)sdFxD?CNdmi01g#cqa+zGF5i|l0oiRcea}(V#!sF(V*mz(;0k-Dq zFm6FHBedJERLznBc1`Y6#si-e;Qpa)UC#?)5$l3s+!(xoRyAy&%7rk)GChY0$JUF0 zRpp7z1U`kFSuo$JaBoSxQzCmeysInRJU+m;5S|ZXZ%`ycFiB>E>6nz{O3<||Xlj%IylGtCmIEYJlXH+4$sayIUh#T?*3A)^LeN9A-KjMT5()4+F~zoy#?meQRe%4Y zcjzSRMTVt!ONAJEoDEBu@92Ftw3|ICri69bz8vo3Be2^(_3Kj6@^jb(s~5enES;4E%s*X3s#B$B|GOW6J#ZELB> YuH^)Ve1)+26W9PwoG!0F_l#`#7QVfhD+4^5lMdpg8i5fIOl)iAF(3eC?OPt za&R-v3H?#M$hI&{Et*ABNg=3zO6m#a9t8LCR?ptsk6iC+dEs&{=X}mN-+Rv3h-qxZ z#9oI}=zC`M+qTGwx$a1Fq{UBk%tw;JSg-PG&9yft%ZPq(q_aPm>)KH2;^8Kq%nt;} zJg3<^n#Dy~s1rWKeOc%zyo6t7p|gg3m=8NZ2k_xiJt~8}_>>+U&VC-6^Q@}C+SME& zZhTXZii=%M3*rQ`p>XP)=bZ{1pS7zS9v8k4oi{+vcu(UG8n*Wj>nD(b!v{o`X_Ekx zR9>WbQiqKOWU(jMXJU9DChkf&f6448Qp9zM92X$Rypkw*WpTl~6^s35t8kkE74|K$ z3B|hUR~?R^=$zH=0I)lyA=Vb6KKc&$z$mcS%1e{8F_7bwF8VgaFh|R55wT^KQXyYZ z^k`aMr>3G*u*Ph)3jd7k$e?Ni#NyrEx+4a!8;}_Wv0^}j#l7nGe-@KGdBClxU;^6U z=y^f&8rvHaNfTduVR=eD46k?)>(@ANjXC}1u6*(DQr#WJTzP_5jHudPl3o@3YK5b8hR&{5 zUY@)y_(^sFPwKUDJq1U^CMGDl56Q}1Twy{*xxvXRg5#f)0a4l2ZFARSw5-PBzNhql@wcaScN1E3g83 Mcwn8b$wsd9U)jMU6UXv`eQ{tsVFpr zQn)OwN&TTba5*tTEgYg)Mp4v1CN=*^p9J^vX0!L^GuOKtdEs&{=X~xt-*fKm_Z$2D zM*a>QLqB(x&os_9OkSF;ovrI7Y1~(m&RK3nl(O5?CmlrB$0FsdfzL+`AyqtJx|5&B+VBfO};bui-zr0`CbA!*mHpLT%!ay zRerr0A;+*mk8-QSJK=OrFDhL7M@<~+m#ps+b8H>jFQrxIVdF^xj zhHTmDRh-Td>YC7YC$PJu2fQuBeC+(B1M~rVMeJR0A_{i9q$?fkG%T<*Ng_JWGwMah z2=!`OrZ>k{m|%@bmI|-UY|CJ310>sLuHP22EBcJj^}v!`H!J{;MzN|#UDoSLs;_x9 zLWYD73K)Pk*w-v-Uc=d{4Y>*ra;Un!jyX6Mj*xDlSnRIL_Lx2QE7PZdHOHOj$#lnM zx2no5o4S?%azIqovi~MX^^Yb{3AaxmCnI z;yfeDDGnqS$SLh5*o(N5V|+U$QIC*G6vT>rqk>ZM zj~v}pX#QutXl!AaKcJa3l??hLf)bnmvDrAq4xqcs+ z<0LyGSzM<;UGN3=DNr4}iB}cqVu23oU`9^9xz7I+x4{|LN)i})ntjBH zgGyvHI_wL=7_%XcBxhV7lfe32y0W2X{3?;TeWcTU9bAT|t2H3lrls2t%(mDdYYI{yefvCM6qxH1OaAFN*kg-b^K1wqj+V(2@nx1$K~F$% zNm|}#C!$oa#N=CreusBtP_;gyckgT65rcOzNDBkFm_Y-^?&S7=7Bdm@ocojnW6%Ug zFY%IB)!vjAYwwM54e+P_uN2#;WkrFRtGGcdjcl5su z5YI?5%DI^Ei*pI%9OB^t@L0>k3NS>g-D*|walysOVmYRFDwzLDA`|^dbLa%yVvwP^ z)qD^?RG}*P6?@dENDtzZ?BZ+6r^LD(tYR#N&xe{);y5NMRAVm5t?=ID5o^U1on3um z+5eRH5=}{joRrG-mK+!COh9lRPKb~2IW;OP4ES&J)_+b4B*YuEQHAzp2AI$qW2sNH zyrK;naZZiQcukGur7K%&ytKtlV2VjQ+@{+7lq#oGC47P_HK=I6EE*w*JH=;z00W>W M0t}O#8sy0R1slbIJOBUy delta 785 zcmX|g-;<=DKG?4;+4n-|usNzwhsN&P1Za5=!a)sdFxD?CNdmi01g#cqa+zGF5i|l0oiRcea}(V#!sF(V*mz(;0k-Dq zFm6FHBedJERLznBc1`Y6#si-e;Qpa)UC#?)5$l3s+!(xoRyAy&%7rk)GChY0$JUF0 zRpp7z1U`kFSuo$JaBoSxQzCmeysInRJU+m;5S|ZXZ%`ycFiB>E>6nz{O3<||Xlj%IylGtCmIEYJlXH+4$sayIUh#T?*3A)^LeN9A-KjMT5()4+F~zoy#?meQRe%4Y zcjzSRMTVt!ONAJEoDEBu@92Ftw3|ICri69bz8vo3Be2^(_3Kj6@^jb(s~5enES;4E%s*X3s#B$B|GOW6J#ZELB> YuH^)Ve1)+26W9P;#>_i%lwIh3D}J722nM9+`B{XMmx%B}iQO zrV1I2-HvHtgb}5ag-Q3j46uEbufl(i|3(y^AUW+hg+I#J_BA#@AOroo1(tE90F#qm zlHXINDg~a0`C!pX-_eh{>|27ry5la%(AP} z{z4#QvxNowgnS2q#h&u9<_PuCchC!lfu&KL4Nath#-2LoT@j)jO;aS&ah6gMZ&+~4 zT3+WzlT@(G6iY>a#x`V7wLzlyY;D^RgO}7u2g6uWqaovt!g@b5xdeI0&1Jv{G{fO8 zUiK{NmOT6u$lLDe-rG-qo$2nj|3yifQzR1van1bV4`2ZD`7YbB J1|7Ol_zPmug#`cr delta 785 zcmX|(k8o zG~9h=1TL}Vla8snv1?P+Q#D?!V&`xgYrGqdmff2;YsKjuJ&g~BGM$pVnjEhR<50T~ zhj_(4Q!L6?!$xKRwW{F><`#OdhL`teF$j87u97UmR2xi=)#9wGWo``;cSngc27t~1!q) z#smE4DClD>OmCy0c-0rr#N-Xsp8+ddYp8>z;V|yxi-pdbY?s0H@KoA3Fy%P&T$#?8 ztdGUzrbPPkt{f1FD{=~Wk*xA=($A*}v~H%rm_awqcDq(9M2MSLiQ8<;XduWBf2K5*NP%4g2p1Hd4h75!VrswB$;15xS~}X2W0{Sl}XS zt&r*lX^}0|qlZO#PZNv6rhIG*Sd?tR9pI9m0zW8FSkl7AIxpOTnF?L~1PTfTam`(f|S^1|g@&iUSRKIfbvPBX-5 z*sE|9jWYFboRK3_rz6dg7C%ujA4maXyc|vLz4H2~m2Bv}-El2g?2=@(5_Uw%bPq?S zdBxsQEG7)lQDctnwH&9Z(1891;*WEp21FlqTk zCQ2Idf(98Z%j}pK?n#KcW&4uEekA35r^xdh+3$^uf>#n}y!lw-4_k+~X;E4C9J?&r zbN-~w78LE1%IyIbd%TY|hp3OfIUg7VmIi4qFqr^__V`)fZ!yf%GNV}ot@bmUj*^G`yCfKfW;l3K zP`v8agDJTHpWB2Ebvvkoq2Va$MdU~3xYpcW2>B?vulv% z1GfY}(UwNZ0VQ2m=^oL+1Vwk1B)4OzL*>Q6z$L-<&q)Q6+(Zji7ClY_Gg@S<4N}V! zT0ot}K^>~X{W?@oHj-Hslr?67Ij$^mRn{7yvKW4D7Hhm4iI?A-ylBDMz0aHv{5g)847Vq0BRJgS z#bH6Q&lQU>3!Tg`YEr{W<|cZqhSv_}GPz7MXa+o5S3?WaiA)-JMjH%_a|>}`Y_0R+ zHssVmlc}Y4h77SWnM;pzb8%q(sccpMOYs+0xxKjAeHpz`WQUWy2Qw_wf0FQQlLXkL z{3#W|=g@)%=9k3z45WLv#mWb$%kr{X9E*j%)=(rXZcFpjc zvOVpITdjU#4=K9`l-Q+5yg5L9^!%b541kiV*cV?Y3UqeqdiMqi3p7ne5uN3!>V3DL za0<(0D!5F66-}m8cx`GAgVK6&p4-r{2XZL-nlErMWd#oA1b8}%=CrWabT+;7uGwS+ z4+~%8V2Cj@15Q!#s;^u~$otW)L$Ic+o;p~19l?D*k0|5$LDcZZ~MfDB%Q^w9R&m1u{?in_T%# zV`wLvB!;E2Yz=Tb*B!RvR5T zRjhG@7SW=1Jv@EnZE8{6l&iOZS;-dK5nT0A!Ac5odRSc6!6syfqLK&~vWUCCqibW^ aw{JOup>SSYS_MX+td;-vqs9QAr2hd{i;?jF diff --git a/build_all/48/VESC_0005ohm.bin b/build_all/48/VESC_0005ohm.bin index 3e011e61f8eaebbe29e6b71bfbd87fdc312e846e..613ffcccac0a9d1dccbf2dc7e1f6ae2442a71c05 100755 GIT binary patch delta 767 zcmX|;e@IhN6vywq6P<69S{7}JvL&Nv3|FBbDNZY!8u>>Qf<+Sq*CdE2i1ouaEC?lo zTwPOW{%5^tY*Cmla28Fa2|*E*)U!X@gXliCn!Wu{*SoX4a5+l)!5Se6|3cD%3(P>;N6Wjo%j_GrWMI674H`5ePaLlR)3y>?ID| zphO0P-8L(ZG0W0OGU$Ap1eVY8RSZ24z7U1WOHR6u<31VNzRG$CWZ=+Fk!9LqfXPTN zS9sEhgG!_`rP=3Vs6Q@lPFsH`*iWR4>lQiAOB!4;QE(;1SywI=|HD?}tP+*>&a-Jr zyXHw+EPl~CCEtEvvc?8kV}SbT+v^6Sz*L`@_f5sYCTr}xdsz%|v`mhOM_5V)+*Ot}|G5BsF(m+2RFGK@|uH^cE<}y5a$Sown7&OAs z(}L_(wKt`uT6~N_hkI?*!O$>I2DwUMutn?8IBquPO#_3@Ug{{er=$~^jMTM~AN?-_ z#51ytaxNzR;GE((hXl9-+|dZI0u0e=ms?drTy%1ZSeEIT4CKC&$V9)>96G_a7-VQ} zwGhBM6{>NKpw-4$9?vO7@F3#xFW{C!|~Wn+lZ``+Zjg%ReUt64FK5s6z8N1B_^iG1n(r zp3nvd@NG3R;d5$~SGu^iB*_0@lQVKmY&$ delta 785 zcmX|ffwn;791I7G4h5kdWtiOqlVMRYH3w)LKyx!#@Vh0D2|^SS4I&$)M@U$@Y& z&33hu( zP*ClFYVl$kYK6nNI31mYH}SP}bU7mj=D-%v0(ks69hu<`3^nLP=D085SXO|ctQ3oWN-L6ueZZey$v1#kH_$<4Af(6Q?~n>i-*Xt zu&96`SOf=KMb)cqu8GN~@I?-t>8xiCj)g;{S11vC>vQc{_6Mg^CxJ1~mT%9tZOF~> zxZJj>S=*5V!f{p3VL_t51P6T~q>8L=wg?MBAIo;TAyW)fhmayAxQ+>5vZcTApFh|g zHpwOla_nxo=)(nCR0hA|^IBxgtW3Z%&TRN}tY$-giCtP$k##7sEV`8vOW_2YTV>=U zp4Xzhl1GUpa!!2-_9E8g7~fAy)Glm8W21LO3$5k6)P7u|9r}oT3m?#-!mN=vC_<~8 zxiZo?!irSmIvpy`U)fp}W3v7qC{nZew}DHe3@|XjRNBF9$o(oLQHS3w?tG5UXkv8F XT8JQ_THO2&41lfBwtf3shir-eldq5> diff --git a/build_all/48/VESC_default.bin b/build_all/48/VESC_default.bin index c8ca856136846d50f99f8b923672dcabcc393af6..4284018cc8f3360e3ffb8f425552c99380979cd8 100755 GIT binary patch delta 767 zcmX|;e@IhN6vywq6P<69S{7}JvL&Nv3|FBbDNZY!8u>>Qf<+Sq*CdE2i1ouaEC?lo zTwPOW{%5^tY*Cmla28Fa2|*E*)U!X@gXliCn!Wu{*SoX4a5+l)!5Se6|3cD%3(P>;N6Wjo%j_GrWMI674H`5ePaLlR)3y>?ID| zphO0P-8L(ZG0W0OGU$Ap1eVY8RSZ24z7U1WOHR6u<31VNzRG$CWZ=+Fk!9LqfXPTN zS9sEhgG!_`rP=3Vs6Q@lPFsH`*iWR4>lQiAOB!4;QE(;1SywI=|HD?}tP+*>&a-Jr zyXHw+EPl~CCEtEvvc?8kV}SbT+v^6Sz*L`@_f5sYCTr}xdsz%|v`mhOM_5V)+*Ot}|G5BsF(m+2RFGK@|uH^cE<}y5a$Sown7&OAs z(}L_(wKt`uT6~N_hkI?*!O$>I2DwUMutn?8IBquPO#_3@Ug{{er=$~^jMTM~AN?-_ z#51ytaxNzR;GE((hXl9-+|dZI0u0e=ms?drTy%1ZSeEIT4CKC&$V9)>96G_a7-VQ} zwGhBM6{>NKpw-4$9?vO7@F3#xFW{C!|~Wn+lZ``+Zjg%ReUt64FK5s6z8N1B_^iG1n(r zp3nvd@NG3R;d5$~SGu^iB*_0@lQVKmY&$ delta 785 zcmX|ffwn;791I7G4h5kdWtiOqlVMRYH3w)LKyx!#@Vh0D2|^SS4I&$)M@U$@Y& z&33hu( zP*ClFYVl$kYK6nNI31mYH}SP}bU7mj=D-%v0(ks69hu<`3^nLP=D085SXO|ctQ3oWN-L6ueZZey$v1#kH_$<4Af(6Q?~n>i-*Xt zu&96`SOf=KMb)cqu8GN~@I?-t>8xiCj)g;{S11vC>vQc{_6Mg^CxJ1~mT%9tZOF~> zxZJj>S=*5V!f{p3VL_t51P6T~q>8L=wg?MBAIo;TAyW)fhmayAxQ+>5vZcTApFh|g zHpwOla_nxo=)(nCR0hA|^IBxgtW3Z%&TRN}tY$-giCtP$k##7sEV`8vOW_2YTV>=U zp4Xzhl1GUpa!!2-_9E8g7~fAy)Glm8W21LO3$5k6)P7u|9r}oT3m?#-!mN=vC_<~8 zxiZo?!irSmIvpy`U)fp}W3v7qC{nZew}DHe3@|XjRNBF9$o(oLQHS3w?tG5UXkv8F XT8JQ_THO2&41lfBwtf3shir-eldq5> diff --git a/build_all/48/VESC_ws2811.bin b/build_all/48/VESC_ws2811.bin index 42431c4fb77ec90a4de08b7ae4deabcaea64b599..fbf3b4579a6d3ca857e7add8f0cfb440b61f53b3 100755 GIT binary patch delta 767 zcmX|;e@IhN6vywqlc=}NZJFdWV@pQS7%oIfDqNB^wKRf2FmY1gntudg5G(SHib7#T z8{A58{#U(lZ2iF0pjkAP3?d>ZjTzKl827Q&v$wgqdUuu=F6VO2=brOD=gbeO=7&`5 z75EtSGPSQ-qlYI>M;oI}exhLBlLE$YDVExM`DKfRtRJ}Dbv0Dv5T(Uj#2zD){Q)w` z$@Y$H@d$&u;C-x7qJ8i@KB7b&8%kgaYzOVYgC8l81@_`EN>rtO8lG^?rGTNkF+iNy zs6s}g!#*VpGoo}XH{p7n0@hFRRrrSZ&qU!4kQ46X_@s<&USa(NGSIhOV42ngU^3FP zY>d?7K^4-Qm)R#mq(3QWmurb1;l}iYVoJ+XNAs%i6H+4L$06v=SLbH-j3NB8O_`~#!h4Zb5nfN#Qhfc6H0U7$Y zh7aR(A*zO6oYbIVJxGqS(+?@1mX@-xnz0z(?vSN+;tma}HNVTw@&42=($mx1Y_Xu_-Bsh19QUjjUpz@+n@FH*h=cIrrS!kgO-GdA;p#{cLCpL}H z0vUWpi_G|_78R8FvJ1St#T8&m$U9u6+Jcn&K&eXDf&*Gqyh#y{5yUm{Uw;4tkk5D7 Kj?QY)joe?mCWZ(A delta 785 zcmX|>#&9Z<2H^_I*HWSnkwhDTuK6X%Pb>0D1)(95 zi$h6H`jXsmZDxcTI7G4Rg+BNp)0jbd#W;sMyLvbGV)xASz~MPO&+k0X|9Q??8qh2a zXt;aKC~RjdryFM)Ca%xa&eVCaik-(9tnp4bT5)&kycK75KXKjK9u^loPAm&s@`)rcE7`_(fXjXge4~J+w2h6)O$sCu_qbKq{Tv+|+x~qk XVGQ{*!mmHT2$Z$@-@g5%hrOwP6}FT+ diff --git a/build_all/60/VESC_default.bin b/build_all/60/VESC_default.bin index 495893ed2966505d0295a347798bd1b7f0726a5b..4bed50f83344504b6f4bf052cc8c0e927992d3e1 100755 GIT binary patch delta 771 zcmX|;e@IhN6vywqTfd%)n{%cPZ6>2|3>Tsx75<eAtYy3PBu+7j-8pRo2m~G9rKas8S9mZdf@82V-B*t=YIQj-sF~*w`=3B2$|>( zk_k?;4>XG%2GkCp;oAmu5MIFZ26SRaF3g23pauAGnGreQdE9P9Wf`x-W8Os-SUc*1 z#DgChQBjfGH7yP>vQn}(=ABi6^Rsq!eGi2tqVokwtM54es$o0-umJ)Y*tbVynI;J^ zNu@O&A+^|&h4SnP_LVr^9TN?S>R&SZi4<@hBF6oIz6*6QDYqCB_7V{)s?m-VEgk8h3s zmjPl)O-3OniQhS|_>@Be+zsv;1y~IFXtqlYX+li&ayn_9=^P2CS_!DpZ}bnHV3PzH z`nN&|5 zf+Q^H_MvXE(})^jAHHKmd*MYqZA7Ow=fYfA59$GrOH9ZKFW^QKD#;ic81v7nzY7DZ2)bCd%QYEdjQRzGw8Axy3?y5+um1YU z?yyPLNswcA%ftbEH5-*eAAX&UY#9*^mU2$(=iRzIH~yZD%1zI-S+QGny9!6x+$!Wx z*pY+s-8-}ya#Vi__9C9-7~hRc)F-S$gZ)=T7p>$%)K?_Y<^oySgfHcwLepUt*wGy4 ztdMJ8vLe&?MGo3yIit;q2}OtlyPj=y6*$q)fIbE|ikrE(V$~su`bVAO+UIClTIt^~ bA0-_(!eCH%bZ( ziyYiaYStfR4;ot;rvA~S)IsptxLN!9A|tUf^(x{j5Dgee@mlgF)b^lx9QY37~b07yN5Nl%r`fL}H$$RKy<^ zysDNn$&ok}tTLHW(Vx@*Wl*(2V)o_L{}+ST^hgiGczYh|vvsX+_2W@uWSCn}z!0>< z!B$@NW;Y#A%J1>3JanSFhB_D;j*)(@gzvA*_vk%0tFzt$o4L*6F|;Z2m(8@CmE0Ep zCj%tXs*EB|6uxs_;TeZ`xEI{j^RO5U&}^6Mv-yPJWH&v=UI_-{>DY!A21> z^lv#I!IuoE494+!BQlvmVwC;xlJZG;Dh+K**I95#sA0l_=YS+X#8pOAXb6X{@UFj33P^GfEmW+pSAZR@FwRP; z?gcF{hkqE611}m;mgQ`Eg;%$j1a?u~;TF{tqSRALmB1pr$AnBqO*}>rcZ|Ok16H7( QJF30WU_zq}CXE&S0mdYQ$^ZZW delta 789 zcmX|%q)h| z7end%4LF44%*u&|N%z><$=b;}KQVA$ND61U7E>#(zd39tsonQmZidaxvQqtLye3AX zT>%mmbo)TJ*lt8EFoX`SV3LIbcZRmR>ej^57fHeA!;vYJ;Rpb2xakqH&pRQ@%McExGditG0hKSQ<&tyB;K#O0Hy=#%M`FByx=d^v71p`!LF zenknc_*I7^OkJb;?gBQK)WerVn2((wc7T3htCHV`M&rQflFoH3)2P7GB#HP3o>4D5 z!qls4Ih7ciXM%MmSt`0Tu_1%04Ul}FseVI9X8Z|X=z*n$&2R^}JBZV=QMdKd>Uv*Z zHAaHMv>~4h^!B@?w94_EjW@OEn(qK7fw|w5E%X8xIW>jfBJXvP_gNd3QEu% zXRngoFIbUj{5%KkDLSpqi7Seb03~|1(RJW>hyg(c*h<^DgksSliF!xv;{VUlzPuLN cG#?{K*e~|PfCcF5&Oh7f&PBuST!RJu1w4V0YybcN diff --git a/build_all/60/VESC_servoout.bin b/build_all/60/VESC_servoout.bin index 62d0216e7aaab457ad28b9866b5b693d06c5fada..ea67f4245c16370aaa2e864e1a927cd27c59cf47 100755 GIT binary patch delta 84 zcmX>zljqD#o`x-qBC(7t(?w$$bvfVtQgGu?zljqD#o`x-qBC(82(?w$$bvf03E4Xne@_mq+?j6f$%Ewp5_hIiZ?hOWe8TK=< lOz(?jv=QN}V%`w@gXK3+1PrQN7+Bix#WHTc7t8c+9RP}N8}$GH diff --git a/build_all/60/VESC_ws2811.bin b/build_all/60/VESC_ws2811.bin index cf71be453969aaac167f28d4256c373f51acf86e..7371adb864a197a3809fa466b757e44294cf5d1a 100755 GIT binary patch delta 759 zcmX|8Z%9*76uUmDTHT^4A8?Vue*u)~Dhun(U#p+hAvQnR5I1ypr4$4L<1 zF(JD>;F}l68A)DNXG8B4;91s8H~LWcLUiFc=?I_4A2nL}CL1G=fus9Hmhoo+vmtk= zJZZv3W@L5c*-0@yloNO7y+0-PGpXddM2?G-qv5P5ge7r4T!`g+^ej$INo zw5aWbD)-?><>=&~j{*!0^CZeu3(*!!uq=4HN&gDit$~W5A)v_7%?(+v?pXgX1LQU| z8GE^`_>BvRPdFsNec*1H03BeIRvTz75^`dQ(`ElKJ=3YeC^2Pyjpon|`m>OsxphJc zcUw>`G~>7h*-Ngdu$FOGeK?@W8FccawuoHiK1ycM}{+KTiQ z26a`?E~f%#R=e94t1UrU7bvS5zQ?6DWHRd3d4jm(Lf>~#1+>?%`CAP(G}U0!oq>M= DTRD3} delta 789 zcmX|g(oUk|zK{gYawDYV-+Xh#K@wZL>TUikON-CM>Ei#l)?T{&%6RGXG(me z9^cPER_n>)N!r6jk6&mQYUx!AD$PiHhC`o%F_I;Rv6HEA+_RG|5Nh zsc5I-bOxwvMB6RE?vmR0?0)8B=f};U8`z5?Z~Y@-u*D^vZ(gQBfu)HP;c1>xFPj6@ zqiH#%4lXjm8WS%STpC}O!PNSQ!JAsPE@X4~DQ|MaTvILF4jv5Pm>#uSpR22Vd6W?8 z6W%MJ2WG?WI#Kf`RUcI4OSm@^9cn6N4vvLGq+Q4n+e;1ZRQKKe31h%&tTnsSY8Cn3 z-wD} zhfT6Vf*iY>FZSbe29yU4_?ZD&Q!cA8k8@aNc53pz;ZFuskXohAi=9f2(>BcJRuuVw z%|>L*`KZj2O6?`si@4%roEnp;TUdn#{MSS$E#?B$y-T7ErieU*PaBaf^{@i6(E{fv zij==#MXuv6Bie1wP#46gJgtIkE!)T{aLmtuY6jSI8#q;-Q5HmrdPW@L+UICmUh!{O b3=t$85F3933((e;|MpIy2@MsRbd~TQOs4W%D}V4>0v*Ze2_h-G=#2Z)kC z+Tg7O=MSU0(AYpR^+%IvA}U2hlpL9y^pLRctmUV3^ed)M|C-XyL zGS8|0nd1QxzO^*4^fZNu z7hl#QtF_CsAdWM#vRat)Ev12TRW(g;Ojsuxf0$hLU%^3@b|BA&2xMUJh{!T+5@51Q zf0ieWcu9*Y>=|}Sj1Q&6JsJ0Jnf*qpxgL?@!sM)95(U33F8GVF)E~AU8+E8^V3Exz zUvr_f(-{@rv#JdNyIUGzZ83_`e>ea}f!!r9MrKpM=$85dn_`@!Wr~c{GD}&pKveXp zTJB{hlT@(EDYlCLO6YQv<$zqe&a41TUdCK$!jIy7vZC~VI&nBmDwZY2%Ip$(39 z3M#5?zp$mq__`il9Pm(pp<$kkaJ9lnv)OC%4mOs&1=fnLDsNfWmSV_cmBZOx$^SAy zDyzyk$VuW)&L_U$kN^*X$0h;RfFP}QyG1LcL?5S-3QX@ztT@VKCi#Qr&<(apkfFKt zLJS`>pgOo8cN&mYznO=1jKlKrs4A}$KQf>O`=|Vx5K5nL*38g-x#Z=@6Cp(Ol{`78 zmgucKC3={s=shkgD>!99)n(C0zu^1_Qi7~ZVXG0;txi&uUwPl3F6KR=Pu1Uff5L)``<^)Og~}Xj($&;NV;sl4 z0UYCH`&71QsRTNiVPs?BA?7-|$-;9bh(-o0JyvQTI#=SQq52@C^z}Sm6oa4$mp%ld&Bc&W{}w zBXwuu_%NDL!U}VWdrM;81Sw71f3I@$cqiXUcs_vb9+3#1B$@UUVu>VIhqNkK)iced zrMav>WwnNgJtA)}Fx$lkoGDCw^!%(B3;?q&`7szt0IglT(z`}tJWW#|5}!Cqz3B}R zx2)xMW^{!LmYG7S*y`k#45~JO^&VZzmJm(iIaldoYAYSgZt!RXMOCoR_%grImp2{9 z!~EwI7-CG!fK!mY%G1Zzr9Y@s4UhLUQwK}Kaoo?>2>s1^m(F$nNYMl^Rye9$WsY^J zG@X(5WQtcd<$y#+ma~f&$uHhbUhzc&ty?BA)xbxy-Dpt@3F77zVxH|94;NZ`m;U*K z-l3Ch6B(A?trx<`qJedc9$nBtqgu)_b*#nkZJ#X9i5_ZTgKjprDELz~*6MLOH(T-x zTGYUbny-K7al8By^hNB2F@Bg3iHqNWMuOdfl{B&;;@U5guF9k|hD=&mt-G8CCb-O6 zY{}Nwv`7w}(ZT~&k8{gHT3W~elbkKG0h|p|V2%Rj+AeloYL_9AxFZ%}^K. - */ - -#include "servo.h" -#include -#include - -#include "ch.h" -#include "hal.h" - -#if SERVO_OUT_ENABLE && !SERVO_OUT_SIMPLE - -volatile SERVO servos[SERVOS_NUM]; - -#if USE_COMMANDS -volatile SERVO_CMD commands[SERVOS_NUM]; -volatile unsigned int cmd_counter = 0, cmd_time_to_run = 0; -volatile unsigned char cmd_repeat = 0; -#endif - -#if TEST_CYCLE_TIME - volatile unsigned int restart_cnt = 0; - volatile unsigned int interrupt_cnt = 0; -#endif - -static SERVO sorted_servos[SERVOS_NUM]; -static volatile signed char int_index; -static volatile signed char servo_int_index; -static volatile signed char masks_ports_index; -static volatile unsigned char driver_active; -static volatile unsigned int delays[SERVOS_NUM + 1]; -static volatile unsigned char same_pos[SERVOS_NUM + 1]; -static volatile unsigned char same_bits[SERVOS_NUM + 1]; -static volatile unsigned int masks[SERVOS_NUM]; -static stm32_gpio_t *ports[SERVOS_NUM]; -static volatile unsigned char length; -static size_t servo_struct_size = sizeof(SERVO); -static size_t sorted_servos_len = sizeof(sorted_servos) / sizeof(SERVO); - -static thread_t *servo_tp; -static THD_WORKING_AREA(servo_thread_wa, 512); -static THD_FUNCTION(servo_thread, arg); - -/* - * Private functions - */ -static void servo_get_copy(SERVO *a); -static void servo_init_timer(void); -static void servo_start_pulse(void); - -/* - * HW-specific START - */ -#define SERVO_CNT TIM7->CNT -#define SERVO_CNT_TOP TIM7->ARR - -static void servo_init_timer(void) { - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - uint16_t PrescalerValue = 0; - NVIC_InitTypeDef NVIC_InitStructure; - - // ------------- Timer7 ------------- // - // Compute the prescaler value - // TIM7 clock enable - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); - - PrescalerValue = (uint16_t) ((SYSTEM_CORE_CLOCK / 2) / SERVO_CNT_SPEED) - 1; - - // Time base configuration - TIM_TimeBaseStructure.TIM_Period = 0xFFFF; - TIM_TimeBaseStructure.TIM_Prescaler = 0; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; - TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); - - // Prescaler configuration - TIM_PrescalerConfig(TIM7, PrescalerValue, TIM_PSCReloadMode_Immediate); - - // Disable ARR buffering - TIM_ARRPreloadConfig(TIM7, DISABLE); - - // Interrupt generation - TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); - - // TIM6 enable counter - TIM_Cmd(TIM7, ENABLE); - - // NVIC - NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); -} - -void servo_init(void) { - hw_setup_servo_outputs(); - - for (int i = 0; i < SERVOS_NUM; i++) { - palSetPadMode(servos[i].gpio, servos[i].pin, PAL_MODE_OUTPUT_PUSHPULL | - PAL_STM32_OSPEED_HIGHEST); - palClearPad(servos[i].gpio, servos[i].pin); - } - - int_index = 0; - length = 0; - -#if USE_COMMANDS - unsigned char i; - for (i = 0; i < SERVOS_NUM; i++) { - commands[i].active = 0; - commands[i].last = 0; - } -#endif - - chThdCreateStatic(servo_thread_wa, sizeof(servo_thread_wa), NORMALPRIO, servo_thread, NULL); - - servo_init_timer(); - driver_active = 1; -} - -static void servo_start_pulse(void) { - unsigned char i; - for (i = 0; i < SERVOS_NUM; i++) { - palSetPad(servos[i].gpio, servos[i].pin); - } -} - -/* - * Stop servo driver - */ -void servo_stop_driver(void) { - // Disable clock - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, DISABLE); - - TIM_Cmd(TIM7, DISABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, DISABLE); - - driver_active = 0; -} -/* - * HW-specific END - */ - -void servo_irq(void) { - if (int_index < 0) { - // Start pulse - servo_start_pulse(); - SERVO_CNT_TOP = SERVO_START_OFFSET + delays[0]; - int_index = 0; - return; - } - - if (int_index == length) { - // Start Cooldown - SERVO_CNT_TOP = SERVO_COOLDOWN_FACTOR; - chSysLockFromISR(); - chEvtSignalI(servo_tp, (eventmask_t) 1); - chSysUnlockFromISR(); - return; - } - - // End pulse - while (same_pos[int_index]--) { - palClearPort(ports[masks_ports_index], masks[masks_ports_index]); - servo_int_index += same_bits[masks_ports_index]; - masks_ports_index++; - } - - int_index++; - - SERVO_CNT_TOP = delays[int_index]; - - -#if TEST_CYCLE_TIME - if (int_index < length && int_index > 0) { - interrupt_cnt = SERVO_CNT; - } -#endif -} - -static int servo_cmp_by_pos(const void *a, const void *b) { - SERVO *ia = (SERVO *) a; - SERVO *ib = (SERVO *) b; - - if (ACTUAL_POS_PTR(ia) == ACTUAL_POS_PTR(ib)) { - return 0; - } else if (ACTUAL_POS_PTR(ia) < ACTUAL_POS_PTR(ib)) { - return -1; - } else { - return 1; - } -} - -static THD_FUNCTION(servo_thread, arg) { - (void)arg; - - chRegSetThreadName("Servo"); - - servo_tp = chThdGetSelfX(); - - for(;;) { - chEvtWaitAny((eventmask_t) 1); - -#if TEST_CYCLE_TIME - unsigned int pwm_start = SERVO_CNT; -#endif - - servo_int_index = 0; - masks_ports_index = 0; - - servo_get_copy(sorted_servos); - qsort(sorted_servos, sorted_servos_len, servo_struct_size, servo_cmp_by_pos); - - delays[0] = ACTUAL_POS(sorted_servos[0]) * SERVO_CPU_FACTOR; - masks[0] = _BV(sorted_servos[0].pin); - ports[0] = sorted_servos[0].gpio; - - unsigned short i = 0, j = 1, k = 0; - - for (i = 0; i <= SERVOS_NUM; i++) { - same_pos[i] = 1; - same_bits[i] = 1; - } - - i = 0; - - for(;;) { - while (ACTUAL_POS(sorted_servos[j]) == ACTUAL_POS(sorted_servos[j - 1]) && j < SERVOS_NUM) { - if (sorted_servos[j].gpio == sorted_servos[j - 1].gpio) { - masks[k] |= _BV(sorted_servos[j].pin); - same_bits[k]++; - } else { - same_pos[i]++; - ports[++k] = sorted_servos[j].gpio; - masks[k] = _BV(sorted_servos[j].pin); - } - - j++; - } - - i++; - - if (j < SERVOS_NUM) { - delays[i] = (ACTUAL_POS(sorted_servos[j]) - ACTUAL_POS(sorted_servos[j - 1])) * SERVO_CPU_FACTOR; - ports[++k] = sorted_servos[j].gpio; - masks[k] = _BV(sorted_servos[j].pin); - j++; - } else { - break; - } - } - - /* | - * Add a few extra cycles here to make sure the interrupt is able to finish. \|/ - */ - delays[i] = (ACTUAL_POS(sorted_servos[SERVOS_NUM - 1])) * SERVO_CPU_FACTOR + 120; - length = i; - -#if USE_COMMANDS - /* - * Run the commands for the servos here. - */ - for (i = 0;i < SERVOS_NUM;i++) { - if (commands[i].active) { - signed short p = commands[i].pos, ps = servos[i].pos; - - if (p == ps) { - commands[i].active = 0; - commands[i].last = 0; - continue; - } - - commands[i].last += commands[i].speed; - signed short delta = commands[i].last >> 5; - - if (p < ps) { - servos[i].pos -= delta; - if (delta > (ps - p)) { - servos[i].pos = p; - } - } else { - servos[i].pos += delta; - if (delta > (p - ps)) { - servos[i].pos = p; - } - } - - //if (delta > 0) { - // commands[i].last = 0; - //} - commands[i].last -= delta << 5; - } - } - - cmd_counter++; - - if (cmd_counter == cmd_time_to_run && cmd_seq_running) { - signed short tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0; - - while (cmd_seq_running) { - switch (cmd_seq[cmd_ptr++]) { - case CMD_MOVE_SERVO: - tmp1 = cmd_seq[cmd_ptr++]; - tmp2 = cmd_seq[cmd_ptr++]; - tmp3 = cmd_seq[cmd_ptr++]; - - if (tmp3 == 0) { - commands[tmp1].active = 0; - servos[tmp1].pos = tmp2; - } else { - commands[tmp1].speed = tmp3; - commands[tmp1].pos = tmp2; - commands[tmp1].active = 1; - } - break; - - case CMD_MOVE_SERVO_REL: - tmp1 = cmd_seq[cmd_ptr++]; - tmp2 = cmd_seq[cmd_ptr++]; - tmp3 = cmd_seq[cmd_ptr++]; - - if (tmp3 == 0) { - commands[tmp1].active = 0; - servos[tmp1].pos += tmp2; - } else { - commands[tmp1].speed = tmp3; - commands[tmp1].pos += tmp2; - commands[tmp1].active = 1; - } - break; - - case CMD_MOVE_MULTIPLE_SERVOS: - tmp4 = cmd_seq[cmd_ptr++]; - tmp3 = cmd_seq[cmd_ptr++]; - - for (i = 0; i < tmp4; i++) { - tmp1 = cmd_seq[cmd_ptr++]; - tmp2 = cmd_seq[cmd_ptr++]; - - servo_move_within_time(tmp1, tmp2, tmp3); - } - break; - - case CMD_CENTER_ALL: - tmp4 = cmd_seq[cmd_ptr++]; - for (i = 0;i < SERVOS_NUM;i++) { - servo_move_within_time(i, 0, tmp4); - } - break; - - case CMD_WAIT: - cmd_counter = 0; - cmd_time_to_run = cmd_seq[cmd_ptr++] * CMD_WAIT_FACTOR; - goto end_cmds; - break; - - case CMD_WAIT_SERVO: - tmp1 = cmd_seq[cmd_ptr++]; - if (commands[tmp1].active) { - cmd_ptr -= 2; - cmd_counter = 0; - cmd_time_to_run = 1; - goto end_cmds; - } - break; - - case CMD_WAIT_ALL_SERVOS: - for (tmp1 = 0; tmp1 < SERVOS_NUM; tmp1++) { - if (commands[tmp1].active) { - cmd_ptr--; - cmd_counter = 0; - cmd_time_to_run = 1; - goto end_cmds; - } - } - break; - - case CMD_STOP_DRIVER: - servo_stop_cmds(); - servo_stop_driver(); - goto end_cmds; - break; - - case CMD_STOP_CMDS: - servo_stop_cmds(); - goto end_cmds; - break; - - case CMD_RESTART: - cmd_ptr = 0; - break; - - case CMD_REPEAT: - tmp1 = cmd_seq[cmd_ptr++]; - cmd_repeat++; - if (cmd_repeat < tmp1) { - cmd_ptr = 0; - } - break; - - default: - servo_stop_cmds(); - goto end_cmds; - break; - } - - } - - end_cmds: ; - } - -#endif - -#if TEST_CYCLE_TIME - restart_cnt = SERVO_CNT - pwm_start; -#endif - - int_index = -1; - } -} - -#if USE_COMMANDS -volatile signed char cmd_seq_running = 0; -volatile unsigned int cmd_ptr = 0; -volatile const signed short *cmd_seq; - -void servo_move(unsigned char servo, signed short position, unsigned char speed) { - if (speed == 0) { - servos[servo].pos = position; - commands[servo].active = 0; - return; - } - - commands[servo].speed = speed; - commands[servo].pos = position; - commands[servo].active = 1; -} - -void servo_run_cmds(const signed short *cmds) { - cmd_ptr = 0; - cmd_seq = cmds; - cmd_seq_running = 1; - cmd_counter = 0; - cmd_time_to_run = 1; - cmd_repeat = 0; -} - -void servo_stop_cmds(void) { - cmd_seq_running = 0; -} - -void servo_reset_pos(unsigned char speed) { - int i; - for(i = 0;i < SERVOS_NUM;i++) { - servo_move(i, 0, speed); - } -} - -void servo_wait_for_cmds() { - while (cmd_seq_running) {} -} - -void servo_move_within_time(unsigned char servo, signed short pos, unsigned short time_ms) { - if (time_ms == 0) { - servos[servo].pos = pos; - commands[servo].active = 0; - return; - } - - unsigned short diff = abs(pos - servos[servo].pos); - - commands[servo].speed = ((diff * SERVO_PERIOD_TIME_MS) << 1) / (time_ms >> 4); - commands[servo].pos = pos; - commands[servo].active = 1; -} - -void servo_move_within_time_multiple(unsigned short time_ms, unsigned short num, ...) { - va_list arguments; - unsigned char x = 0; - - va_start(arguments, 2 * num); - - for (x = 0; x < num; x++) { - unsigned short servo = va_arg(arguments, unsigned int); - unsigned short pos = va_arg(arguments, unsigned int); - - servo_move_within_time(servo, pos, time_ms); - } - va_end(arguments); -} -#endif - -unsigned char servo_driver_is_active() { - return driver_active; -} - -static void servo_get_copy(SERVO *a) { - int i; - - for(i = 0;i < SERVOS_NUM;i++) { - a[i].gpio = servos[i].gpio; - a[i].pin = servos[i].pin; - a[i].pos = servos[i].pos; - a[i].offset = servos[i].offset; - } -} - -#endif diff --git a/servo.h b/servo.h deleted file mode 100644 index 50f29c34a..000000000 --- a/servo.h +++ /dev/null @@ -1,267 +0,0 @@ -/* - Copyright 2016 Benjamin Vedder benjamin@vedder.se - - This file is part of the VESC firmware. - - The VESC firmware is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - The VESC firmware is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - */ - -/* - * servo.h - * - * Created on: 2009-apr-25 - * Author: Benjamin - * - * - * Changelog: - * 2013-12-XX - * - Port to ChibiOS and STM32F4 - * - probably more changes - * - * 2011-12-08 - * - Renamed functions - * - Fixed pulse issue when pulses are close together - * - * 2011-07-17 - * - Changed some variables to volatile. - * - Added another command. - * - * 2010-11-13 - * - Calculate the servo timings independent of F_CPU. - * - Cleanup - * - */ - -#ifndef SERVO_H_ -#define SERVO_H_ - -#include "ch.h" -#include "hal.h" -#include "hw.h" -#include "conf_general.h" -#include "stm32f407xx.h" - -#ifndef _BV -#define _BV(bit) (1 << (bit)) -#endif - -#ifndef MIN -#define MIN(a,b) (((a)<(b))?(a):(b)) -#endif - -#ifndef MAX -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -// Change these parameters -#define SERVOS_NUM HW_SERVO_NUM // Number of servos to use - -// Servo timer speed in HZ -#define SERVO_CNT_SPEED 1000000L - -/* - * Servo timing (in uS) - * - * The default signal to drive servos looks like this: - * - * ----1000us----|----1000us----|---20000us---- - * _____________________________ - * |______________|_____...______ - * - * -S_STARTPULSE-|--S_PULSELEN--|--S_COOLDOWN-- - * - * And the default parameters are the following - * #define S_STARTPULSE 1000L - * #define S_PULSELEN 1000L - * #define S_COOLDOWN 20000L - * - * You can experiment with these to make your servo move further. - * For some servos these can be way out of spec. - * - * Note that S_PULSELEN is not accurate at all for low F_CPU. However, - * it will be rounded up to the nearest possible value (hence the strange - * calculation below) - * - */ -#define S_STARTPULSE SERVO_OUT_PULSE_MIN_US -#define S_PULSELEN (SERVO_OUT_PULSE_MAX_US - SERVO_OUT_PULSE_MIN_US) -#define S_COOLDOWN (1000000 / SERVO_OUT_RATE_HZ) - -/* - * Dynamic servo parameters - * Calculated from F_CPU - */ -#define SERVO_START_OFFSET (SERVO_CNT_SPEED / (1000000L / S_STARTPULSE)) -#define SERVO_CPU_FACTOR ((SERVO_CNT_SPEED + ((1000000L / S_PULSELEN) * 256L) - 1L) / ((1000000L / S_PULSELEN) * 256L)) // Round up -#define SERVO_COOLDOWN_FACTOR (SERVO_CNT_SPEED / (1000000L / S_COOLDOWN)) - -/* - * Compile with commands to mode servos with a specified speed - * to s specified position interrupt driven. Enabling this will - * use some extra ram and a few bytes of flash. - */ -#define USE_COMMANDS 0 - -/* - * Calculate how many clock cycles it takes to generate PWM. - */ -#define TEST_CYCLE_TIME 0 - -#if TEST_CYCLE_TIME -extern volatile unsigned int restart_cnt; -extern volatile unsigned int interrupt_cnt; - -#define get_restart_cycles() (restart_cnt) -#define get_interrupt_cycles() (interrupt_cnt) -#endif - -// Servo macros -#define ACTUAL_POS(servo) (MAX(MIN(servo.pos + (signed short)servo.offset, 255), 0)) -#define ACTUAL_POS_PTR(servo) (MAX(MIN(servo->pos + (signed short)servo->offset, 255), 0)) -#define CMD_MS_TO_VAL(ms) ((ms) / (((S_STARTPULSE + S_PULSELEN + S_COOLDOWN) * CMD_WAIT_FACTOR) / 1000)) -#define SERVO_PERIOD_TIME_MS ((S_STARTPULSE + S_PULSELEN + S_COOLDOWN) / 1000) - -// Some servo speed defines -// TODO - -typedef struct { - volatile signed short pos; - volatile unsigned char offset; - stm32_gpio_t* gpio; - volatile unsigned int pin; -} SERVO; - -#if USE_COMMANDS -typedef struct { - volatile signed char active; - volatile signed short pos; - volatile signed short speed; - volatile signed short last; -} SERVO_CMD; - -extern volatile signed char cmd_seq_running; -extern volatile unsigned int cmd_ptr; -extern volatile const signed short *cmd_seq; - -/* - * The number of servo cycles to wait for each time unit in the wait command. - * - * The wait time can be calculated with: - * (S_STARTPULSE + S_PULSELEN + S_COOLDOWN) * CMD_WAIT_FACTOR - * - */ -#define CMD_WAIT_FACTOR 1 - -/* - * Servo commands. - */ - -/* - * Move servo to given position with given speed. - * - * Param 1: Servo. - * Param 2: Position. - * Param 3: Speed. 0 for max speed. - */ -#define CMD_MOVE_SERVO 0 - -/* - * Move servo to given relative position with given speed. - * - * Param 1: Servo. - * Param 2: Relative position. - * Param 3: Speed. 0 for max speed. - */ -#define CMD_MOVE_SERVO_REL 1 - -/* - * Move multiple servos such that they arrive at the same time - * - * Param 1: Number of servos. - * Param 2: Time for movement in milliseconds - * Param 3: Servo 1 index - * Param 4: Servo 1 pos - * Param 5: Servo 2 index - * Param 6: Servo 2 pos - * ... and so on - */ -#define CMD_MOVE_MULTIPLE_SERVOS 2 - -/* - * Move all servos to center position - * - * Param 1: Time for movement in milliseconds - */ -#define CMD_CENTER_ALL 3 - -/* - * Wait for a while. See configuration for more info. - * - * Param 1: Time to wait - */ -#define CMD_WAIT 4 - -/* - * Wait for servo to be ready. - * - * Param 1: Servo to wait for. - */ -#define CMD_WAIT_SERVO 5 - -/* - * Wait for all servo commands to get ready. - */ -#define CMD_WAIT_ALL_SERVOS 6 - -/* - * Stop servo driver. - */ -#define CMD_STOP_DRIVER 7 - -/* - * End of command. - */ -#define CMD_STOP_CMDS 8 - -/* - * Restart this command sequence - */ -#define CMD_RESTART 9 - -/* - * Repeat command sequence a number of times - * - * Param 1: Number of times to repeat commands. - */ -#define CMD_REPEAT 10 -#endif - -extern volatile SERVO servos[SERVOS_NUM]; - -void servo_init(void); -void servo_stop_driver(void); -unsigned char servo_driver_is_active(void); -void servo_irq(void); - -#if USE_COMMANDS -void servo_move(unsigned char servo, signed short position, unsigned char speed); -void servo_run_cmds(const signed short *cmds); -void servo_stop_cmds(void); -void servo_reset_pos(unsigned char speed); -void servo_wait_for_cmds(void); -void servo_move_within_time(unsigned char servo, signed short pos, unsigned short time_ms); -void servo_move_within_time_multiple(unsigned short time_ms, unsigned short num, ...); -#endif - -#endif /* SERVO_H_ */ diff --git a/servo_simple.c b/servo_simple.c index d20b302fc..35f9f6e4e 100644 --- a/servo_simple.c +++ b/servo_simple.c @@ -28,7 +28,7 @@ // Settings #define TIM_CLOCK 1000000 // Hz -#if SERVO_OUT_ENABLE && SERVO_OUT_SIMPLE +#if SERVO_OUT_ENABLE void servo_simple_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; @@ -37,36 +37,47 @@ void servo_simple_init(void) { palSetPadMode(HW_ICU_GPIO, HW_ICU_PIN, PAL_MODE_ALTERNATE(HW_ICU_GPIO_AF) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); + HW_ICU_TIM_CLK_EN(); TIM_TimeBaseStructure.TIM_Period = (uint16_t)((uint32_t)TIM_CLOCK / (uint32_t)SERVO_OUT_RATE_HZ); TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((168000000 / 2) / TIM_CLOCK) - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); + TIM_TimeBaseInit(HW_ICU_TIMER, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OC2Init(TIM3, &TIM_OCInitStructure); - TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); + if (HW_ICU_CHANNEL == ICU_CHANNEL_1) { + TIM_OC1Init(HW_ICU_TIMER, &TIM_OCInitStructure); + TIM_OC1PreloadConfig(HW_ICU_TIMER, TIM_OCPreload_Enable); + } else if (HW_ICU_CHANNEL == ICU_CHANNEL_2) { + TIM_OC2Init(HW_ICU_TIMER, &TIM_OCInitStructure); + TIM_OC2PreloadConfig(HW_ICU_TIMER, TIM_OCPreload_Enable); + } - TIM_ARRPreloadConfig(TIM3, ENABLE); + TIM_ARRPreloadConfig(HW_ICU_TIMER, ENABLE); servo_simple_set_output(0.5); - TIM_Cmd(TIM3, ENABLE); + TIM_Cmd(HW_ICU_TIMER, ENABLE); } void servo_simple_set_output(float out) { utils_truncate_number(&out, 0.0, 1.0); - float us = (float)SERVO_OUT_PULSE_MIN_US + out * (float)(SERVO_OUT_PULSE_MAX_US - SERVO_OUT_PULSE_MIN_US); + float us = (float)SERVO_OUT_PULSE_MIN_US + out * + (float)(SERVO_OUT_PULSE_MAX_US - SERVO_OUT_PULSE_MIN_US); us *= (float)TIM_CLOCK / 1000000.0; - TIM3->CCR2 = (uint32_t)us; + + if (HW_ICU_CHANNEL == ICU_CHANNEL_1) { + HW_ICU_TIMER->CCR1 = (uint32_t)us; + } else if (HW_ICU_CHANNEL == ICU_CHANNEL_2) { + HW_ICU_TIMER->CCR2 = (uint32_t)us; + } } #endif