搜索
bottom↓
回复: 23

马潮老师的mega16产生正旋波的问题

[复制链接]

出0入0汤圆

发表于 2010-9-22 09:09:07 | 显示全部楼层 |阅读模式
更新OCR0值的时候  为什么不用匹配中断   为什么用定时器的溢出中断呢  这样的话OCR0的值不能在定时器oxff的时候及时更新 要等到下一次的计数到0xff才能更新  要是用比较比配更改值也就是本次匹配了 然后OCR0的缓冲器中的值是新值  当计数到0xff的时候OCR0的值正好被更新

出0入0汤圆

发表于 2010-9-22 09:12:19 | 显示全部楼层
可以,我做逆变器就是用的匹配中断,25.6k的定时器频率,匹配中断与溢出中断差别不大,除非你的中断里写了太多东西

出0入0汤圆

 楼主| 发表于 2010-9-22 09:40:24 | 显示全部楼层
我感觉匹配中断更好点呵呵

出0入0汤圆

发表于 2010-9-22 14:54:06 | 显示全部楼层
这样的问题非常好,要做质量、性能都是高层次的产品,必须精益求精。

AVR的OCR都配备有一个备份缓冲单元。当工作在PWM方式时,OCR采用双缓冲的方式,此时CPU改变OCR的值,只是写入到OCR的备份缓冲器中,并不影响当前的OCR。等到定时器溢出时(不管使用还是不使用中断),硬件会自动同步的将OCR的备份缓冲单元中的值复制到OCR中。

因此在匹配中断与溢出中断中改变OCR都可以,看具体的需要。当产生的PWM波频率不变的话,而且一直连续产生,采用匹配中断修改OCR比较好。

LZ提到的问题可能会在PWM产生的刚开始,多产生第一个PWM的波,而对后面都是没有影响的。

出0入0汤圆

 楼主| 发表于 2010-9-22 16:22:26 | 显示全部楼层
谢谢马老师了  不过你的输出sin的那个东西我还没完全看明白 我想多看几遍 实在看不懂了再问你
而且一直连续产生,采用匹配中断修改OCR比较好   这个为什么呢

出0入0汤圆

发表于 2010-9-22 16:38:31 | 显示全部楼层
需要考虑的问题少一点。其实一般的应用都可以的。

出0入0汤圆

 楼主| 发表于 2010-9-22 17:33:55 | 显示全部楼层
for(i=0;i<128;i++)
        {
                sin_tab=128+127*sin(2*pai/127*i);//pai是3.14
                Usrat1_Tx(sin_tab);
        }
为什么我用这个生成的128个数据 有些跟你教程的那128个数据不一样呀  不是全部的 是部分
这是我仿真的波形
(原文件名:sin.jpg)

有点像3角波 不大像正旋波

出0入0汤圆

发表于 2010-9-22 17:42:57 | 显示全部楼层
sin_tab=128+127*sin(2*pai/127*i)

你在中断中用sin_tab=128+127*sin(2*pai/127*i)计算,知道这个计算需要多少时间吗?等它算出来,N个PWM周期都过去了。

我的例子是查表,只要读一下就可以了。

出0入0汤圆

 楼主| 发表于 2010-9-22 19:31:06 | 显示全部楼层
我不是在中断中这样的
mega128  内部晶振4m


#include<avr/io.h>
#include<avr/interrupt.h>
#include<math.h>
#include"USRAT.h"
#define pai 3.1415926
unsigned char sin_tab[128]={0};

void pwm_init(void)
{
        DDRB=0xff;
        TCCR0=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<CS00);
        OCR0=128;
        sei();
        TIMSK=0x01;
}

int main(void)
{
        unsigned char i;
        Init_Usrat1();
        for(i=0;i<128;i++)
        {
                sin_tab=128+127*sin(2*pai*i/127);
                Usrat1_Tx(sin_tab);
        }
        pwm_init();       
        while(1);
}



volatile unsigned char x=0;
SIGNAL(SIG_OVERFLOW0)
{
        x=+8;
        if(x>127)
        x-=128;
        OCR0=sin_tab[x];
}

出0入0汤圆

发表于 2010-9-22 20:56:45 | 显示全部楼层
你先使用我书上的表格数据看是否产生正弦波。

你的计算有问题,不是公式问题,可能是数据类型问题
sin_tab=128+127*sin(2*pai*i/127);这个计算中,数据需要变成INT或long int计算,然后再变成char才能正确。估计是你的表格计算错误。

我是在PC上使用VB计算,得到表格,直接放到TAB中的。

出0入0汤圆

发表于 2010-9-22 21:04:55 | 显示全部楼层
点击此处下载 ourdev_584890VP33XC.rar(文件大小:95K) (原文件名:SPWM表生成.rar)
上一spwm表生成程序

出0入0汤圆

发表于 2010-9-22 21:19:19 | 显示全部楼层
不错,我已经使用10楼提供的软件SPWM.EXE,它生成的数据与我书中表格数据相同。

128点/幅值127/直流电平128/起始相位0:

128, 134, 140, 146, 152, 158, 164, 170, 176, 182, 187, 193, 198, 203, 208, 213, 217, 222, 226, 230, 233, 236, 240, 242, 245, 247, 249, 251, 252, 253, 254, 254, 254, 254, 254, 253, 252, 251, 249, 247, 245, 242, 240, 236, 233, 230, 226, 222, 217, 213, 208, 203, 198, 193, 187, 182, 176, 170, 164, 158, 152, 146, 140, 134, 128, 121, 115, 109, 103, 97, 91, 85, 79, 73, 68, 62, 57, 52, 47, 42, 38, 33, 29, 26, 22, 19, 16, 13, 10, 8, 6, 4, 3, 2, 1, 1, 1, 1, 1, 2, 3, 4, 6, 8, 10, 13, 15, 19, 22, 25, 29, 33, 38, 42, 47, 52, 57, 62, 68, 73, 79, 85, 91, 97, 103, 109, 115, 121,

出0入0汤圆

 楼主| 发表于 2010-9-23 09:41:50 | 显示全部楼层
谢谢了  好的我试试  谢谢大家了

出0入0汤圆

 楼主| 发表于 2010-9-23 10:05:09 | 显示全部楼层
我现在用的查表  就是马潮老师的用那个软件生成的数组  但是产生的还是不像正旋波

(原文件名:sin.jpg)

出0入0汤圆

发表于 2010-9-24 09:15:19 | 显示全部楼层
仿真时或直接用示波器查看时,请选择直流档,水平扫描时间加长,即在整个屏幕能看到1个1KHZ的波形,(在本例中相当要看到16个PWM点的输出)

根据你贴的图,好象你选择交流档,这样直流成分就没有了,另外我感觉好象只看到的是3个PWM点的波形。

PWM的输出实际是一个占空比不同的方波。在一个PWM波周期中,输出信号通过RC的低通,高电平时对C充电,低电平时放电。因此一个PWM输出通过低通,其交流分量的变化实际就是一个三角波。而采用PWM方式做DA生成的正弦波实际是电容C上的平均的“直流”电压变化。

如果你的基础非常好的话,(这里是说的理论基础,它包括模拟、数字等全面的基础),通过正确的查看波型,就能知道和估计什么地方出了问题。

如果你在上面仿真中,能一次看到16个相同的三角波,充电和放电的长度都相同,就说明软件上有问题了。

顺便说一下,能给出你上面图中示波器每小格的时间标度值吗?我数一下,一个三角波为6小格。如果这6小格的时间,正好是一个PWM的周期的话,就证明我分析的正确了。

在我教材P262上是实际的测量图,你可以发现,每个周期的正弦波有16个“粗”线段构成,这每个“粗”段就是一个PWM波的输出。如果你把1KHZ的“交流”变化电平去掉,放大看这16个“粗”段的变化,那就是16个三角波,不过他们的上升时间和下降时间应该是不同的。

直流和交流是相对的,直流的定义是电平变化相对缓慢,而交流是电平变化相对快。

出0入0汤圆

发表于 2010-9-24 11:08:46 | 显示全部楼层
ji

出0入0汤圆

发表于 2010-9-24 11:22:40 | 显示全部楼层
注意滤波网络的选择

出0入0汤圆

 楼主| 发表于 2010-9-28 16:14:41 | 显示全部楼层
谢谢大家   我的电脑坏了  等我电脑修好了  我一定好好看看!! 再次非常谢谢马超老师!!和阿莫的其他朋友

出0入0汤圆

 楼主| 发表于 2010-10-1 06:28:55 | 显示全部楼层

(原文件名:sin.jpg) 这个是看好几个周期的效果


(原文件名:sin1.jpg)   这个是一个周期的效果
  就是用mega128 一个pwm采集16个点 然后输出的正旋波的频率是1khz

出0入0汤圆

发表于 2010-10-8 23:36:29 | 显示全部楼层
还是基本的东西没有掌握。

要玩AVR、M051?先评估自己的模电、数电、仪器使用等这些综合的基础是否掌握了。

出0入0汤圆

 楼主| 发表于 2010-10-10 13:00:08 | 显示全部楼层
行 谢谢了  我仔细看看书  我估计就是滤波网络选择的不好

出0入0汤圆

发表于 2011-8-13 19:48:20 | 显示全部楼层
回复【3楼】machao  
-----------------------------------------------------------------------
老师,我看了一下您的程序,发现不能改变频率,如果我要改变频率的话,频率可以通过一个变量或是宏定义改变的话,应该怎么做呢?期待您的回复

出0入0汤圆

发表于 2011-8-14 08:48:15 | 显示全部楼层
关注

出0入0汤圆

发表于 2013-12-29 00:43:48 来自手机 | 显示全部楼层
一个一个开始翻马老师的古董贴  收获颇多
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 16:03

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

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