+
+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;
+ uint16_t pwm;
+ pos=rps.index_dist*4294967;
+ if (duty>=0){ /*clockwise rotation*/
+ /* 1st phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_240,10); /*10+1 bity*/ /*-120*/
+ pwm=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ pwm+=(!(sin & 0x10000000))*(((1 << j) & sin)>>j)*(duty>>(10-j));
+ }
+ rps.pwm1=pwm;
+
+ /* 2nd phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_120,10); /*10+1 bity*/ /*-240*/
+ pwm=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ pwm+=(!(sin & 0x10000000))*(((1 << j) & sin)>>j)*(duty>>(10-j));
+ }
+ rps.pwm2=pwm;
+
+ /* 3rd phase */
+ sin = pxmc_sin_fixed_inline(pos,10); /*10+1 bity*/
+ pwm=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ pwm+=(!(sin & 0x10000000))*(((1 << j) & sin)>>j)*(duty>>(10-j));
+ }
+ rps.pwm3=pwm;
+ }else{
+ duty=-duty;
+
+ /* 1st phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_60,10); /*10+1 bity*/ /*-300*/
+ pwm=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ pwm+=(!(sin & 0x10000000))*(((1 << j) & sin)>>j)*(duty>>(10-j));
+ }
+ rps.pwm1=pwm;
+
+ /* 2nd phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_300,10); /*10+1 bity*/ /*-60-*/
+ pwm=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ pwm+=(!(sin & 0x10000000))*(((1 << j) & sin)>>j)*(duty>>(10-j));
+ }
+ rps.pwm2=pwm;
+
+ /* 3rd phase */
+ sin = pxmc_sin_fixed_inline(pos+DEGREE_180,10); /*10+1 bity*/ /*-180*/
+ pwm=0;
+ for(j=0;j!=11;j++){
+ /* multiplicate as if maximum sinus value was unity */
+ pwm+=(!(sin & 0x10000000))*(((1 << j) & sin)>>j)*(duty>>(10-j));
+ }
+ rps.pwm3=pwm;
+ }
+ return 0;
+}