单片机控制DAC0832如何实现正弦波频率变化?

我想看到一个实例程序作为参考,希望大神能提供一个,要c语言的

第1个回答  2012-10-31
#include<msp430g2553.h>
#include<math.h>
unsigned char sin_tab[256]={0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E};
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0xff;
P2DIR |= 0xff;

unsigned int a;

//P2数据 P1.0 CS P1.1 WR

P2OUT &=~(BIT0+BIT1); //CS WR
P1OUT = 0xff;

while(1)
{
for(a=0;a<256;a++)
{
//可在此处添加定时器延时来改变正弦波频率

P1OUT = sin_tab[a];
}

}

}

这个是我自己写的msp430G2553的程序,如果你不是用430也可以参考下,大概思路就是把一组IO口作为数字信号输入给DA , 程序里面先存好正弦表,将正弦波依次赋给该组IO口,多少个点自己看精度要求,256个点其实是没必要的。。我记得20—30个点就已经出来很不错的正弦波了。大不了再过个滤波器。追问

关键是定时器该怎么写?如果你能写出来就给你最佳

追答

我的意思就是把输出P1OUT = sin_tab[a];这一步放到定时器里面做,每次进入定时器中断时输出一个值。 你给定时器赋的初值就决定了输出两个点的间隔时间,再换算一下就是周期。
以下程序只是我的想法, 没经过实测。
TACCR0 = 1; // 假设频率为8M 则定时器间隔1为1/8M 假设你的正弦表是20个点 那么输出周期就是20/8M 输出频率就是 400KHz
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TACCR0_ISR()
{
i++;
P1OUT = sin_tab[i];

if(i==20) i=0;

}

仅供参考。。 理论上应该能行 但实际肯定达不到400k

第2个回答  2012-10-30
DAC0832只是个数模转换芯片,所有数据都是你单片机送出来的,所以频率幅度什么都是你单片机计算好送出来,DAC0832只负责把数据转换成模拟的电压信号。追问

你能提供一个实例程序吗?

追答

我这没有,你可以网上找找。

本回答被网友采纳
第3个回答  2012-10-30
这个根据你的要求 要有相应的正弦表吧 然后根据采集你的正弦表的间隔来该频率 比如你的正弦表是512点的 你把每个点都采集出来的频率是f
如果你间隔一个点采集一个数据 那么频率就是f/2
同理可以得到不同频率的点追问

我想要个实例程序,大体方向我也知道,但是程序不知道怎么写

追答

我没写过用dac产生的正弦波 你可以去网上找找应该有很多 其实如果实际中用的话 我还是建议你用dds产生正弦波

第4个回答  2019-09-29
在单片机里面存储一个正弦表,一个一个数值发给dac0832控制就好了

如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的...
假设你把一个正弦波的一周期分成180个点,那么每个点相差是2度,那么每个点是有一个对应的SIN值的,比如SIN0 SIN2 SIN4等。假设1ms发送一个点(即单片机向DA写一个该SIN值所对应的电压大小), 那么写完一个正弦波,要180ms。如果2ms写一个点,这就改变了正弦波的频率了。一周期所分的点越...

用DAC0832作正弦波发生器,生成正弦波,怎么选取数字值?计算正弦波大小...
DA生成的信号是离散的。假设生成一个Y=Asin(2*pi*f*t)的正弦波,AD的数据端口给了256个数字,0~255.假设0~127表示X轴上方的电压值,其余的表示下方。则得到数据端口的数值的具体量。VALUE=127sin(2*pi*f*t)+127.参考资料:myself

DAC0832+单片机输出正弦波频率最大值问题
DAC0832转换时间为1uS。采用单片机控制的话,转换速度已经够快了,采用查表法输出,假设单片机主频为1MHz(传统51,晶振12MHz为例),那么,采用汇编语言的话,效率较高的话,输出一个数据点大约需要20uS。假设一个周期输出64个数据点,大约1280uS,大约可输出1kHz的频率。如果采用较高速度单片机(如AVR系...

51 单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程 ...
sbit DA_S1= P2^0; \/\/ 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存 sbit DA_S2= P2^1; \/\/ 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存 sbit key= P3^2;uchar wavecount; \/\/'抽...

利用单片机怎么产生正弦波信号
单片机 外接AD转换芯片 再加运放 通过一定的控制程序就可产生正弦波。实现方法:1、通过单片机DA来实现,需要通过查表法;2、通过PWM方式实现;不过都需要加硬件滤波电路来实现正弦波的平滑。

单片机汇编程序实现DA转换,用DAC0832芯片实现
\/\/0832各种波型输出演示 \/\/P1.1P1.0 = 00时 正弦波 \/\/P1.1P1.0 = 01时 锯齿波 \/\/P1.1P1.0 = 10时 方波 \/\/P1.1P1.0 = 11时 三角波 \/\/需要连接的导线:\/\/(1)译码器Y0接DAC0832的CS \/\/(2)P3.6即XWR插孔接DAC0832的WR \/\/(3)8芯的排线连接8排针的P0口...

利用单片机和DAC0832控制输出方形波,锯齿波,三角波,并通过示波器显示...
单片机和DAC0832控制输出方波,锯齿波,三角波,正弦波。include<at89x51.h> \/\/unsigned char TIME0_H=0xec,TIME0_L=0x78; \/\/定时器0的初值设置;全局变量 include<sinx.h> include<0832.h> void main(){ TMOD=0X01;TH0=0xff;TL0=0xd9;IT0=1; \/\/设置中断触发方式,下降沿 EA=1...

51单片机和DAC0832制作可调频的信号发生器
256个点,DAC0832速率为1us左右,理论上频率可以达到1M\/256=3906HZ。但实际上受器件影响,不一定达到这么高的频率。不过由于你用的是51单片机,12T的模式,执行指令的速率非常低,所以真正影响频率的首先不是DAC0832,而是单片机。因相对于DAC0832的速率,单片机的速率慢了很多,所以单片机的速率是跟不上...

怎么用单片机产生2路正弦波信号相位相差120度(用2片dac0832)
提供一点思路,用两个定时器产生PWM信号,第一个定时器工作到交流电半周期的三分之二启动第二个定时器。

用两片DAC0832和单片机实现信号发生器,如何搭接电路
波形和频率的改变通过软件控制,幅度的改变通过硬件实现。介绍了波形的生成原理、硬件电路和软件部分的设计原理。本系统可以产生最高频率798.6HZ的波形。该信号发生器具有体积小、价格低、性能稳定、功能齐全的优点。DAC0832是8分辨率的D\/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口...

相似回答