马潮老师的mega16产生正旋波的问题
更新OCR0值的时候为什么不用匹配中断 为什么用定时器的溢出中断呢这样的话OCR0的值不能在定时器oxff的时候及时更新 要等到下一次的计数到0xff才能更新要是用比较比配更改值也就是本次匹配了 然后OCR0的缓冲器中的值是新值当计数到0xff的时候OCR0的值正好被更新 可以,我做逆变器就是用的匹配中断,25.6k的定时器频率,匹配中断与溢出中断差别不大,除非你的中断里写了太多东西 我感觉匹配中断更好点呵呵 这样的问题非常好,要做质量、性能都是高层次的产品,必须精益求精。AVR的OCR都配备有一个备份缓冲单元。当工作在PWM方式时,OCR采用双缓冲的方式,此时CPU改变OCR的值,只是写入到OCR的备份缓冲器中,并不影响当前的OCR。等到定时器溢出时(不管使用还是不使用中断),硬件会自动同步的将OCR的备份缓冲单元中的值复制到OCR中。
因此在匹配中断与溢出中断中改变OCR都可以,看具体的需要。当产生的PWM波频率不变的话,而且一直连续产生,采用匹配中断修改OCR比较好。
LZ提到的问题可能会在PWM产生的刚开始,多产生第一个PWM的波,而对后面都是没有影响的。 谢谢马老师了不过你的输出sin的那个东西我还没完全看明白 我想多看几遍 实在看不懂了再问你
而且一直连续产生,采用匹配中断修改OCR比较好 这个为什么呢 需要考虑的问题少一点。其实一般的应用都可以的。 for(i=0;i<128;i++)
{
sin_tab=128+127*sin(2*pai/127*i);//pai是3.14
Usrat1_Tx(sin_tab);
}
为什么我用这个生成的128个数据 有些跟你教程的那128个数据不一样呀不是全部的 是部分
这是我仿真的波形http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_584869HQ97T2.jpg
(原文件名:sin.jpg)
有点像3角波 不大像正旋波 sin_tab=128+127*sin(2*pai/127*i)
你在中断中用sin_tab=128+127*sin(2*pai/127*i)计算,知道这个计算需要多少时间吗?等它算出来,N个PWM周期都过去了。
我的例子是查表,只要读一下就可以了。 我不是在中断中这样的
mega128内部晶振4m
#include<avr/io.h>
#include<avr/interrupt.h>
#include<math.h>
#include"USRAT.h"
#define pai 3.1415926
unsigned char sin_tab={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;
} 你先使用我书上的表格数据看是否产生正弦波。
你的计算有问题,不是公式问题,可能是数据类型问题
sin_tab=128+127*sin(2*pai*i/127);这个计算中,数据需要变成INT或long int计算,然后再变成char才能正确。估计是你的表格计算错误。
我是在PC上使用VB计算,得到表格,直接放到TAB中的。 点击此处下载 ourdev_584890VP33XC.rar(文件大小:95K) (原文件名:SPWM表生成.rar)
上一spwm表生成程序 不错,我已经使用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, 谢谢了好的我试试谢谢大家了 我现在用的查表就是马潮老师的用那个软件生成的数组但是产生的还是不像正旋波
http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_584959FNWJTW.jpg
(原文件名:sin.jpg) 仿真时或直接用示波器查看时,请选择直流档,水平扫描时间加长,即在整个屏幕能看到1个1KHZ的波形,(在本例中相当要看到16个PWM点的输出)
根据你贴的图,好象你选择交流档,这样直流成分就没有了,另外我感觉好象只看到的是3个PWM点的波形。
PWM的输出实际是一个占空比不同的方波。在一个PWM波周期中,输出信号通过RC的低通,高电平时对C充电,低电平时放电。因此一个PWM输出通过低通,其交流分量的变化实际就是一个三角波。而采用PWM方式做DA生成的正弦波实际是电容C上的平均的“直流”电压变化。
如果你的基础非常好的话,(这里是说的理论基础,它包括模拟、数字等全面的基础),通过正确的查看波型,就能知道和估计什么地方出了问题。
如果你在上面仿真中,能一次看到16个相同的三角波,充电和放电的长度都相同,就说明软件上有问题了。
顺便说一下,能给出你上面图中示波器每小格的时间标度值吗?我数一下,一个三角波为6小格。如果这6小格的时间,正好是一个PWM的周期的话,就证明我分析的正确了。
在我教材P262上是实际的测量图,你可以发现,每个周期的正弦波有16个“粗”线段构成,这每个“粗”段就是一个PWM波的输出。如果你把1KHZ的“交流”变化电平去掉,放大看这16个“粗”段的变化,那就是16个三角波,不过他们的上升时间和下降时间应该是不同的。
直流和交流是相对的,直流的定义是电平变化相对缓慢,而交流是电平变化相对快。 ji 注意滤波网络的选择 谢谢大家 我的电脑坏了等我电脑修好了我一定好好看看!! 再次非常谢谢马超老师!!和阿莫的其他朋友 http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586886TFR81U.jpg
(原文件名:sin.jpg) 这个是看好几个周期的效果
http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586887OIOS2W.jpg
(原文件名:sin1.jpg) 这个是一个周期的效果
就是用mega128 一个pwm采集16个点 然后输出的正旋波的频率是1khz 还是基本的东西没有掌握。
要玩AVR、M051?先评估自己的模电、数电、仪器使用等这些综合的基础是否掌握了。 行 谢谢了我仔细看看书我估计就是滤波网络选择的不好 回复【3楼】machao
-----------------------------------------------------------------------
老师,我看了一下您的程序,发现不能改变频率,如果我要改变频率的话,频率可以通过一个变量或是宏定义改变的话,应该怎么做呢?期待您的回复 关注 一个一个开始翻马老师的古董贴收获颇多
页:
[1]