+/*
+ * \brief
+ * Multiplication of 11 bit
+ * Zaporne vysledky prvede na nulu.
+ */
+inline uint16_t mult_cap(int32_t s,int d){
+ int j;
+ int res=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ res+=(!(s & 0x10000000))*(((1 << j) & s)>>j)*(d>>(10-j));
+ }
+ return res;
+}
+inline
+int sin_commutator(int duty){
+ #define DEGREE_60 715827883
+ #define DEGREE_120 1431655765
+ #define DEGREE_180 2147483648
+ #define DEGREE_240 2863311531
+ #define DEGREE_300 3579139413
+ uint32_t j,pos;
+ int32_t sin;
+ pos=rps.index_dist;
+ int32_t pwm;
+ /*aby prictene uhly mohla byt kulata cisla, musime index posunout*/
+ pos+=38;
+ /*use it as cyclic 32-bit logic*/
+ pos*=4294967;
+ if (duty>=0){ /*clockwise rotation*/
+ /* 1st phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_240,10); /*10+1 bity*/ /*-120*/
+ pwm=sin*duty/1024;
+ if (pwm<0) pwm=0;
+ rps.pwm1=(uint16_t)pwm;
+
+ /* 2nd phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_120,10); /*10+1 bity*/ /*-240*/
+ pwm=sin*duty/1024;
+ if (pwm<0) pwm=0;
+ rps.pwm2=(uint16_t)pwm;
+
+ /* 3rd phase */
+ sin = pxmc_sin_fixed_inline(pos,10); /*10+1 bity*/
+ pwm=sin*duty/1024;
+ if (pwm<0) pwm=0;
+ rps.pwm3=(uint16_t)pwm;
+ }else{
+ duty=-duty;
+
+ /* 1st phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_60,10); /*10+1 bity*/ /*-300*/
+ pwm=sin*duty/1024;
+ if (pwm<0) pwm=0;
+ rps.pwm1=(uint16_t)pwm;
+
+ /* 2nd phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_300,10); /*10+1 bity*/ /*-60-*/
+ pwm=sin*duty/1024;
+ if (pwm<0) pwm=0;
+ rps.pwm2=(uint16_t)pwm;
+
+ /* 3rd phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_180,10); /*10+1 bity*/ /*-180*/
+ pwm=sin*duty/1024;
+ if (pwm<0) pwm=0;
+ rps.pwm3=(uint16_t)pwm;
+ }
+ return 0;
+}
+/*
+ * \brief
+ * Test function to be placed in controll loop.
+ * Switches PWM's at point where they produce same force.
+ * This points are found thanks to IRC position,
+ */
+inline
+void simple_ind_dist_commutator(int duty){
+ if (duty>=0){ /* clockwise - so that position increase */
+ /* pwm3 */
+ if ((rps.index_dist>=45 && rps.index_dist<=373) ||
+ (rps.index_dist>=1048 && rps.index_dist<=1377)){
+ rps.pwm1=0;
+ rps.pwm2=0;
+ rps.pwm3=duty;
+ /* pwm1 */
+ }else if ((rps.index_dist>=373 && rps.index_dist<=711) ||
+ (rps.index_dist>=1377 && rps.index_dist<=1711)){
+ rps.pwm1=duty;
+ rps.pwm2=0;
+ rps.pwm3=0;
+ /* pwm2 */
+ }else if ((rps.index_dist>=0 && rps.index_dist<=45) ||
+ (rps.index_dist>=711 && rps.index_dist<=1048) ||
+ (rps.index_dist>=1711 && rps.index_dist<=1999)){
+ rps.pwm1=0;
+ rps.pwm2=duty;
+ rps.pwm3=0;
+ }
+ }else{ /*counter-clockwise - position decrease */
+ /* pwm3 */
+ if ((rps.index_dist>=544 && rps.index_dist<=881) ||
+ (rps.index_dist>=1544 && rps.index_dist<=1878)){
+ rps.pwm1=0;
+ rps.pwm2=0;
+ rps.pwm3=-duty;
+ /* pwm1 */
+ }else if ((rps.index_dist>=0 && rps.index_dist<=211) ||
+ (rps.index_dist>=881 && rps.index_dist<=1210) ||
+ (rps.index_dist>=1878 && rps.index_dist<=1999)){
+ rps.pwm1=-duty;
+ rps.pwm2=0;
+ rps.pwm3=0;
+ /* pwm2 */
+ }else if ((rps.index_dist>=211 && rps.index_dist<=544) ||
+ (rps.index_dist>=1210 && rps.index_dist<=1544)){
+ rps.pwm1=0;
+ rps.pwm2=-duty;
+ rps.pwm3=0;
+ }
+ }
+}
+/*
+ * \brief
+ * Test function to be placed in controll loop.
+ * Switches PWM's at point where they produce same force
+ */
+inline void simple_hall_commutator(int duty){
+ if (duty>=0){ /* clockwise - so that position increase */
+ /* pwm3 */
+ if (data.hal2 && !data.hal3){
+ rps.pwm1=0;
+ rps.pwm2=0;
+ rps.pwm3=duty;
+ /* pwm1 */
+ }else if (data.hal1 && !data.hal2){
+ rps.pwm1=duty;
+ rps.pwm2=0;
+ rps.pwm3=0;
+ /* pwm2 */
+ }else if (!data.hal1 && data.hal3){
+ rps.pwm1=0;
+ rps.pwm2=duty;
+ rps.pwm3=0;
+ }
+ }else{ /*counter-clockwise - position decrease */
+ /* pwm3 */
+ if (!data.hal2 && data.hal3){
+ rps.pwm1=0;
+ rps.pwm2=0;
+ rps.pwm3=-duty;
+ /* pwm1 */
+ }else if (!data.hal1 && data.hal2){
+ rps.pwm1=-duty;
+ rps.pwm2=0;
+ rps.pwm3=0;
+ /* pwm2 */
+ }else if (data.hal1 && !data.hal3){
+ rps.pwm1=0;
+ rps.pwm2=-duty;
+ rps.pwm3=0;
+ }
+ }
+}