spwm調(diào)制單片機(jī)實(shí)現(xiàn)
首先做個(gè)0-90度的正弦表格,再用查表法周期性取表格數(shù)據(jù)再乘個(gè)系數(shù),用定時(shí)器輸出相應(yīng)脈寬的PWM就可以了,以下是我自己計(jì)算的表格及程序源碼,供參考。
const uint16_t sineTable[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};
void Pwm_UPDATE(void)
{
uint16_t Mod_UH, Mod_UL, modIndex_temp;
uint16_t volatile angle_Temp;
Inv_SinAngle += Inv_Angu_Freq;
if(Inv_SinAngle >= 800)
{
Inv_SinAngle -= 800;
}
if(Inv_SinAngle >= 600) //把角度值變換成0~90度之間(1/4正弦周期,正弦表取值范圍內(nèi))
angle_Temp = 800 - Inv_SinAngle;
else if(Inv_SinAngle >= 400)
angle_Temp = Inv_SinAngle - 400;
else if(Inv_SinAngle >= 200)
angle_Temp = 400 - Inv_SinAngle;
else
angle_Temp = Inv_SinAngle;
modIndex_temp = sineTable[angle_Temp];
//單極性調(diào)制
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 //負(fù)半周
{
TIM1_SetCompare1(Mod_UH);
TIM1_SetCompare2(Mod_UL);
}
}