ykwn:
首先做个0-90度的正弦表格,再用查表法周期性取表格数据再乘个系数,用定时器输出相应脉宽的PWM就可以了,以下是我自己计算的表格及程序源码,供参考。constuint16_tsineTable[201]={ 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96,100,104,108,112,116, 120,123,127,131,135,139,143,147,151,154, 158,162,166,170,173,177,181,185,188,192, 196,200,203,207,211,214,218,222,225,229, 232,236,240,243,247,250,254,257,261,264, 268,271,274,278,281,284,288,291,294,298, 301,304,307,311,314,317,320,323,326,329, 333,336,339,342,345,348,350,353,356,359, 362,365,368,370,373,376,379,381,384,387, 389,392,395,397,400,402,405,407,409,412, 414,417,419,421,423,426,428,430,432,434, 437,439,441,443,445,447,449,451,452,454, 456,458,460,462,463,465,467,468,470,471, 473,475,476,478,479,480,482,483,484,486, 487,488,489,491,492,493,494,495,496,497, 498,499,500,501,501,502,503,504,504,505, 506,506,507,507,508,508,509,509,510,510, 510,511,511,511,511,512,512,512,512,512, 512};voidPwm_UPDATE(void){ uint16_t Mod_UH,Mod_UL,modIndex_temp; uint16_tvolatileangle_Temp; Inv_SinAngle+=Inv_Angu_Freq; if(Inv_SinAngle>=800) { Inv_SinAngle-=800; } if(Inv_SinAngle>=600) //把角度值变换成0~90度之间(1/4正弦周期,正弦表取值范围内) angle_Temp=800-Inv_SinAngle; elseif(Inv_SinAngle>=400) angle_Temp=Inv_SinAngle-400; elseif(Inv_SinAngle>=200) angle_Temp=400-Inv_SinAngle; else angle_Temp=Inv_SinAngle; modIndex_temp=sineTable[angle_Temp]; //单极性调制 Mod_UH=((uint32_t)Mod_output*modIndex_temp)>>9; Mod_UL=0; if(Mod_UH>Pulse_MAX) Mod_UH=Pulse_MAX; if(Inv_SinAngle<Inv_PWMTAB_180) { TIM1_SetCompare2(Mod_UH); TIM1_SetCompare1(Mod_UL); } else //负半周 { TIM1_SetCompare1(Mod_UH); TIM1_SetCompare2(Mod_UL); }}