]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/commitdiff
Complete commutation keeping vector of stator magnetic field perpendicular to vector...
authorMartin Prudek <prudemar@fel.cvut.cz>
Sun, 26 Apr 2015 19:36:26 +0000 (21:36 +0200)
committerMartin Prudek <prudemar@fel.cvut.cz>
Sun, 26 Apr 2015 19:36:26 +0000 (21:36 +0200)
pmsm-control/test_sw/Makefile
pmsm-control/test_sw/main_pmsm.c
pmsm-control/test_sw/pxmc_sin_fixed.h [new file with mode: 0644]
pmsm-control/test_sw/pxmc_sin_fixtab.c [new file with mode: 0644]

index be5ddb29f805afd8aef448738f2cc02109eb42b0..6b2be77cc6688177097ecc6534ccfa2b28c211fd 100644 (file)
@@ -49,5 +49,5 @@ blikej: howto_gpio.o rpi_hw.o
 spi: rp_spi.o
        gcc -o spi rp_spi.c
 #pro rpi
 spi: rp_spi.o
        gcc -o spi rp_spi.c
 #pro rpi
-pmsm: main_pmsm.o rp_spi.o rpi_hw.o misc.o
-       gcc -o pmsm_controll main_pmsm.o rp_spi.o rpi_hw.o  misc.o -lpthread
+pmsm: main_pmsm.o rp_spi.o rpi_hw.o misc.o pxmc_sin_fixtab.o
+       gcc -o pmsm_controll main_pmsm.o rp_spi.o rpi_hw.o  misc.o pxmc_sin_fixtab.o -lpthread
index 4a03c3adff0246e6f76967275807c3f92fea714a..5759c970e92d0ceaf0fc745ba9bd565d4bdebf6f 100644 (file)
@@ -19,6 +19,8 @@
 #include "rpin.h"      /*gpclk*/
 #include "rp_spi.h"    /*spi*/
 #include "misc.h"      /*structure for priorities*/
 #include "rpin.h"      /*gpclk*/
 #include "rp_spi.h"    /*spi*/
 #include "misc.h"      /*structure for priorities*/
+#include "pxmc_sin_fixed.h"    /*to test sin commutation */
+
 
 
 #define PRUM_PROUD     2061
 
 
 #define PRUM_PROUD     2061
 #define THREAD_SHARED  0
 #define INIT_VALUE     0       /*init value for semaphor*/
 
 #define THREAD_SHARED  0
 #define INIT_VALUE     0       /*init value for semaphor*/
 
+
+#define PXMC_SIN_FIX_TAB_BITS 9
+#define PXMC_SIN_FIX_IDX_SLR  23
+#define PXMC_SIN_FIX_XD_MASK  0x007fffff
+#define PXMC_SIN_FIX_XD_SLR   8
+#define PXMC_SIN_FIX_A_MASK   0xffffc000
+#define PXMC_SIN_FIX_B_SLL    19
+#define PXMC_SIN_FIX_B_SAR    16
+#define PXMC_SIN_FIX_B_XD_SAR 6
+#define PXMC_SIN_FIX_ZIC_MASK 0x00002000
+#define PXMC_SIN_FIX_ZIC_BIT  13
+
+#define PXMC_SIN_FIX_PI2      0x40000000
+#define PXMC_SIN_FIX_2PI3     0x55555555
+
 struct sigaction sighnd; /*struktura pro signal handler*/
 struct rpi_in data;
 struct rpi_state{
        uint8_t test;
        uint16_t pwm1, pwm2, pwm3;
 struct sigaction sighnd; /*struktura pro signal handler*/
 struct rpi_in data;
 struct rpi_state{
        uint8_t test;
        uint16_t pwm1, pwm2, pwm3;
+       uint16_t t_pwm1, t_pwm2, t_pwm3;
        char commutate;
        int duty;                       /* duty cycle of pwm */
        uint16_t index_dist;            /* distance to index position */
        char commutate;
        int duty;                       /* duty cycle of pwm */
        uint16_t index_dist;            /* distance to index position */
@@ -125,13 +143,14 @@ void printData(){
        printf("raw_pozice=%d\n",(int32_t)data_p.pozice_raw);
        printf("raw_pozice last12=%u\n",(data_p.pozice_raw&0x0FFF));
        printf("index position=%u\n",data_p.index_position);
        printf("raw_pozice=%d\n",(int32_t)data_p.pozice_raw);
        printf("raw_pozice last12=%u\n",(data_p.pozice_raw&0x0FFF));
        printf("index position=%u\n",data_p.index_position);
-       printf("distance to index=%u\n",s.index_dist);
        printf("hal1=%d, hal2=%d, hal3=%d\n",data_p.hal1,data_p.hal2,data_p.hal3);
        printf("en1=%d, en2=%d, en3=%d (Last sent)\n",!!(0x40&s.test),!!(0x20&s.test),!!(0x10&s.test));
        printf("shdn1=%d, shdn2=%d, shdn3=%d (L.s.)\n",!!(0x08&s.test),!!(0x04&s.test),!!(0x02&s.test));
        printf("PWM1=%u(L.s.)\n",s.pwm1);
        printf("PWM2=%u(L.s.)\n",s.pwm2);
        printf("PWM3=%u(L.s.)\n",s.pwm3);
        printf("hal1=%d, hal2=%d, hal3=%d\n",data_p.hal1,data_p.hal2,data_p.hal3);
        printf("en1=%d, en2=%d, en3=%d (Last sent)\n",!!(0x40&s.test),!!(0x20&s.test),!!(0x10&s.test));
        printf("shdn1=%d, shdn2=%d, shdn3=%d (L.s.)\n",!!(0x08&s.test),!!(0x04&s.test),!!(0x02&s.test));
        printf("PWM1=%u(L.s.)\n",s.pwm1);
        printf("PWM2=%u(L.s.)\n",s.pwm2);
        printf("PWM3=%u(L.s.)\n",s.pwm3);
+       printf("distance to index=%u\n",s.index_dist);
+       printf("T_PWM1=%u T_PWM2=%u T_PWM3=%u\n",s.t_pwm1,s.t_pwm2, s.t_pwm3);
        printf("Pocet namerenych proudu=%u\n",data_p.adc_m_count);
        printf("(pwm1) (ch1)=%d (avg=%4.0f) (%2.2f%%)\n",data_p.ch1,cur1,diff_p(cur1));
        printf("(pwm2) (ch2)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch2,cur2,diff_p(cur2));
        printf("Pocet namerenych proudu=%u\n",data_p.adc_m_count);
        printf("(pwm1) (ch1)=%d (avg=%4.0f) (%2.2f%%)\n",data_p.ch1,cur1,diff_p(cur1));
        printf("(pwm2) (ch2)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch2,cur2,diff_p(cur2));
@@ -177,6 +196,7 @@ void prepare_tx(uint8_t * tx){
        uint16_t tmp;
 
        /* keep the cap*/
        uint16_t tmp;
 
        /* keep the cap*/
+
        if (rps.pwm1>2047) rps.pwm1=2047;
        if (rps.pwm2>2047) rps.pwm2=2047;
        if (rps.pwm3>2047) rps.pwm3=2047;
        if (rps.pwm1>2047) rps.pwm1=2047;
        if (rps.pwm2>2047) rps.pwm2=2047;
        if (rps.pwm3>2047) rps.pwm3=2047;
@@ -210,13 +230,85 @@ void * pos_monitor(void* param){
        }
        return (void*)0;
 }
        }
        return (void*)0;
 }
+
+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,
  */
 /*
  * \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){
+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) ||
        if (duty>=0){ /* clockwise - so that position increase */
                /* pwm3 */
                if ((rps.index_dist>=45 && rps.index_dist<=373) ||
@@ -363,7 +455,8 @@ void * read_data(void* param){
                        }
                        pid();
                        if (rps.index_ok && rps.commutate){
                        }
                        pid();
                        if (rps.index_ok && rps.commutate){
-                               simple_ind_dist_commutator(rps.duty);
+                               /*simple_ind_dist_commutator(rps.duty);*/
+                               sin_commutator(rps.duty);
                        }else if(!rps.index_ok && rps.commutate){
                                simple_hall_commutator(rps.duty);
                        }
                        }else if(!rps.index_ok && rps.commutate){
                                simple_hall_commutator(rps.duty);
                        }
diff --git a/pmsm-control/test_sw/pxmc_sin_fixed.h b/pmsm-control/test_sw/pxmc_sin_fixed.h
new file mode 100644 (file)
index 0000000..79085e4
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware
+
+  pxmc_sin_fixed.h - generic multi axis motion controller
+             fixed sine approximation
+
+  (C) 2001-2015 by Pavel Pisa pisa@cmp.felk.cvut.cz
+  (C) 2002-2015 by PiKRON Ltd. http://www.pikron.com
+
+  This file can be used and copied according to next
+  license alternatives
+   - GPL - GNU Public License
+   - other license provided by project originators
+
+ *******************************************************************/
+
+#include <stdint.h>
+
+#define PXMC_SIN_FIX_TAB_BITS 9
+#define PXMC_SIN_FIX_IDX_SLR  23
+#define PXMC_SIN_FIX_XD_MASK  0x007fffff
+#define PXMC_SIN_FIX_XD_SLR   8
+#define PXMC_SIN_FIX_A_MASK   0xffffc000
+#define PXMC_SIN_FIX_B_SLL    19
+#define PXMC_SIN_FIX_B_SAR    16
+#define PXMC_SIN_FIX_B_XD_SAR 6
+#define PXMC_SIN_FIX_ZIC_MASK 0x00002000
+#define PXMC_SIN_FIX_ZIC_BIT  13
+
+#define PXMC_SIN_FIX_PI2      0x40000000
+#define PXMC_SIN_FIX_2PI3     0x55555555
+
+extern const uint32_t pxmc_sin_fixed_table[];
+
+/**
+ * pxmc_sin_fixed_inline - fixed math sine computation
+ * @x: The argument value - 2^32 corresponds to 2 * PI or 360 deg
+ * @res_unit_bits: number of fraction bits of the result (default 16)
+ *
+ * Returns sine of value @x argument where unit is 2^16, i.e.
+ * return value 0x10000 is equivalent to +1.0 and -0x10000 to -1.0
+ */
+static inline
+int32_t pxmc_sin_fixed_inline(uint32_t x, int res_unit_bits)
+{
+  uint32_t tabval;
+  unsigned int ti;
+  int32_t a;
+  int b, xd;
+  int32_t yl;
+
+  if (!res_unit_bits)
+    res_unit_bits = 16;
+
+  ti = x >> PXMC_SIN_FIX_IDX_SLR;
+  xd = (x & PXMC_SIN_FIX_XD_MASK) >> PXMC_SIN_FIX_XD_SLR;
+
+  tabval = pxmc_sin_fixed_table[ti];
+  a = tabval & PXMC_SIN_FIX_A_MASK;
+  b = (int32_t)(tabval << PXMC_SIN_FIX_B_SLL) >> PXMC_SIN_FIX_B_SAR;
+
+  yl = a;
+  yl += ((int32_t)b * xd) >> PXMC_SIN_FIX_B_XD_SAR;
+
+  yl += yl & (1 << (29 - res_unit_bits));
+  yl >>= 30 - res_unit_bits;
+
+  return yl;
+}
+
+/**
+ * pxmc_sincos_fixed_inline - fixed math sine computation
+ * @pysin: pointer to location where sine value is returned
+ * @pycos: pointer to location where cosine value is returned
+ * @x: The argument value - 2^32 corresponds to 2 * PI or 360 deg
+ * @res_unit_bits: number of fraction bits of the result (default 16)
+ *
+ * Returns sine and cosine of value @x argument where unit is 2^16, i.e.
+ * return value 0x10000 is equivalent to +1.0 and -0x10000 to -1.0
+ */
+static inline
+void pxmc_sincos_fixed_inline(int32_t *pysin, int32_t *pycos,
+                              uint32_t x, int res_unit_bits)
+{
+  uint32_t tabval;
+  unsigned int ti;
+  int32_t a;
+  int b, xd;
+  int32_t ysin;
+  int32_t ycos;
+
+  if (!res_unit_bits)
+    res_unit_bits = 16;
+
+  ti = x >> PXMC_SIN_FIX_IDX_SLR;
+  xd = (x & PXMC_SIN_FIX_XD_MASK) >> PXMC_SIN_FIX_XD_SLR;
+
+  tabval = pxmc_sin_fixed_table[ti];
+  a = tabval & PXMC_SIN_FIX_A_MASK;
+  b = (int32_t)(tabval << PXMC_SIN_FIX_B_SLL) >> PXMC_SIN_FIX_B_SAR;
+
+  ysin = a;
+  ysin += ((int32_t)b * xd) >> PXMC_SIN_FIX_B_XD_SAR;
+
+  ysin += ysin & (1 << (29 - res_unit_bits));
+  ysin >>= 30 - res_unit_bits;
+
+  ti = (uint32_t)(x + PXMC_SIN_FIX_PI2) >> PXMC_SIN_FIX_IDX_SLR;
+
+  tabval = pxmc_sin_fixed_table[ti];
+  a = tabval & PXMC_SIN_FIX_A_MASK;
+  b = (int32_t)(tabval << PXMC_SIN_FIX_B_SLL) >> PXMC_SIN_FIX_B_SAR;
+
+  ycos = a;
+  ycos += ((int32_t)b * xd) >> PXMC_SIN_FIX_B_XD_SAR;
+
+  ycos += ycos & (1 << (29 - res_unit_bits));
+  ycos >>= 30 - res_unit_bits;
+
+  *pysin = ysin;
+  *pycos = ycos;
+}
+
+/**
+ * pxmc_sin_fixed_zic_inline - indicate range for +/-10 degree zero current correction
+ * @x: The argument value - 2^32 corresponds to 2 * PI or 360 deg
+ *
+ * Returns value one if input is in the 0 or PI +/- 10 deg range.
+ */
+static inline
+int pxmc_sin_fixed_zic_inline(uint32_t x)
+{
+  unsigned int ti;
+
+  ti = x >> PXMC_SIN_FIX_IDX_SLR;
+
+  return (pxmc_sin_fixed_table[ti] >> PXMC_SIN_FIX_ZIC_BIT) & 1;
+}
diff --git a/pmsm-control/test_sw/pxmc_sin_fixtab.c b/pmsm-control/test_sw/pxmc_sin_fixtab.c
new file mode 100644 (file)
index 0000000..abd287f
--- /dev/null
@@ -0,0 +1,534 @@
+/*******************************************************************
+  Components for embedded applications builded for
+  laboratory and medical instruments firmware
+
+  pxmc_sin_fixtab.c - generic multi axis motion controller
+             table for fixed sine approximation
+
+  (C) 2001-2015 by Pavel Pisa pisa@cmp.felk.cvut.cz
+  (C) 2002-2015 by PiKRON Ltd. http://www.pikron.com
+
+  This file can be used and copied according to next
+  license alternatives
+   - GPL - GNU Public License
+   - other license provided by project originators
+
+ *******************************************************************/
+
+#include <stdint.h>
+#include "pxmc_sin_fixed.h"
+
+const uint32_t pxmc_sin_fixed_table[] = {
+0x00002c91,
+0x00c92c90,
+0x01922c8f,
+0x025b2c8e,
+0x03242c8c,
+0x03ecec8a,
+0x04b56c87,
+0x057dec83,
+0x06462c7f,
+0x070e2c7b,
+0x07d5ac76,
+0x089d2c71,
+0x09642c6b,
+0x0a2aec65,
+0x0af10c5e,
+0x0bb70c57,
+0x0c7c8c4f,
+0x0d414c47,
+0x0e05cc3e,
+0x0ec9cc35,
+0x0f8d0c2c,
+0x104fcc22,
+0x1111cc17,
+0x11d34c0c,
+0x12940c01,
+0x13540bf5,
+0x14138be8,
+0x14d20bdc,
+0x158fcbce,
+0x164c8bc0,
+0x17088bb2,
+0x17c3cba4,
+0x187e0b94,
+0x19374b85,
+0x19ef8b75,
+0x1aa6cb64,
+0x1b5d4b54,
+0x1c124b42,
+0x1cc68b31,
+0x1d798b1e,
+0x1e2b8b0c,
+0x1edc4af9,
+0x1f8bcae5,
+0x203a0ad1,
+0x20e74abd,
+0x21930aa8,
+0x223d8a93,
+0x22e6ca7e,
+0x238e8a68,
+0x24350a51,
+0x24da4a3b,
+0x257dca24,
+0x26200a0c,
+0x26c0c9f4,
+0x276009dc,
+0x27fdc9c3,
+0x289a09aa,
+0x2934c991,
+0x29cdc977,
+0x2a65095d,
+0x2afb0942,
+0x2b8f0927,
+0x2c21890c,
+0x2cb248f1,
+0x2d4148d5,
+0x2dcec8b8,
+0x2e5a489c,
+0x2ee4087f,
+0x2f6bc862,
+0x2ff20844,
+0x30764826,
+0x30f88808,
+0x317907ea,
+0x31f7c7cb,
+0x327487ac,
+0x32ef078c,
+0x3368076c,
+0x33dec74c,
+0x3453872c,
+0x34c6470c,
+0x353706eb,
+0x35a586ca,
+0x361246a8,
+0x367cc687,
+0x36e54665,
+0x374b8643,
+0x37afc620,
+0x3811c5fe,
+0x387185db,
+0x38cf45b8,
+0x392ac595,
+0x39840571,
+0x39db054e,
+0x3a30052a,
+0x3a828506,
+0x3ad304e1,
+0x3b2104bd,
+0x3b6cc498,
+0x3bb64473,
+0x3bfd844e,
+0x3c428429,
+0x3c850404,
+0x3cc543de,
+0x3d0303b9,
+0x3d3ec393,
+0x3d77c36d,
+0x3daec347,
+0x3de30321,
+0x3e1542fa,
+0x3e44c2d4,
+0x3e7202ae,
+0x3e9d0287,
+0x3ec54260,
+0x3eeb4239,
+0x3f0f0213,
+0x3f3001ec,
+0x3f4ec1c4,
+0x3f6b019d,
+0x3f850176,
+0x3f9c414f,
+0x3fb14128,
+0x3fc3c100,
+0x3fd3c0d9,
+0x3fe140b2,
+0x3fec808a,
+0x3ff50063,
+0x3ffb403b,
+0x3fff0011,
+0x40001fef,
+0x3fff1fc5,
+0x3ffb5f9d,
+0x3ff51f76,
+0x3fec9f4e,
+0x3fe15f27,
+0x3fd3df00,
+0x3fc3ded8,
+0x3fb15eb1,
+0x3f9c5e8a,
+0x3f851e63,
+0x3f6b1e3c,
+0x3f4ede14,
+0x3f301ded,
+0x3f0f1dc7,
+0x3eeb5da0,
+0x3ec55d79,
+0x3e9d1d52,
+0x3e721d2c,
+0x3e44dd06,
+0x3e155cdf,
+0x3de31cb9,
+0x3daedc93,
+0x3d77dc6d,
+0x3d3edc47,
+0x3d031c22,
+0x3cc55bfc,
+0x3c851bd7,
+0x3c429bb2,
+0x3bfd9b8d,
+0x3bb65b68,
+0x3b6cdb43,
+0x3b211b1f,
+0x3ad31afa,
+0x3a829ad6,
+0x3a301ab2,
+0x39db1a8f,
+0x39841a6b,
+0x392ada48,
+0x38cf5a25,
+0x38719a02,
+0x3811d9e0,
+0x37afd9bd,
+0x374b999b,
+0x36e55979,
+0x367cd958,
+0x36125936,
+0x35a59915,
+0x353718f4,
+0x34c658d4,
+0x345398b4,
+0x33ded894,
+0x33681874,
+0x32ef1854,
+0x32749835,
+0x31f7d816,
+0x317917f8,
+0x30f897da,
+0x307657bc,
+0x2ff2179e,
+0x2f6bd781,
+0x2ee41764,
+0x2e5a5748,
+0x2dced72b,
+0x2d41570f,
+0x2cb256f4,
+0x2c2196d9,
+0x2b8f16be,
+0x2afb16a3,
+0x2a651689,
+0x29cdd66f,
+0x2934d656,
+0x289a163d,
+0x27fdd624,
+0x2760160c,
+0x26c0d5f4,
+0x262015dc,
+0x257dd5c5,
+0x24da55af,
+0x24351598,
+0x238e9582,
+0x22e6d56d,
+0x223d9558,
+0x21931543,
+0x20e7552f,
+0x203a151b,
+0x1f8bd507,
+0x1edc54f4,
+0x1e2b94e2,
+0x1d7994cf,
+0x1cc694be,
+0x1c1254ac,
+0x1b5d549c,
+0x1aa6d48b,
+0x19ef947b,
+0x1937546c,
+0x187e145c,
+0x17c3d44e,
+0x17089440,
+0x164c9432,
+0x158fd424,
+0x14d21418,
+0x1413940b,
+0x135413ff,
+0x129413f4,
+0x11d353e9,
+0x1111d3de,
+0x104fd3d4,
+0x0f8d13cb,
+0x0ec9d3c2,
+0x0e05d3b9,
+0x0d4153b1,
+0x0c7c93a9,
+0x0bb713a2,
+0x0af1139b,
+0x0a2af395,
+0x0964338f,
+0x089d338a,
+0x07d5b385,
+0x070e3381,
+0x0646337d,
+0x057df379,
+0x04b57376,
+0x03ecf374,
+0x03243372,
+0x025b3371,
+0x01923370,
+0x00c9336f,
+0x0000336f,
+0xff373370,
+0xfe6e3371,
+0xfda53372,
+0xfcdc3374,
+0xfc137376,
+0xfb4af379,
+0xfa82737d,
+0xf9ba3381,
+0xf8f23385,
+0xf82ab38a,
+0xf763338f,
+0xf69c3395,
+0xf5d5739b,
+0xf50f13a2,
+0xf44913a9,
+0xf38393b1,
+0xf2bed3b9,
+0xf1fa53c2,
+0xf13653cb,
+0xf07313d4,
+0xefb053de,
+0xeeee53e9,
+0xee2cd3f4,
+0xed6c13ff,
+0xecac140b,
+0xebec9418,
+0xeb2e1424,
+0xea705432,
+0xe9b39440,
+0xe8f7944e,
+0xe83c545c,
+0xe782146c,
+0xe6c8d47b,
+0xe610948b,
+0xe559549c,
+0xe4a2d4ac,
+0xe3edd4be,
+0xe33994cf,
+0xe28694e2,
+0xe1d494f4,
+0xe123d507,
+0xe074551b,
+0xdfc6152f,
+0xdf18d543,
+0xde6d1558,
+0xddc2956d,
+0xdd195582,
+0xdc719598,
+0xdbcb15af,
+0xdb25d5c5,
+0xda8255dc,
+0xd9e015f4,
+0xd93f560c,
+0xd8a01624,
+0xd802563d,
+0xd7661656,
+0xd6cb566f,
+0xd6325689,
+0xd59b16a3,
+0xd50516be,
+0xd47116d9,
+0xd3de96f4,
+0xd34dd70f,
+0xd2bed72b,
+0xd2315748,
+0xd1a5d764,
+0xd11c1781,
+0xd094579e,
+0xd00e17bc,
+0xcf89d7da,
+0xcf0797f8,
+0xce871816,
+0xce085835,
+0xcd8b9854,
+0xcd111874,
+0xcc981894,
+0xcc2158b4,
+0xcbac98d4,
+0xcb39d8f4,
+0xcac91915,
+0xca5a9936,
+0xc9edd958,
+0xc9835979,
+0xc91ad99b,
+0xc8b499bd,
+0xc85059e0,
+0xc7ee5a02,
+0xc78e9a25,
+0xc730da48,
+0xc6d55a6b,
+0xc67c1a8f,
+0xc6251ab2,
+0xc5d01ad6,
+0xc57d9afa,
+0xc52d1b1f,
+0xc4df1b43,
+0xc4935b68,
+0xc449db8d,
+0xc4029bb2,
+0xc3bd9bd7,
+0xc37b1bfc,
+0xc33adc22,
+0xc2fd1c47,
+0xc2c15c6d,
+0xc2885c93,
+0xc2515cb9,
+0xc21d1cdf,
+0xc1eadd06,
+0xc1bb5d2c,
+0xc18e1d52,
+0xc1631d79,
+0xc13adda0,
+0xc114ddc7,
+0xc0f11ded,
+0xc0d01e14,
+0xc0b15e3c,
+0xc0951e63,
+0xc07b1e8a,
+0xc063deb1,
+0xc04eded8,
+0xc03c5f00,
+0xc02c5f27,
+0xc01edf4e,
+0xc0139f76,
+0xc00b1f9d,
+0xc004dfc5,
+0xc0011fef,
+0xc0000011,
+0xc001003b,
+0xc004c063,
+0xc00b008a,
+0xc01380b2,
+0xc01ec0d9,
+0xc02c4100,
+0xc03c4128,
+0xc04ec14f,
+0xc063c176,
+0xc07b019d,
+0xc09501c4,
+0xc0b141ec,
+0xc0d00213,
+0xc0f10239,
+0xc114c260,
+0xc13ac287,
+0xc16302ae,
+0xc18e02d4,
+0xc1bb42fa,
+0xc1eac321,
+0xc21d0347,
+0xc251436d,
+0xc2884393,
+0xc2c143b9,
+0xc2fd03de,
+0xc33ac404,
+0xc37b0429,
+0xc3bd844e,
+0xc4028473,
+0xc449c498,
+0xc49344bd,
+0xc4df04e1,
+0xc52d0506,
+0xc57d852a,
+0xc5d0054e,
+0xc6250571,
+0xc67c0595,
+0xc6d545b8,
+0xc730c5db,
+0xc78e85fe,
+0xc7ee4620,
+0xc8504643,
+0xc8b48665,
+0xc91ac687,
+0xc98346a8,
+0xc9edc6ca,
+0xca5a86eb,
+0xcac9070c,
+0xcb39c72c,
+0xcbac874c,
+0xcc21476c,
+0xcc98078c,
+0xcd1107ac,
+0xcd8b87cb,
+0xce0847ea,
+0xce870808,
+0xcf078826,
+0xcf89c844,
+0xd00e0862,
+0xd094487f,
+0xd11c089c,
+0xd1a5c8b8,
+0xd23148d5,
+0xd2bec8f1,
+0xd34dc90c,
+0xd3de8927,
+0xd4710942,
+0xd505095d,
+0xd59b0977,
+0xd6324991,
+0xd6cb49aa,
+0xd76609c3,
+0xd80249dc,
+0xd8a009f4,
+0xd93f4a0c,
+0xd9e00a24,
+0xda824a3b,
+0xdb25ca51,
+0xdbcb0a68,
+0xdc718a7e,
+0xdd194a93,
+0xddc28aa8,
+0xde6d0abd,
+0xdf18cad1,
+0xdfc60ae5,
+0xe0744af9,
+0xe123cb0c,
+0xe1d48b1e,
+0xe2868b31,
+0xe3398b42,
+0xe3edcb54,
+0xe4a2cb64,
+0xe5594b75,
+0xe6108b85,
+0xe6c8cb94,
+0xe7820ba4,
+0xe83c4bb2,
+0xe8f78bc0,
+0xe9b38bce,
+0xea704bdc,
+0xeb2e0be8,
+0xebec8bf5,
+0xecac0c01,
+0xed6c0c0c,
+0xee2ccc17,
+0xeeee4c22,
+0xefb04c2c,
+0xf0730c35,
+0xf1364c3e,
+0xf1fa4c47,
+0xf2becc4f,
+0xf3838c57,
+0xf4490c5e,
+0xf50f0c65,
+0xf5d56c6b,
+0xf69c2c71,
+0xf7632c76,
+0xf82aac7b,
+0xf8f22c7f,
+0xf9ba2c83,
+0xfa826c87,
+0xfb4aec8a,
+0xfc136c8c,
+0xfcdc2c8e,
+0xfda52c8f,
+0xfe6e2c90,
+0xff372c91
+};