#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