您好, 登录| 注册|
论坛导航
您好, 登录| 注册|
子站:
商城:
论坛首页    逆变/光伏/并网
  •  发帖
  • 收藏

spwm调制单片机实现
阅读: 860 |  回复: 1 楼层直达

2017/07/28 18:04:25
1
lmx10
电源币:11 | 积分:3 主题帖:1 | 回复帖:4
LV1
士兵


QQ截图20160321155901 宝箱升级喽!开启探秘地宫之旅!

QQ截图20160321155901  【有奖DIY】工程师本色上演 设计征集活动



有没有人开贴具体讲spwm的数字实现,小白一个求交流
8位微处理器兼容,双缓冲D/A转换器 面向自动PFC的电容组控制和HMI子系统 SIMPLE SWITCHER 60V,3A降压转换器,40uA Iq
30V N沟道MOSFET -55至150 智能电子式电表的3.3V低成本非隔离离线转换器 3.5 - 36V 2A、3A 低静态电流降压转换器
4.5V至17V输入,6A同步降压SWIFT™转换器 太阳能电池充电高效同步开关模式充电器控制器 具有 40μA 静态电流的 SIMPLE SWITCHER® 降压稳压器
2017/08/02 16:13:24
2
ykwn
电源币:3 | 积分:0 主题帖:0 | 回复帖:2
LV1
士兵

首先做个0-90度的正弦表格,再用查表法周期性取表格数据再乘个系数,用定时器输出相应脉宽的PWM就可以了,以下是我自己计算的表格及程序源码,供参考。

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正弦周期,正弦表取值范围内)        

        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];    

    //单极性调制    

    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);    

    }

}

该帖有赏
关注我们
新浪微博
官方Q群
客服热线
服务时间:周一至周五9:00-18:00
微信关注
免费技术研讨会
获取一手干货分享