FOC中常用的一些数学公式(正余弦查找表/最大最小绝对值/反正切)

news/2024/5/14 17:42:41/文章来源:https://blog.csdn.net/weixin_43824188/article/details/131469028

一些基本数学公式

绝对值/最大值/最小值

#define Abs(A)    ((A>=0)?A:-A)  // 绝对值函数
#define Min(A,B)  ((A<=B)?A:B)   // 求最小函数
#define Max(A,B)  ((A>=B)?A:B)   // 求最大函数

固定点格式IQ15

#define   _IQ15(A)       (int32_t)((A)<<15)  //左移15位 32768
#define   _IQ(A)          _IQ15(A)           //定义IQ格式 32768
#define   _IQmpy(A,B)    (int32_t)((A*B)>>15)  //IQ格式相乘 
#define   _IQ10mpy(A,B)   (int32_t)((A*B)>>10) //IQ10格式相乘 
#define   _IQdiv2(A)     (int32_t)((A)>>1)     //除2
#define   _IQmpy2(A)     (int32_t)(A<<1)       //乘2
#define   _IQdiv(A,B)    (int32_t)((A<<15)/B)  //IQ格式相除

正弦与余弦函数查找表

查找表(lookup table)用于存储正弦和余弦函数的值.

预先计算好的正弦或余弦函数在一定范围内的离散采样值

const int16_t IQSin_Cos_Table[256]={\
0x0000,0x00C9,0x0192,0x025B,0x0324,0x03ED,0x04B6,0x057F,\
0x0648,0x0711,0x07D9,0x08A2,0x096A,0x0A33,0x0AFB,0x0BC4,\
0x0C8C,0x0D54,0x0E1C,0x0EE3,0x0FAB,0x1072,0x113A,0x1201,\
0x12C8,0x138F,0x1455,0x151C,0x15E2,0x16A8,0x176E,0x1833,\
0x18F9,0x19BE,0x1A82,0x1B47,0x1C0B,0x1CCF,0x1D93,0x1E57,\
0x1F1A,0x1FDD,0x209F,0x2161,0x2223,0x22E5,0x23A6,0x2467,\
0x2528,0x25E8,0x26A8,0x2767,0x2826,0x28E5,0x29A3,0x2A61,\
0x2B1F,0x2BDC,0x2C99,0x2D55,0x2E11,0x2ECC,0x2F87,0x3041,\
0x30FB,0x31B5,0x326E,0x3326,0x33DF,0x3496,0x354D,0x3604,\
0x36BA,0x376F,0x3824,0x38D9,0x398C,0x3A40,0x3AF2,0x3BA5,\
0x3C56,0x3D07,0x3DB8,0x3E68,0x3F17,0x3FC5,0x4073,0x4121,\
0x41CE,0x427A,0x4325,0x43D0,0x447A,0x4524,0x45CD,0x4675,\
0x471C,0x47C3,0x4869,0x490F,0x49B4,0x4A58,0x4AFB,0x4B9D,\
0x4C3F,0x4CE0,0x4D81,0x4E20,0x4EBF,0x4F5D,0x4FFB,0x5097,\
0x5133,0x51CE,0x5268,0x5302,0x539B,0x5432,0x54C9,0x5560,\
0x55F5,0x568A,0x571D,0x57B0,0x5842,0x58D3,0x5964,0x59F3,\
0x5A82,0x5B0F,0x5B9C,0x5C28,0x5CB3,0x5D3E,0x5DC7,0x5E4F,\
0x5ED7,0x5F5D,0x5FE3,0x6068,0x60EB,0x616E,0x61F0,0x6271,\
0x62F1,0x6370,0x63EE,0x646C,0x64E8,0x6563,0x65DD,0x6656,\
0x66CF,0x6746,0x67BC,0x6832,0x68A6,0x6919,0x698B,0x69FD,\
0x6A6D,0x6ADC,0x6B4A,0x6BB7,0x6C23,0x6C8E,0x6CF8,0x6D61,\
0x6DC9,0x6E30,0x6E96,0x6EFB,0x6F5E,0x6FC1,0x7022,0x7083,\
0x70E2,0x7140,0x719D,0x71F9,0x7254,0x72AE,0x7307,0x735E,\
0x73B5,0x740A,0x745F,0x74B2,0x7504,0x7555,0x75A5,0x75F3,\
0x7641,0x768D,0x76D8,0x7722,0x776B,0x77B3,0x77FA,0x783F,\
0x7884,0x78C7,0x7909,0x794A,0x7989,0x79C8,0x7A05,0x7A41,\
0x7A7C,0x7AB6,0x7AEE,0x7B26,0x7B5C,0x7B91,0x7BC5,0x7BF8,\
0x7C29,0x7C59,0x7C88,0x7CB6,0x7CE3,0x7D0E,0x7D39,0x7D62,\
0x7D89,0x7DB0,0x7DD5,0x7DFA,0x7E1D,0x7E3E,0x7E5F,0x7E7E,\
0x7E9C,0x7EB9,0x7ED5,0x7EEF,0x7F09,0x7F21,0x7F37,0x7F4D,\
0x7F61,0x7F74,0x7F86,0x7F97,0x7FA6,0x7FB4,0x7FC1,0x7FCD,\
0x7FD8,0x7FE1,0x7FE9,0x7FF0,0x7FF5,0x7FF9,0x7FFD,0x7FFE};

反正切函数查找表

const int32_t IQAtan2_Table[256]={\
0x00000000,0x000000C9,0x00000192,0x0000025B,0x00000324,0x000003ED,0x000004B6,0x00000580,\
0x00000649,0x00000712,0x000008A7,0x00000971,0x00000A3B,0x00000B05,0x00000BD0,0x00000C9B,\
0x00000D66,0x00000E31,0x00000EFD,0x00000FC9,0x00001095,0x00001162,0x00001218,0x0000122F,\
0x000012FC,0x000013CA,0x00001498,0x00001566,0x00001635,0x00001705,0x000017D4,0x000018A5,\
0x00001975,0x00001A47,0x00001B19,0x00001BEB,0x00001CBE,0x00001D91,0x00001E65,0x00001F3A,\
0x0000200F,0x000020E5,0x000021BC,0x00002294,0x0000236C,0x00002444,0x0000251E,0x000025F8,\
0x000026D4,0x000027B0,0x0000288C,0x0000296A,0x00002A49,0x00002B28,0x00002C08,0x00002CEA,\
0x00002DCC,0x00002EAF,0x00002F94,0x00003079,0x00003160,0x00003247,0x00003330,0x00003419,\
0x00003509,0x00003571,0x000036DE,0x000037CD,0x000038BD,0x000039AE,0x00003AA0,0x00003B94,\
0x00003C8A,0x00003D80,0x00003E79,0x00003F72,0x0000406E,0x0000416A,0x00004269,0x00004369,\
0x0000446A,0x0000456E,0x00004673,0x0000477A,0x00004882,0x0000498D,0x00004A99,0x00004BA8,\
0x00004CB8,0x00004DCA,0x00004EDF,0x00004FF5,0x0000510E,0x00005228,0x00005345,0x00005465,\
0x00005586,0x000056AA,0x000057D1,0x000058FA,0x00005A25,0x00005B53,0x00005C84,0x00005DB8,\
0x00005EEE,0x00006027,0x00006163,0x000062A2,0x000063E4,0x00006529,0x00006671,0x000067BD,\
0x0000690C,0x00006A5E,0x00006BB3,0x00006D0D,0x00006E69,0x00006FCA,0x0000712E,0x00007296,\
0x00007403,0x00007573,0x000076E7,0x00007860,0x000079DD,0x00007B5F,0x00007CE5,0x00007E70,\
0x00008000,0x00008194,0x0000832E,0x000084CD,0x00008671,0x0000881A,0x000089CA,0x00008B7F,\
0x00008D39,0x00008EFA,0x000090C1,0x0000928F,0x00009463,0x0000963D,0x0000981F,0x00009A08,\
0x00009BF7,0x00009DEF,0x00009FEE,0x0000A1F5,0x0000A404,0x0000A61B,0x0000A83B,0x0000AA64,\
0x0000AC96,0x0000AED1,0x0000B116,0x0000B365,0x0000B5BE,0x0000B822,0x0000BA91,0x0000BD0B,\
0x0000BF90,0x0000C222,0x0000C4C0,0x0000C76A,0x0000CA22,0x0000CCE7,0x0000CF88,0x0000D29D,\
0x0000D58E,0x0000D88E,0x0000DB9F,0x0000DEC0,0x0000E1F3,0x0000E538,0x0000E88F,0x0000EBFA,\
0x0000EF78,0x0000F30B,0x0000F6B4,0x0000FA74,0x0000FE4A,0x00010239,0x00010641,0x00010A64,\
0x00010EA2,0x000112FC,0x00011774,0x00011C0B,0x00012C03,0x0001259C,0x00012A99,0x00012FBC,\
0x00013504,0x00013A76,0x00014012,0x000145DB,0x00014BD3,0x000151FD,0x0001585A,0x00015EEE,\
0x000165BC,0x00016CC6,0x00017411,0x00017B9F,0x00018376,0x00018B98,0x0001940A,0x00019CD2,\
0x0001A5F5,0x0001AF78,0x0001B963,0x0001C3BB,0x0001CE88,0x0001D9D2,0x0001E5A3,0x0001F205,\
0x0001FF01,0x00020CA4,0x00021AFB,0x00022A15,0x00023A02,0x00024AD4,0x00025C9F,0x00026F7B,\
0x0002837F,0x000298CA,0x0002AF7C,0x0002C7BA,0x0002E1AE,0x0002FD8A,0x00031B84,0x00033BDF,\
0x00035EE7,0x000384F5,0x0003AE73,0x0003DBDD,0x00040DCB,0x000444F4,0x00048236,0x0004C6A6,\
0x0005139B,0x00056AC9,0x0005CE63,0x00064144,0x0006C740,0x0007658D,0x00082374,0x00090B81,\
0x000A2D7F,0x000BA246,0x000D9338,0x00104AD7,0x00145E24,0x001B28CC,0x0028BDDA,0x00517C7E };

计算正余弦

实现了根据输入角度值计算正弦和余弦值的功能

void  IQSin_Cos_Cale(p_IQSin_Cos  pV)  
{uint16_t  hindex;hindex = (uint16_t) pV->IQAngle; //-32768--- 32767 +32768===0--65535hindex >>=6;      //65536/64  ===1024/4=90度=256 0x01-0xFF  0X100  0X1FF  0X200 0X2FF    0X300  0X3FFswitch (hindex & SIN_RAD)  //  0X300  &   0x0000 -ff    0x0100  1ff   0X200    2ff   0x0300   3ff  {case U0_90:                        pV->IQSin = IQSin_Cos_Table[(uint8_t)(hindex)];  // 0---255  ==0---32766pV->IQCos = IQSin_Cos_Table[(uint8_t)(0xFF-(u8)(hindex))];break;case U90_180:  pV->IQSin = IQSin_Cos_Table[(u8)(0xFF-(u8)(hindex))]; // 255---0 == 0---32766 pV->IQCos = -IQSin_Cos_Table[(u8)(hindex)];break;case U180_270:pV->IQSin = -IQSin_Cos_Table[(u8)(hindex)];pV->IQCos = -IQSin_Cos_Table[(u8)(0xFF-(u8)(hindex))];break;case U270_360:pV->IQSin=  -IQSin_Cos_Table[(u8)(0xFF-(u8)(hindex))];pV->IQCos =  IQSin_Cos_Table[(u8)(hindex)]; break;default:break;} 
} 

首先,将输入角度值pV->IQAngle转换为无符号16位整数hindex。然后,对hindex进行右移6位,相当于将取值范围从0-65535缩小到0-1023,每64个值对应90度(256个值)。

接下来,通过对hindex与SIN_RAD进行按位与操作,将角度范围分为四个区间进行处理。

计算反正切值

void  IQAtan_Cale(p_IQAtan pV)  
{int16_t   i=0; if( pV->Alpha == 0) { if (pV->Beta==0) i =0; else       i =255; } else {  pV->IQTan = _IQdiv(Abs(pV->Beta),Abs(pV->Alpha)); if (IQAtan2_Table[i + 128] <= pV->IQTan) i += 128; if (IQAtan2_Table[i + 64] <= pV->IQTan) i += 64; if (IQAtan2_Table[i + 32] <= pV->IQTan) i += 32; if (IQAtan2_Table[i + 16] <= pV->IQTan) i += 16; if (IQAtan2_Table[i + 8] <= pV->IQTan) i += 8; if (IQAtan2_Table[i + 4] <= pV->IQTan) i += 4; if (IQAtan2_Table[i + 2] <= pV->IQTan) i += 2; if (IQAtan2_Table[i + 1] <= pV->IQTan) i += 1;    }if ( pV->Beta> 0) { if (pV->Alpha >0) pV->IQAngle =i ;      else      pV->IQAngle= 512 -i;     } else {  if ( pV->Alpha >0)pV->IQAngle= 1024-i;  else      pV->IQAngle =i+512; 	} if( pV->IQAngle<0)pV->IQAngle+=1024;pV->IQAngle= pV->IQAngle<<6;}

用于计算输入值的平方根并返回结果

一种近似算法

uint32_t IQSqrt(uint32_t  M)
{uint32_t   N, i ,tmp  ,ttp;	if ( M==0 )return 0;N=0;tmp=(M>>30);	M<<=2;if( tmp>1 ){N++;tmp-=N;}	for (i=15;i>0;i--  ){N<<=1;tmp<<=2;tmp+=(M>>30);ttp=N;	ttp=(ttp<<1)+1;	M<<=2;if( tmp>= ttp ){tmp-=ttp;N++;}}	return N;			
}

代码

IQ_math.c

#include "IQ_math.h"const int16_t IQSin_Cos_Table[256]={\
0x0000,0x00C9,0x0192,0x025B,0x0324,0x03ED,0x04B6,0x057F,\
0x0648,0x0711,0x07D9,0x08A2,0x096A,0x0A33,0x0AFB,0x0BC4,\
0x0C8C,0x0D54,0x0E1C,0x0EE3,0x0FAB,0x1072,0x113A,0x1201,\
0x12C8,0x138F,0x1455,0x151C,0x15E2,0x16A8,0x176E,0x1833,\
0x18F9,0x19BE,0x1A82,0x1B47,0x1C0B,0x1CCF,0x1D93,0x1E57,\
0x1F1A,0x1FDD,0x209F,0x2161,0x2223,0x22E5,0x23A6,0x2467,\
0x2528,0x25E8,0x26A8,0x2767,0x2826,0x28E5,0x29A3,0x2A61,\
0x2B1F,0x2BDC,0x2C99,0x2D55,0x2E11,0x2ECC,0x2F87,0x3041,\
0x30FB,0x31B5,0x326E,0x3326,0x33DF,0x3496,0x354D,0x3604,\
0x36BA,0x376F,0x3824,0x38D9,0x398C,0x3A40,0x3AF2,0x3BA5,\
0x3C56,0x3D07,0x3DB8,0x3E68,0x3F17,0x3FC5,0x4073,0x4121,\
0x41CE,0x427A,0x4325,0x43D0,0x447A,0x4524,0x45CD,0x4675,\
0x471C,0x47C3,0x4869,0x490F,0x49B4,0x4A58,0x4AFB,0x4B9D,\
0x4C3F,0x4CE0,0x4D81,0x4E20,0x4EBF,0x4F5D,0x4FFB,0x5097,\
0x5133,0x51CE,0x5268,0x5302,0x539B,0x5432,0x54C9,0x5560,\
0x55F5,0x568A,0x571D,0x57B0,0x5842,0x58D3,0x5964,0x59F3,\
0x5A82,0x5B0F,0x5B9C,0x5C28,0x5CB3,0x5D3E,0x5DC7,0x5E4F,\
0x5ED7,0x5F5D,0x5FE3,0x6068,0x60EB,0x616E,0x61F0,0x6271,\
0x62F1,0x6370,0x63EE,0x646C,0x64E8,0x6563,0x65DD,0x6656,\
0x66CF,0x6746,0x67BC,0x6832,0x68A6,0x6919,0x698B,0x69FD,\
0x6A6D,0x6ADC,0x6B4A,0x6BB7,0x6C23,0x6C8E,0x6CF8,0x6D61,\
0x6DC9,0x6E30,0x6E96,0x6EFB,0x6F5E,0x6FC1,0x7022,0x7083,\
0x70E2,0x7140,0x719D,0x71F9,0x7254,0x72AE,0x7307,0x735E,\
0x73B5,0x740A,0x745F,0x74B2,0x7504,0x7555,0x75A5,0x75F3,\
0x7641,0x768D,0x76D8,0x7722,0x776B,0x77B3,0x77FA,0x783F,\
0x7884,0x78C7,0x7909,0x794A,0x7989,0x79C8,0x7A05,0x7A41,\
0x7A7C,0x7AB6,0x7AEE,0x7B26,0x7B5C,0x7B91,0x7BC5,0x7BF8,\
0x7C29,0x7C59,0x7C88,0x7CB6,0x7CE3,0x7D0E,0x7D39,0x7D62,\
0x7D89,0x7DB0,0x7DD5,0x7DFA,0x7E1D,0x7E3E,0x7E5F,0x7E7E,\
0x7E9C,0x7EB9,0x7ED5,0x7EEF,0x7F09,0x7F21,0x7F37,0x7F4D,\
0x7F61,0x7F74,0x7F86,0x7F97,0x7FA6,0x7FB4,0x7FC1,0x7FCD,\
0x7FD8,0x7FE1,0x7FE9,0x7FF0,0x7FF5,0x7FF9,0x7FFD,0x7FFE}; const int32_t IQAtan2_Table[256]={\
0x00000000,0x000000C9,0x00000192,0x0000025B,0x00000324,0x000003ED,0x000004B6,0x00000580,\
0x00000649,0x00000712,0x000008A7,0x00000971,0x00000A3B,0x00000B05,0x00000BD0,0x00000C9B,\
0x00000D66,0x00000E31,0x00000EFD,0x00000FC9,0x00001095,0x00001162,0x00001218,0x0000122F,\
0x000012FC,0x000013CA,0x00001498,0x00001566,0x00001635,0x00001705,0x000017D4,0x000018A5,\
0x00001975,0x00001A47,0x00001B19,0x00001BEB,0x00001CBE,0x00001D91,0x00001E65,0x00001F3A,\
0x0000200F,0x000020E5,0x000021BC,0x00002294,0x0000236C,0x00002444,0x0000251E,0x000025F8,\
0x000026D4,0x000027B0,0x0000288C,0x0000296A,0x00002A49,0x00002B28,0x00002C08,0x00002CEA,\
0x00002DCC,0x00002EAF,0x00002F94,0x00003079,0x00003160,0x00003247,0x00003330,0x00003419,\
0x00003509,0x00003571,0x000036DE,0x000037CD,0x000038BD,0x000039AE,0x00003AA0,0x00003B94,\
0x00003C8A,0x00003D80,0x00003E79,0x00003F72,0x0000406E,0x0000416A,0x00004269,0x00004369,\
0x0000446A,0x0000456E,0x00004673,0x0000477A,0x00004882,0x0000498D,0x00004A99,0x00004BA8,\
0x00004CB8,0x00004DCA,0x00004EDF,0x00004FF5,0x0000510E,0x00005228,0x00005345,0x00005465,\
0x00005586,0x000056AA,0x000057D1,0x000058FA,0x00005A25,0x00005B53,0x00005C84,0x00005DB8,\
0x00005EEE,0x00006027,0x00006163,0x000062A2,0x000063E4,0x00006529,0x00006671,0x000067BD,\
0x0000690C,0x00006A5E,0x00006BB3,0x00006D0D,0x00006E69,0x00006FCA,0x0000712E,0x00007296,\
0x00007403,0x00007573,0x000076E7,0x00007860,0x000079DD,0x00007B5F,0x00007CE5,0x00007E70,\
0x00008000,0x00008194,0x0000832E,0x000084CD,0x00008671,0x0000881A,0x000089CA,0x00008B7F,\
0x00008D39,0x00008EFA,0x000090C1,0x0000928F,0x00009463,0x0000963D,0x0000981F,0x00009A08,\
0x00009BF7,0x00009DEF,0x00009FEE,0x0000A1F5,0x0000A404,0x0000A61B,0x0000A83B,0x0000AA64,\
0x0000AC96,0x0000AED1,0x0000B116,0x0000B365,0x0000B5BE,0x0000B822,0x0000BA91,0x0000BD0B,\
0x0000BF90,0x0000C222,0x0000C4C0,0x0000C76A,0x0000CA22,0x0000CCE7,0x0000CF88,0x0000D29D,\
0x0000D58E,0x0000D88E,0x0000DB9F,0x0000DEC0,0x0000E1F3,0x0000E538,0x0000E88F,0x0000EBFA,\
0x0000EF78,0x0000F30B,0x0000F6B4,0x0000FA74,0x0000FE4A,0x00010239,0x00010641,0x00010A64,\
0x00010EA2,0x000112FC,0x00011774,0x00011C0B,0x00012C03,0x0001259C,0x00012A99,0x00012FBC,\
0x00013504,0x00013A76,0x00014012,0x000145DB,0x00014BD3,0x000151FD,0x0001585A,0x00015EEE,\
0x000165BC,0x00016CC6,0x00017411,0x00017B9F,0x00018376,0x00018B98,0x0001940A,0x00019CD2,\
0x0001A5F5,0x0001AF78,0x0001B963,0x0001C3BB,0x0001CE88,0x0001D9D2,0x0001E5A3,0x0001F205,\
0x0001FF01,0x00020CA4,0x00021AFB,0x00022A15,0x00023A02,0x00024AD4,0x00025C9F,0x00026F7B,\
0x0002837F,0x000298CA,0x0002AF7C,0x0002C7BA,0x0002E1AE,0x0002FD8A,0x00031B84,0x00033BDF,\
0x00035EE7,0x000384F5,0x0003AE73,0x0003DBDD,0x00040DCB,0x000444F4,0x00048236,0x0004C6A6,\
0x0005139B,0x00056AC9,0x0005CE63,0x00064144,0x0006C740,0x0007658D,0x00082374,0x00090B81,\
0x000A2D7F,0x000BA246,0x000D9338,0x00104AD7,0x00145E24,0x001B28CC,0x0028BDDA,0x00517C7E };void  IQSin_Cos_Cale(p_IQSin_Cos  pV)  
{uint16_t  hindex;hindex = (uint16_t) pV->IQAngle; //-32768--- 32767 +32768===0--65535hindex >>=6;      //65536/64  ===1024/4=90度=256 0x01-0xFF  0X100  0X1FF  0X200 0X2FF    0X300  0X3FFswitch (hindex & SIN_RAD)  //  0X300  &   0x0000 -ff    0x0100  1ff   0X200    2ff   0x0300   3ff  {case U0_90:                        pV->IQSin = IQSin_Cos_Table[(uint8_t)(hindex)];  // 0---255  ==0---32766pV->IQCos = IQSin_Cos_Table[(uint8_t)(0xFF-(u8)(hindex))];break;case U90_180:  pV->IQSin = IQSin_Cos_Table[(u8)(0xFF-(u8)(hindex))]; // 255---0 == 0---32766 pV->IQCos = -IQSin_Cos_Table[(u8)(hindex)];break;case U180_270:pV->IQSin = -IQSin_Cos_Table[(u8)(hindex)];pV->IQCos = -IQSin_Cos_Table[(u8)(0xFF-(u8)(hindex))];break;case U270_360:pV->IQSin=  -IQSin_Cos_Table[(u8)(0xFF-(u8)(hindex))];pV->IQCos =  IQSin_Cos_Table[(u8)(hindex)]; break;default:break;} 
} 
//该函数的作用是将输入值限制在指定的范围内,如果超出范围则将其限制在范围边界值上
int32_t  IQsat( int32_t Uint,int32_t  U_max, int32_t U_min) 
{int32_t Uout; if(Uint<= U_min)Uout= U_min;else if( Uint>=U_max)Uout=U_max;elseUout= Uint;   return  Uout; 
}
//计算反正切值
void  IQAtan_Cale(p_IQAtan pV)  
{int16_t   i=0; if( pV->Alpha == 0) { if (pV->Beta==0) i =0; else       i =255; } else {  pV->IQTan = _IQdiv(Abs(pV->Beta),Abs(pV->Alpha)); if (IQAtan2_Table[i + 128] <= pV->IQTan) i += 128; if (IQAtan2_Table[i + 64] <= pV->IQTan) i += 64; if (IQAtan2_Table[i + 32] <= pV->IQTan) i += 32; if (IQAtan2_Table[i + 16] <= pV->IQTan) i += 16; if (IQAtan2_Table[i + 8] <= pV->IQTan) i += 8; if (IQAtan2_Table[i + 4] <= pV->IQTan) i += 4; if (IQAtan2_Table[i + 2] <= pV->IQTan) i += 2; if (IQAtan2_Table[i + 1] <= pV->IQTan) i += 1;    }if ( pV->Beta> 0) { if (pV->Alpha >0) pV->IQAngle =i ;      else      pV->IQAngle= 512 -i;     } else {  if ( pV->Alpha >0)pV->IQAngle= 1024-i;  else      pV->IQAngle =i+512; 	} if( pV->IQAngle<0)pV->IQAngle+=1024;pV->IQAngle= pV->IQAngle<<6;}//用于计算输入值的平方根并返回结果
uint32_t IQSqrt(uint32_t  M)
{uint32_t   N, i ,tmp  ,ttp;	if ( M==0 )return 0;N=0;tmp=(M>>30);	M<<=2;if( tmp>1 ){N++;tmp-=N;}	for (i=15;i>0;i--  ){N<<=1;tmp<<=2;tmp+=(M>>30);ttp=N;	ttp=(ttp<<1)+1;	M<<=2;if( tmp>= ttp ){tmp-=ttp;N++;}}	return N;			
}

IQ_math.h

#ifndef _IQ_math_H
#define _IQ_math_H #include "stm32f10x.h"//共256个数#define Abs(A)    ((A>=0)?A:-A)  // 绝对值函数
#define Min(A,B)  ((A<=B)?A:B)   // 求最小函数
#define Max(A,B)  ((A>=B)?A:B)   // 求最大函数#define   _IQ15(A)       (int32_t)((A)<<15)  //左移15位 32768
#define   _IQ(A)          _IQ15(A)           //定义IQ格式 32768
#define   _IQmpy(A,B)    (int32_t)((A*B)>>15)  //IQ格式相乘 
#define   _IQ10mpy(A,B)   (int32_t)((A*B)>>10) //IQ10格式相乘 
#define   _IQdiv2(A)     (int32_t)((A)>>1)     //除2
#define   _IQmpy2(A)     (int32_t)(A<<1)       //乘2
#define   _IQdiv(A,B)    (int32_t)((A<<15)/B)  //IQ格式相除#define SIN_RAD     0x0300
#define U0_90       0x0000 
#define U90_180     0x0100
#define U180_270    0x0200
#define U270_360    0x0300typedef struct 	{ int32_t  IQAngle;  // 电机磁极位置角度0---65536即是0---360度 		int32_t  IQSin;		 // IQ格式正弦参数,-32768---32767  -1到1 int32_t  IQCos;		 // IQ格式余弦参数,-32768---32767  -1到1	 } IQSin_Cos , *p_IQSin_Cos;#define IQSin_Cos_DEFAULTS  { 0,0,0} // 初始化参数typedef struct 	{ int32_t  Alpha; 	//二相静止坐标系 Alpha 轴	 int32_t  Beta;		//二相静止坐标系 Beta 轴	 	 int32_t  IQTan;		//IQ格式正切 45度正切是1,IQ的格式是 int32_t  IQAngle;	//IQ格式角度值 0---65536 == 0---360度 int32_t  JZIQAngle; //矫正IQ格式角度值} IQAtan , *p_IQAtan;#define IQAtan_DEFAULTS  {0,0,0,0,0}  // 初始化参数uint32_t IQSqrt(uint32_t  M); // 开方函数
void  IQSin_Cos_Cale(p_IQSin_Cos pV); //求取正余弦函数 
void  IQAtan_Cale(p_IQAtan  pV) ;  //求取求反正切函数
int32_t IQsat( int32_t Uint,int32_t  U_max, int32_t U_min); //限制赋值函数
#endif /* __IQ_math_H */

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_323877.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 中的 Environment

Spring Boot 中的 Environment 在 Spring Boot 中&#xff0c;Environment 是一个重要的组件&#xff0c;用于管理应用程序的配置。它是一个接口&#xff0c;提供了访问应用程序配置属性的方法。在本文中&#xff0c;我们将深入探讨 Spring Boot 中的 Environment&#xff0c;…

SpringMvc中文件上传

文章目录 1.导入文件上传所需要的jar包 2. 配置文件解析器 3.写一个前端页面 4.写后台程序 1.导入文件上传所需要的jar包 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.…

threejs纹理

个人博客地址: https://cxx001.gitee.io 前面我们介绍了各种可以用来覆盖对象的材质&#xff0c;也介绍了如何修改材质的颜色、关泽和不透明度&#xff0c;但是我们还没有详细介绍如何在材质中使用外部图片(也叫纹理). 将纹理应用于材质 1. 加载纹理并应用到网格 纹理最基础…

拯救者Lenovo Legion Y9000X IAH7 2022款(82TF)原装出厂Windows11系统恢复原厂OEM系统

Lenovo联想拯救者笔记本电脑 Legion Y9000X IAH7 2022款(82TF)出厂状态原装Win11系统&#xff0c;恢复原厂系统 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&am…

C语言算法笔记1:结构体、结构体数组实战讲解

今日开始为电赛复习一些必备的算法知识&#xff0c;本文回顾复习结构体的概念以及一些基本操作&#xff0c;每个知识点都有代码实践演示&#xff0c;可以复制测试查看&#xff01; 目录 前言——往日的困惑&#xff1a; 一、结构体基础知识与用途&#xff1a; C语言结构体是…

「完美解决」concrt140.dll丢失怎么恢复(解决方案)

我们平时在打开 Adobe 应用程序、Halo、Forza Horizon 5 等时&#xff0c;可能会遇到找不到 concrt140.dll。因此&#xff0c;这不是特定于某个应用程序的问题。如果没有安装正确的 DLL&#xff0c;应用程序将无法正常工作&#xff0c;因为它们的代码依赖于这些库中编写的代码。…

webstorm配置vue开发环境

&#x1f333;&#x1f333;&#x1f333;前言&#xff1a;本文章针对于如何用IDE和webstorm运行一个别人的vue项目进行步骤记录。 &#x1f4d9;参考&#xff1a;(10条消息) idea配置vue开发环境_idea配置vue运行环境_drinkworld的博客-CSDN博客https://blog.csdn.net/drinkwo…

【零基础学习C++】如何写一个C++类?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️系列专栏:零基础学习C】 文章目录 前言什么是类&#xff1f;&#x1f914;类的三大特性&#x1f463;定义一个类&#x1f4bb;类的实例化&#x1f52c; 前言 类是对现实生活中一类具有共同特征的事物…

这才叫电脑必装软件,强烈推荐安装!从此告别流氓软件!

软件千千万&#xff0c;有的软件被大家公认为流氓软件&#xff0c;捆绑广告、弹窗不断...... 当然&#xff0c;也有不少软件是非常良心的&#xff0c;免费功能还强大&#xff0c;体验也非常好。今天给大家整理了8款电脑必装软件&#xff0c;每一款都是顶顶好的良心软件&#x…

递归:探索问题的无限深度

引言&#xff1a; 在计算机科学中&#xff0c;有一种强大的概念叫做递归。它可以帮助我们解决各种复杂的问题&#xff0c;使代码更加简洁而优雅。递归是一种函数调用自身的技术&#xff0c;通过将问题分解成较小的子问题&#xff0c;以及逐步将其解决&#xff0c;从而达到解决整…

【JavaEE初阶】TCP/IP协议(二)

文章目录 网络层重点协议IP协议地址管理路由选择 数据链路层重点协议以太网协议MTU 应用层重要协议DNS&#xff08;域名解析系统&#xff09; 网络层重点协议 IP协议 协议头格式如下&#xff1a; 4位版本号&#xff08;version&#xff09;&#xff1a;指定IP协议的版本&am…

ReentrantReadWriteLock源码

介绍 用一个变量如何维护多种状态 在 ReentrantLock 中&#xff0c;使用 Sync ( 实际是 AQS )的 int 类型的 state 来表示同步状态&#xff0c;表示锁被一个线程重复获取的次数。 但是&#xff0c;读写锁 ReentrantReadWriteLock 内部维护着一对读写锁&#xff0c;如果要用一…

shiro和redis一起使用

Shiro 缓存配置 当我们进行授权操作时,每次都会从数据库查询用户权限信息,为了提高授权性能,可以将用户权限信息查询出来以后进行缓存,下次授权时从缓存取数据即可。 Shiro 中内置缓存应用实现,其步骤如下: 第一步:在 SpringShiroConfig 中配置缓存 Bean 对象(Shiro 框架提供)…

VulnHub打靶记录——easy_cloudantivirus

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/boredhackerblog-cloud-av,453/ 将靶机设置为NAT模式并启动。 主机发现&信息收集 nmap扫描本地网段 nmap -sn 192.168.50.1/24136是kali&#xff0c;137就是我们的目标靶机。 接着收集靶场信息&#xff1a; n…

智能小家电如何升级Type-C接口充电?

目前市面上智能小家电充电接口还是USB Micor&#xff0c;AC&#xff0c;DC接口等&#xff0c;今年随着欧盟的一纸令下&#xff0c;22年12月24日&#xff0c;欧洲理事会最终批准了“在欧盟范围内统一充电器接口”的法案。这意味着到2024年&#xff0c;usb type-c接口将成为一系列…

应用面向对象思想进行Linux内核分析的优化方法

在分析Linux内核时&#xff0c;应用面向对象思想可以帮助我们更好地理解和组织内核代码。虽然Linux内核是用C语言编写的&#xff0c;并没有内置的面向对象机制&#xff0c;但我们可以通过一些方法来应用面向对象思想进行分析。 我这里刚好有嵌入式、单片机、plc的资料需要可以…

大学智慧课堂系统整理

目录 一、题目类型选择器(非组件库) 1.1、效果展示 1.2、代码展示 二、题目类型选择器(Vant组件库) 2.1、效果展示 2.2、代码展示 一、题目类型选择器(非组件库) 使用vue2&#xff1a;在methods里区分单个点击和多个点击&#xff0c;在view视图区分判断题和选择题。 如下…

支持刷机(OpenWrt)的路由器大全

2023年上半年最热门的刷机路由器当然是360T7、小米WR30U这两款&#xff0c;主要是性价比高&#xff0c;闲鱼100多搞定&#xff0c;支持刷OpenWrt、支持WiFi6&#xff0c;采用MTK798X系列处理器&#xff0c;性能强&#xff0c;轻松跑满千兆&#xff0c;如果你想追新&#xff0c;…

如何用smardaten90天快速开发并上线智慧空间loT物联平台?

前言 大家好&#xff0c;我是小白白&#xff0c;前段时间一位好友接手了一个“烫手山芋”开发任务&#xff0c;77万㎡的科技园区需要打造智慧空间物联平台。要求接入600园区设备&#xff0c;处理15000日数据量&#xff0c;在打造整体IOT物联底座之上&#xff0c;构建起整个园区…

管理类联考——数学——知识篇——公式——最难记

立方和与立方差公式 a 3 b 3 ( a b ) ( a 2 ∓ a b b 2 ) a^3b^3(ab)(a^2∓abb^2) a3b3(ab)(a2∓abb2) 一元二次方程求根公式 x − b b 2 − 4 a c 2 a &#xff0c; b 2 − 4 a c ≥ 0 x\frac{-b\sqrt{b^2-4ac}}{2a}&#xff0c;\sqrt{b^2-4ac}≥0 x2a−bb2−4ac ​​&…