搜索
bottom↓
回复: 1

关于AVR 的PWM 正弦波的产生,求教

[复制链接]

出0入0汤圆

发表于 2012-10-8 09:53:42 | 显示全部楼层 |阅读模式
大家好,下面这个程序我是从网上复制过来的,其中用PWM的时候,
用到了 128点正弦波样本值
这个不是很理解,这样就能够产生正弦波了吗,或者外部又加什么电路,能提供电路我看看,谢谢啊
帮忙解答一下。


下面是程序:
/atmega128的定时器实现快速PWM输出示例程序,定时器0溢出中断的方式
//输出PWM波形驱动发光二极管,亮度由暗到灭,呈闪烁状态
//样值采取正弦波公式,示例如下
//正弦波采样值计算公式
//                    f(x)=128+127*sin(2*3.1415*x/127) x=[0....127]
//PWM输出也可通过控制LED发光来直观的看到效果,亮度持续的变化
//可以通过选跳线帽选择是通过LED直接查看还是通过滤波器查看实际波形
//编译环境 AVR Studio 4.17/AVR GCC
//系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms
//作者:张奇  zhangqi123zq@126.com
//日期:
//***********************************************************************
//   包含文件
//***********************************************************************

#include <string.h>
#include <stdio.h>
#define  F_CPU 7372800         // 单片机主频为7.3728MHz,用于延时子程序
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>            //中断信号头文件

//***********************************************************************
//   定义变量区
//***********************************************************************
#define f_count         254                              //0CR0寄存器初始值
#define timer_clk       0x07
#define delay_us(x)     _delay_us(x)         //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)         //AVR GCC延时函数 x(ms)

#define uchar           unsigned char
#define uint            unsigned int
#define ulong           unsigned long


uchar auc_SinParam[128] = {
128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213,
218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254,
254,254,253,252,251,250,248,246,244,241,238,235,232,228,224,220,
215,211,206,201,196,191,185,179,174,168,162,156,150,144,137,131,
125,119,112,106,100,94,88,82,77,71,65,60,55,50,45,41,
36,32,28,24,21,18,15,12,10,8,6,5,4,3,2,2,
2,2,3,4,5,7,9,11,14,16,19,23,26,30,34,38,
43,48,52,57,63,68,74,79,85,91,97,103,109,116,122,128};  // 128点正弦波样本值

uchar x_SW = 8,X_LUT = 0;




//*************************************************************************
//   初始化子程序
//*************************************************************************
void system_init()                                   //IO口初始化
{

  PORTB=0xff;                                       //PB设置为输出
  DDRB=0xff;                                        //上拉电阻无效
}

void timer0_init()                                 //定时器初始化
{
  TCCR0=0x68|timer_clk;                            //快读PWM模式,OC0输出,分频
  OCR0=128;                                        //OCR0比较匹配寄存器值
  TIFR=0x01;                                       //清中断标志位
  TIMSK=0x01;                                      //使能定时器0溢出中断
}


//*************************************************************************
//  定时器0中断服务子程序
//*************************************************************************

ISR(TIMER0_OVF_vect)                  //中断服务程序
{
    X_LUT += x_SW;          // 新样点指针
if (X_LUT > 127) X_LUT -= 128;            // 样点指针调整
OCR0 =auc_SinParam[X_LUT];        // 取样点指针到比较匹配寄存器
}

//*************************************************************************
//  主程序
//*************************************************************************

int main(void)
{
  system_init();                               //系统初始化.PB3输出PWM波形
  timer0_init();                               //定时器0初始化,完成PWM相关配置
  SREG|=0x80;                                  //开启全局中断
  while(1)
  {
  }
}

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-10-14 12:52:42 | 显示全部楼层
单片机出来的PWM是方波,要输出正弦波外部还需要加个低通滤波器,滤去高频信号。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 03:44

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

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