打印

利用SPWM产生跟市电一样的正弦波计算?

[复制链接]
3405|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
action99|  楼主 | 2010-12-11 09:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有个太阳能的项目,要用到SPWM输出通过RC积分产生一个正弦波,曾经用Td=M[1+SIN(@)]公式计算(其中M是CCPL值,取1024;@是角度270~90),每5度就计算出一个CCPL值,共36个数据,进行查表输出SPWM,输出后发现逆变后的效率只有85%,其原因是在同一角度上,积分后输出的正弦波与市电上的正弦波幅度偏小,,主要问题是上面公式不对,请问高手用那个公式才可以计算出正弦波表格?

相关帖子

沙发
airwill| | 2010-12-11 09:46 | 只看该作者
正弦波表格应该没有问题, 但是

1. 每 5° 计算一个值, 是不是太粗糙了?
2. 在 5° 的间隔区域是怎么处理的,  线性插值, 二次插值, 还是就用邻近的值呢?
通常这样的处理也会导致偏小, 如果嫌计算麻烦, 是否对 正弦波做补偿一下?

使用特权

评论回复
板凳
airwill| | 2010-12-11 09:55 | 只看该作者
正弦波表格应该没有问题, 但是

1. 每 5° 计算一个值, 是不是太粗糙了?
2. 在 5° 的间隔区域是怎么处理的,  线性插值, 二次插值, 还是就用邻近的值呢?
通常这样的处理也会导致偏小, 如果嫌计算麻烦, 是否对 正弦波做补偿一下?

使用特权

评论回复
地板
action99|  楼主 | 2010-12-11 10:28 | 只看该作者


上面是采样60个点和36个点分别的波型,36个点的波型是正弦波,但比较瘦,市电的正弦波是肥一些,好象个馒头,

使用特权

评论回复
5
action99|  楼主 | 2010-12-11 10:32 | 只看该作者
有一个公式Td=M*[1+SIN(2PI*K/N)],,,Td是数据表,M是CCPL的值1024,K是第几次采样,N这里取用60次,但算出来的结果就不准的

使用特权

评论回复
6
action99|  楼主 | 2010-12-11 11:41 | 只看该作者
如下程序是我从网上找来的一个例子,是否用如下公式算出来的?其中π这个数是取PI吗?

200个点的正弦表就是峰值为400的标准正弦表,其数组内的spwm[x]的计算公式是400-sin(π*x/200)*400。

  
#include<iom8v.h>  
#include<macros.h>  
#define uchar  unsigned char   
unsigned short spwm[200]={ 400,399,399,398,397,396,394,393,391,389,  
                           387,385,382,380,377,374,371,367,364,360,  
                         356,352,348,344,339,335,330,325,320,315,  
                        310,304,299,294,291,285,279,274,268,262,  
                        256,250,247,241,231,228,222,216,209,203,  
                        201,200,199,199,198,198,197,196,194,193,  
                        191,189,187,185,182,180,177,174,170,167,  
                        164,160,156,152,148,144,139,135,130,125,  
                        120,115,110,104, 99, 94, 88, 82, 76, 71,  
                         65, 59, 53, 47, 41, 34, 28, 22, 16,  9,  
                          3,  1,  6, 13, 19, 25, 31, 37, 44, 50,  
                         56, 62, 68, 74, 79, 85, 91, 96,102,107,  
                        112,118,123,127,132,137,141,146,150,154,  
                        158,162,165,169,172,175,178,181,184,186,  
                        188,190,192,194,195,196,197,198,199,199,  
                        200,200,206,213,219,225,231,237,244,250,  
                        256,262,268,274,279,285,291,296,302,307,  
                        312,318,323,328,332,337,341,346,350,354,  
                        358,362,365,369,372,375,378,381,384,386,  
                        388,390,392,394,395,396,397,398,399,400};  
                                   /*{201,212,225,237,250,262,274,285,296,307,318,327,337,346,354,//带直流分量的正弦波  
                  362,369,375,381,386,390,394,396,398,400,398,396,  
                                  394,390,386,381,375,369,362,354,346,337,327,318,307,296,285,  
                                  274,262,250,237,225,212,201,187,175,163,150,138,126,115,104,  
                                  93,82,73,63,54,46,38,31,25,19,14,10,6,4,2,0,0,0,0,0,2,4,6,10,  
                                  14,19,25,31,38,46,54,63,73,82,93,104,115,126,138,150,163,175,187};*/  
                  
unsigned int  k=0;  
   
                                                   
//****************系统初始化***************************  
void timer1_init(void)  
  {  
   TCCR1B=0x00;   //清零      
   TCNT1=0x0000;  //计数器赋初值  
   OCR1A=0xc8;   //A路比较值(***OCR1A/OCR1B中的值不得超过ICR1的值***)  
   ICR1=0x0190;  //400,即8khz      
     //改变频率-ICR1(反比)  
   TCCR1A=0xA2;  
   TCCR1B=0x13 ;  //无预分频   8分频  
  }  
   
//---------------------------------------------------  
//*****************主程序*********************************  
//---------------------------------------------------------  
#pragma interrupt_handler timer1_ovf_isr:7  
#pragma interrupt_handler timer1_ovf_isr:8  
/*---------------------------------------------------------*/  
//***********定时器T1中断程序***************************  
/*---------------------------------------------------------*/  
uchar i=0;  
void timer1_ovf_isr(void)  
  {     
   OCR1A=spwm[i++]; //重新赋初值  
   if(i>=200)  
   {  
          i=0;   
   }  
     
  }  


void main(void)  
  {   
          unsigned int top=0x0190;//////0x258;0x002c;0x0050;  
           DDRB=0xFF;  
        PORTB=0xff;  
        timer1_init();      //初始化定时器T1  
        TIMSK=0x18;         //开比较中断   
        SEI();                                 //开全局中断  
        OCR1A=0;  
    while (1)  
    {  
         
           
    }  
  }

使用特权

评论回复
7
action99|  楼主 | 2010-12-12 16:49 | 只看该作者
自己顶一个

使用特权

评论回复
8
lucky_ytc| | 2010-12-14 09:51 | 只看该作者
你用的是什么单片机? 7# action99

使用特权

评论回复
9
lucky_ytc| | 2010-12-14 09:58 | 只看该作者
STC? 7# action99

使用特权

评论回复
10
yewuyi| | 2010-12-14 10:20 | 只看该作者
太糙了,不能并网。

使用特权

评论回复
11
p1838222| | 2010-12-14 10:35 | 只看该作者
这个题。。。

使用特权

评论回复
12
SLEET1986| | 2010-12-14 15:13 | 只看该作者
波形是不怎么好,波形怎么修正呢。。

使用特权

评论回复
13
action99|  楼主 | 2010-12-16 13:45 | 只看该作者
本帖最后由 action99 于 2010-12-16 13:49 编辑

我用的是PIC18F1320的单片机,先要检查AC的同步信号然后再输出SPWM,10位的CCPL,这样我要计算出跟AC一样的正弦波计算公式是怎么样?我简单的用Td=M[1+SIN(@)]公式计算(其中M是CCPL值,取1024;@是角度270~90)计算出来功率只有80%,请问如何是好?

使用特权

评论回复
14
action99|  楼主 | 2010-12-16 14:22 | 只看该作者
经过调试,如果输出一个跟4楼(上图)一样的波形时输出功率只有0.75,如果输出一个好象馒头波跟AC一样的波形后功率就超过0。98,这就说明如果在Td同一时间里,馒头波的幅度比4楼(上图)的波形要高,效率自然就高,这样对吗,,,明天我把载图上来让大家一起讨论一下,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

189

帖子

2

粉丝