搜索
bottom↓
回复: 43

本论坛没有哪一个帖子完整讲过由SPWM得到正弦波(f,v)的频率和幅值有哪些因素(条件)

[复制链接]

出0入0汤圆

发表于 2008-11-3 21:26:14 | 显示全部楼层 |阅读模式
本论坛没有哪一个帖子完整讲过由SPWM得到正弦波(f,v)的频率和幅值有哪些因素(条件)决定?还有那个R和C取多大?怎么取?



比如说具体下面这些值怎么来的:

sin_table[]={0,1,2,3,4,6,7,9,11,13,16,18,21,24,27,30,34,37,41,45,49,53,57,62,66,71,76,80,85,90,95,100,105,110,115,121,126,133,136,143,146,154,157,163,167,173,176,183,186,192,195,204,209,212,217,220,224,227,230,234,237,239,241,244,246,248,250,251,252,254,255,255,255,255,254,252,251,246,248,246,244,241,239,237,234,230,227,224,220,217,212,209,204,195,192,186,183,176,173,167,163,157,154,146,143,138,136,133,126,121,115,110,105,100,95,90,85,80,76,71,66,62,57,53,49,45,41,37,34,30,27,24,21,18,16,13,11,9,7,6,4,3,2,1,0}; //145 point 

unsigned char step=8,id = 0; 



本贴被 hetao7241 编辑过,最后修改时间:2008-11-04,06:35:47.

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-1-30 22:10:50 | 显示全部楼层
学习了,这个可以做可调信号源吧

出0入0汤圆

发表于 2008-12-3 15:55:57 | 显示全部楼层
145个点中没有大于255的不知道是怎么计算出来的,仿真了一下波形挺好的

出0入0汤圆

发表于 2008-12-3 15:46:07 | 显示全部楼层
不知道一楼所述的145个点的样本表是怎么来的

哪个高人给指点指点

出0入0汤圆

发表于 2008-12-3 08:46:03 | 显示全部楼层
23楼的朋友,用你的计算表计算出来结果的和上面列举的例子不一样怎么?

请核实一下啊

出0入0汤圆

发表于 2008-11-6 12:26:09 | 显示全部楼层
多谢楼上的兄弟,呵呵,

老黄牛哥哥的办法也不错,

在单片机上电复位之后,用程序计算sin(π*x/200)*128+128 这个公式,然后保存,现在这些片子RAM很大,不用白不用,呵呵。

出0入0汤圆

发表于 2008-11-6 09:19:33 | 显示全部楼层
自用的 SPWN计算表。可调整参数:采样点数、摆幅、中值。

点击此处下载 ourdev_485524.xls(文件大小:48K) (原文件名:公式表2.xls) 

出0入0汤圆

发表于 2008-11-5 21:55:31 | 显示全部楼层
【20楼】 zhangna_901887



如果你的单片机RAM和FLASH够的话,在SPWM程序执行之前,就用sin(π*x/200)*128+128这个公式,把这些点计算出来,用个数组存起来,然后就可以用了。

出0入0汤圆

 楼主| 发表于 2008-11-5 21:22:57 | 显示全部楼层
谢谢马老师,你的书上册我早就买了,现在都翻旧了,你的"下册"我还没有买了.看来还得去买一本,学习补充.

出0入0汤圆

发表于 2008-11-5 16:53:10 | 显示全部楼层
sin(π*x/200)*128+128



哪位哥们用Excel软件将这个公式做出来,估计要方便很多,可惜我对Excel软件不熟,呵呵!

出0入0汤圆

发表于 2008-11-5 14:09:01 | 显示全部楼层
在我编写的教程中,就已经有一个采用PWM产生1KHz正弦波的例子。



你仔细参考,如果你的基础扎实的话,其实不需要多少,只要是真正明白了,你所提的问题就都能解决。



1。正弦波的样本表到底应该是多少点,与你需要产生正弦波的频率,以及PWM的速度(系统速度)有关。如果来得及,可以多取几个点,这样提高产生正弦波平滑性。样本的点可以多些,但实际使用可以根据需要从中平均抽取使用。



2。注意的是正弦波的样本点是含直流电平的,因为单片机等输出是0-5V范围。因此PWM的输出经过RC滤波和一个电容后就成为无直流分量的正弦波了。16楼说的对,正规使用时,后面使用运放就可以实现正负输出,这已经是模拟电路的基础了。



3。正弦波的样本表中每个点的最大值应该是多少,也需要考虑。如果是8位,那就是255;16位就是65535。最大值高,产生正弦波的精度就高,但需要系统的处理速度要更快,因为16位的处理比8位的处理,需要更多的时间和资源。如果你要产生高频率的正弦波,又要正弦波平滑性好(用点多),还要精度高16位,你的系统速度就必须要高。这三者之间需要一个平衡。



4。以8位样本点举例,最大值为255,那么128就是直流分量的值(2.5v),0-128为正弦波的负半周期,128-255为正弦波的正半周期。幅度为2.5v。所以可以通过该公式计算出样本表:sin(π*x/200)*128+128。里面200是样本的点的个数。



5。如果你知道PWM的原理,那么能知道应该如何改变输出正弦波的频率和幅度了。具体留给各位在学校里面也是好好读书的学生们思考讨论吧。

出0入0汤圆

发表于 2008-11-5 12:58:35 | 显示全部楼层
如果要作得好,就要吃理论。视用途。

原理很简单。但不同的要求有不同的实现方法。我也准备实验一下。

出0入0汤圆

发表于 2008-11-5 12:49:08 | 显示全部楼层
学过积分就应该会计算SPWN值,及调幅。

实际计算时完全可以不用积分,计算方法其实很简单。



实现正负输出:

建议先把单片机输出变成正负,然后再LPF。

出0入0汤圆

发表于 2008-11-5 12:19:06 | 显示全部楼层
hetao7241:



 你提到的这个贴子我看了,如果串了一个隔直的电容,输出就会是交流的了,但是,建议不要串电容。

 这个帖子的最后,是我留的言,建议是用一个运放来实现正负输出。



 仙猫说的是用Excel软件也可以计算出SPWM的点的表格,即便是D版的Excel软件也可以计算出来的。



 其实9楼把计算方法和规则已经说的很明白了。我想LZ是应该能够理解的。

出0入0汤圆

 楼主| 发表于 2008-11-5 12:07:31 | 显示全部楼层
楼上怎么个算法,什么版?

出0入0汤圆

发表于 2008-11-5 08:50:20 | 显示全部楼层
这张表,用Excel算一下就出来了,D版的也行。 :)

出0入0汤圆

 楼主| 发表于 2008-11-5 07:13:30 | 显示全部楼层
楼上非常感谢你!但最后一点:从单片机里面出来的信号都是>0V的,这个是对的,形成的SPWM也是>0V的 ,不是有正有负的信号,这一点就不对了,你可以硬件做实验或软件模拟都能证明.我发过这个帖子,有工程师利用这个成功用在产品上.

在这个地方我发过:

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=441416&bbs_page_no=1&search_mode=1&search_text=spwm&bbs_id=9999

出0入0汤圆

发表于 2008-11-4 19:34:46 | 显示全部楼层
LS,9楼的RC计算方法基本是可以的,主要就是根据你的SPWM的点数和输出的频率来决定。

对于输出来说,最好再通过一级跟随,这样就可以加大输出的驱动。

还有,从单片机里面出来的信号都是>0V的,形成的SPWM也是>0V的 ,不是有正有负的信号。

本贴被 ywl0409 编辑过,最后修改时间:2008-11-04,19:36:47.

出0入0汤圆

 楼主| 发表于 2008-11-4 11:59:57 | 显示全部楼层
楼上提供了一条路,感谢!实际上我需要产生一个400HZ的正弦波,对这种采用PWM方法希望学习学习,我想其他单片机爱好者对这些东西也会感兴趣的。这毕竟是比较好的方法。

本贴被 hetao7241 编辑过,最后修改时间:2008-11-04,12:07:33.

出0入0汤圆

发表于 2008-11-4 11:07:36 | 显示全部楼层
建议楼主看ATMEL的应用手册AVR494-AC Induction Motor Control Using the constant Natural PWM Algorithm,算是完整的一套SPWM应用方案。

出0入0汤圆

发表于 2008-11-4 10:59:19 | 显示全部楼层
后一种200个点的正弦表就是峰值为400的标准正弦表,其数组内的spwm[x]的计算公式是400-sin(π*x/200)*400。

而前一种好像用了个快速SPWM算法,但查不到具体是什么东西。



关于RC取值,一阶RC滤波的输入端如果从0V跃迁到1V,大概要经过4RC的时间输出端会达到0.98V,所以最小电压改变时间间隔一般为4RC。因此对于半周期取点为200的SPWM,滤波RC值<=T/2/200/4。T为正弦波周期。这是我的初步理论推导,有什么问题请高手指正。

本贴被 ilcvm 编辑过,最后修改时间:2008-11-04,12:03:31.

出0入0汤圆

 楼主| 发表于 2008-11-4 10:29:44 | 显示全部楼层
麻烦【7楼】 ywl0409 老黄牛,请你讲一下吧,其实我在学校里面也是好好读书的学生,但比较菜.谢谢ywl0409 老黄牛!



这是本坛里的一些例子:

1.来自:http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=441416&bbs_page_no=1&search_mode=1&search_text=spwm&bbs_id=9999



 小妹刚用Atmega16L写程序来实现spwm(采用的是快速SPWM方式),按常规思路,从芯片的PB3输出信号为只有正值的SPWM信号,而且经过一RC低通滤波之后,确实为非常标准的正弦信号,但仔细分析才发现,SPWM信号与滤波后sin信号已经是有正有负的了,也就是说,从mega16L的PB3输出信号也就含有了负信号,无需做处理,这样正确吗?是不是mega16L 内部已经做了这部分功能, 请求高手指点论证,谢谢 





#include<avr/io.h> 

#include<stdio.h> 

#include<avr/interrupt.h> 

#include<avr/signal.h> 

#include<avr/sleep.h> 

#include<avr/eeprom.h> 



#define PWMOUT PD5 

#define PWMOUTB  PD4 

#define OCR OCR1A 

#define OCRB OCR1B 

#define PORTPWMOUT DDRD 



unsigned char  



sin_table[]={0,1,2,3,4,6,7,9,11,13,16,18,21,24,27,30,34,37,41,45,49,53,57,62,66,71,76,80,85,90,95,100,105,110,115,121,126,133,136,143,146,154,157,163,167,173,176,183,186,192,195,204,209,212,217,220,224,227,230,234,237,239,241,244,246,248,250,251,252,254,255,255,255,255,254,252,251,246,248,246,244,241,239,237,234,230,227,224,220,217,212,209,204,195,192,186,183,176,173,167,163,157,154,146,143,138,136,133,126,121,115,110,105,100,95,90,85,80,76,71,66,62,57,53,49,45,41,37,34,30,27,24,21,18,16,13,11,9,7,6,4,3,2,1,0}; //145 point 

unsigned char step=8,id = 0; 



void init(void) 

{ 

    DDRB |= 0x08; 

    OCR0  = 128; 

    TIMSK = 0x02; 

    TCCR0 = 0x68; //enable it out of work 

    sei(); //置位全局中断 

} 

int main(void) 

{ 

  init(); 

  while(1) 

  { 

      TCCR0 = 0x69; //enbale it work 

   } 

} 



SIGNAL(SIG_OUTPUT_COMPARE0) 

{ 



    OCR0 = sin_table[id ++]; 

    if( id ==145) 

    id =0; 

} 





2.来自:

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=539211&bbs_page_no=1&search_mode=1&search_text=spwm&bbs_id=9999

我做了一个spwm的程序,效果还可以。可以参考一下。 

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

    { 

         

          

    } 

  } 

出0入0汤圆

发表于 2008-11-4 09:59:03 | 显示全部楼层
其实这些内容都是很基本的,只要是在学校里面好好读书的学生,一般都是应该能够计算出来的。

出0入0汤圆

发表于 2008-11-4 09:58:52 | 显示全部楼层
楼主最好说明你这个表是从那来的?这个正弦表应该跟某些算法结合在一起,需要更多的信息才能知道如何得出。

出0入0汤圆

发表于 2008-11-4 09:50:59 | 显示全部楼层
这个坛子里还没有兄弟说过SPWM完整的,最近看到很多相关的SPWM的帖,期待高手作个详细的范例写出了,支持!

出0入0汤圆

发表于 2008-11-4 09:30:44 | 显示全部楼层
是的,要支持

本贴被 myworkmail 编辑过,最后修改时间:2008-11-04,09:31:20.

出0入0汤圆

 楼主| 发表于 2008-11-4 09:23:42 | 显示全部楼层
大家进来看看呀,支一下招!

出0入0汤圆

 楼主| 发表于 2008-11-4 06:36:15 | 显示全部楼层
顶上去.
头像被屏蔽

出0入0汤圆

发表于 2008-11-4 00:52:33 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2009-7-25 14:23:12 | 显示全部楼层
学习了  谢谢

出0入0汤圆

发表于 2009-8-20 23:36:03 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-9-18 19:09:43 | 显示全部楼层
mark

出110入26汤圆

发表于 2009-11-20 09:24:03 | 显示全部楼层
mark…

出0入0汤圆

发表于 2009-12-16 20:07:04 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-3-10 10:42:14 | 显示全部楼层
hehe  有来学习了

出0入0汤圆

发表于 2011-1-7 13:45:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-23 00:50:17 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-17 19:19:58 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-18 07:26:19 | 显示全部楼层
SPWM的波形应该是:1.周期固定,但占空比随时间变化的PWM?(体现在示波器上是上升沿固定,下降沿左右摆动?)  

         2.周期固定,占空比也随时间变化。但体现在示波器上是一组稳定的等周期,但不等占空比的脉冲?

哪种呢?

出0入0汤圆

发表于 2011-5-13 12:33:50 | 显示全部楼层
回复【23楼】ZealotNH 发仔
-----------------------------------------------------------------------

这个《公式表2.xls》很不错,但是算法有问题,计算点数>200点数据表就会偏差很大,波形也可以看到明显失真。各位使用的时候要注意。
要想得到真确的修正SPWM值,算法需作如下修改:修正SPWM=(原始SPWM+中值)(四舍五入保留整数)。

出0入0汤圆

发表于 2011-5-13 15:46:39 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-7-8 22:38:58 | 显示全部楼层
mark,终于找到了ma老师了

出0入0汤圆

发表于 2012-7-8 23:55:41 来自手机 | 显示全部楼层
不错,学习啦!

出0入0汤圆

发表于 2013-9-27 11:10:23 | 显示全部楼层
很好,很强大,谢谢咯。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表