单片机控制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控制就好了
相似回答