• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

看到大家都用硬件SPWM搞得很复杂,但MCU的个个做不肯开源.我教大家一个笨方法

 

看到了吧,SPWM就是这样.

笨方法就是,把你须要的频率固定好,X轴的时间T也就定了下来,Y轴就是振幅,这个自己决定.有了这个参数后把正弘波分为360份.每度1份,先计算上面图的面积,得出后匹配下图的的脉冲面积。最后计算出每个脉冲的时间和占空比时间,以次作为单片机的定时器溢出时间。别小看这个土方法,但是行之有效,单片机基本上不点用资源,定时器中断,付下次溢出的初始值,输出SPWM,再等下次中断,不像大侠们的复杂计算公试写进MCU中,要开几个定时器和ADC。

软件实现方法:

定义一个时间数组 time[359]={0,1,2......}  //里面是刚才计算到的脉冲宽度时间和占空比时间  作用:作为定时器溢出值

定义一个Count //溢出次数,溢出360次为一个半周

bit PF //定义正负半标记 bit =0上半周,bit=1下半周

初始化TH0和TL0数值任意定

定时器中断

TH TL=time[Count]  //设定下次的溢出时间

Count++

if (Count==360)  {bit != bit ,Count=0,TH TL=time[0] }    //上下半周设定

if (bit==0) {PORT != PORT}  //送出SPWM信号,要几路送几路  这个是上半周

else{ PORT != PORT}   //送出SPWM信号,要几路送几路  这个是下半周,三相再加个延时处理

大功告成。

简单吧,有空时我写个软件自己生成等数量用于定时器。只要计算一次永久使用,反正大家都在做50HZ的,大家一起计算面积然后共享就可以了。

如有不明可以992001010交流:注 电源网,否则拒加

全部回复(7)
正序查看
倒序查看
2011-02-28 09:16

听起来不错,有空玩玩看!

0
回复
kexie
LV.4
3
2011-02-28 09:18

LZ这个方法很好。但有个问题不明白:若真做220V正弦逆变,如何保证后级输出的正弦电压在接不同负载时稳定在220V?

0
回复
2011-02-28 15:49

用定时器实现确实是可以的,不过现在很多cpu都支持硬件pwm实现的

速度更快,性能也更好

0
回复
2011-02-28 15:57
@kexie
LZ这个方法很好。但有个问题不明白:若真做220V正弦逆变,如何保证后级输出的正弦电压在接不同负载时稳定在220V?
理想状态下只要逆变前的直流保持不变,那么这个输出就不变,实际上可以通过脉宽的比例变化适当的修正
0
回复
sjj_11
LV.3
6
2011-02-28 20:43
@wangshujun
用定时器实现确实是可以的,不过现在很多cpu都支持硬件pwm实现的速度更快,性能也更好

硬件PWM又点样,你也不一样要计算他在什么时候送出PWM,难道他会自己送出不成.

空载和过载要做保护电路,何不用片内的ADC检测桥的限流电阻电压,电压值在不同时做出不同的响应处理.TH TL值+1或-1就可以修正这个问题。再说主频高的CPU未必合适这种电磁场所。端口锁死的事你可能没碰到过。

强磁环境下的好用MCU并不多。我就吃了大亏,我一直用得好好的C8051F系列的U,但用在步进电机电机驱动中就挂掉了,后来不得把整批产品全改成M记的U

0
回复
一只羊
LV.3
7
2011-02-28 20:47
@sjj_11
硬件PWM又点样,你也不一样要计算他在什么时候送出PWM,难道他会自己送出不成.空载和过载要做保护电路,何不用片内的ADC检测桥的限流电阻电压,电压值在不同时做出不同的响应处理.THTL值+1或-1就可以修正这个问题。再说主频高的CPU未必合适这种电磁场所。端口锁死的事你可能没碰到过。强磁环境下的好用MCU并不多。我就吃了大亏,我一直用得好好的C8051F系列的U,但用在步进电机电机驱动中就挂掉了,后来不得把整批产品全改成M记的U

TI 的C28系列就不错。

拿接触器狂短路 电线放在MCU上  连液晶都不乱....

0
回复
2011-08-22 15:47
轻声问一下,那如果是要求是变频输出的呢?
0
回复