本帖最后由 地瓜ing 于 2014-5-10 23:31 编辑
做课程设计,刚刚接触430,好多地方不熟,请教大神。下面是我用169写的一个DAC12产生正弦波的程序,下面的程序基本上能够产生一个正弦波,但是如果我打开XT2,就完全不能产生波形,但如果MCLK和SMCLK用DCO就不会出现问题,最起码能够产生波形,TB0用得是ACLK,是不是我哪里写错了,都两天了,实在是找不出原因,求大神指教
#include <msp430x16x.h>
#include <math.h>
double x=0,sina;
/***********************************
时钟源选择
************************************/
/* 只能将其注释掉void InitClk(void)
{
unsigned int iq0;
//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); //延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); //判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
}*/
/**********************************
DAC12初始化
***********************************/
void initDAC12_0(void)
{
ADC12CTL0=REF2_5V+REFON; //打开内部基准电压2.5V
DAC12_0CTL|=DAC12CALON; //启动校验DAC
while((DAC12_0CTL&DAC12CALON)!=0)
{
_NOP();
}
//控制寄存器设置
DAC12_0CTL= DAC12IR + DAC12AMP_5 + DAC12ENC+DAC12LSEL_1 ;
//满量程为参考电压,中速度/电流输出,12位分辨率,Vref+为参考电压
DAC12_0DAT=0x00;
}
/***************************************************
TB初始化
***************************************************/
void TB_Init(void)
{
TBCTL=TBSSEL_1+TBCLR+MC_1; //选择时钟源为ACLK // MCLK, up mode
TBCCR0=328; // 定时
TBCCTL0=CCIE; //开CCR0中断
}
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0(void) //定时器中断函数
{
//输出正弦波
if(x<365)
x++;
else
x=0;
sina=0xFFF*sin(x);
DAC12_0DAT=sina;
}
/*************************
主函数
**************************/
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD; //管狗
//InitClk(); //系统时钟初始化
BCSCTL2 =SELM_0+(~SELS); //MCLK,SMCLK选DCO,
initDAC12_0(); //DAC12初始化
TB_Init(); //定时器B初始化
_EINT(); //开总中断
LPM3;
}
此帖出自
小平头技术问答
一周热门 更多>