From 44c23daa6e0d5d35e892b79684b239c1a0e67f25 Mon Sep 17 00:00:00 2001 From: Martin Prudek Date: Sun, 26 Apr 2015 21:36:26 +0200 Subject: [PATCH] Complete commutation keeping vector of stator magnetic field perpendicular to vector of rotor magnetic field. --- pmsm-control/test_sw/Makefile | 4 +- pmsm-control/test_sw/main_pmsm.c | 99 ++++- pmsm-control/test_sw/pxmc_sin_fixed.h | 139 +++++++ pmsm-control/test_sw/pxmc_sin_fixtab.c | 534 +++++++++++++++++++++++++ 4 files changed, 771 insertions(+), 5 deletions(-) create mode 100644 pmsm-control/test_sw/pxmc_sin_fixed.h create mode 100644 pmsm-control/test_sw/pxmc_sin_fixtab.c diff --git a/pmsm-control/test_sw/Makefile b/pmsm-control/test_sw/Makefile index be5ddb2..6b2be77 100644 --- a/pmsm-control/test_sw/Makefile +++ b/pmsm-control/test_sw/Makefile @@ -49,5 +49,5 @@ blikej: howto_gpio.o rpi_hw.o 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 diff --git a/pmsm-control/test_sw/main_pmsm.c b/pmsm-control/test_sw/main_pmsm.c index 4a03c3a..5759c97 100644 --- a/pmsm-control/test_sw/main_pmsm.c +++ b/pmsm-control/test_sw/main_pmsm.c @@ -19,6 +19,8 @@ #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 @@ -33,11 +35,27 @@ #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; + uint16_t t_pwm1, t_pwm2, t_pwm3; 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("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("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)); @@ -177,6 +196,7 @@ void prepare_tx(uint8_t * tx){ 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; @@ -210,13 +230,85 @@ void * pos_monitor(void* param){ } 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, */ -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) || @@ -363,7 +455,8 @@ void * read_data(void* param){ } 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); } diff --git a/pmsm-control/test_sw/pxmc_sin_fixed.h b/pmsm-control/test_sw/pxmc_sin_fixed.h new file mode 100644 index 0000000..79085e4 --- /dev/null +++ b/pmsm-control/test_sw/pxmc_sin_fixed.h @@ -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 + +#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 index 0000000..abd287f --- /dev/null +++ b/pmsm-control/test_sw/pxmc_sin_fixtab.c @@ -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 +#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 +}; -- 2.39.2