+
+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;
+}
+/*
+ * \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;
+ }
+ }
+}