微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用MSP430内部DAC产生正弦信号

利用MSP430内部DAC产生正弦信号

时间:12-01 来源:互联网 点击:

float ADC_opera(void)
{
unsigned long temp=0;
float voltage;
for(unsigned char i=0;i{
temp +=results[i];
}
voltage=((temp/Num_of_Results)*3.3/4095);
return voltage;
}
/******************************************************************************
* 函数名: __interrupt void ADC12ISR (void)
* 功 能: ADC12 中断服务函数
* 参 数: 无
* 返回值: 无
******************************************************************************/
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
switch(__even_in_range(ADC12IV,34))
{
case 6: // ADC12IFG0
results[index] = ADC12MEM0; //
index++; //

if (index == 8)
{
index = 0;
}
default: break;
}
LPM1_EXIT;
}
-----------------------------------------------------------------------------------------------------------------

这张图片在我学习过程中帮了不少忙,程序看不懂了,可以来看看这些,或许会有些收获,本人是学集成电路设计的,觉得很有帮助。

下面贴些自己的测试程序,别小看这几行程序啊,可是我测试N次的出来的

#include "msp430x14x.h"

void InitADC12();

unsigned char wait;

int main( void )

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

InitADC12();

return 0;

}

void InitADC12()

{

//_DINT();

ADC12CTL0 &= ~ENC; //只有在ENC复位的情况下才能对ADC12CTL0、1进行设置!!!这点很重要哦!!!

ADC12CTL0 = MSC + REFON + REF2_5V + SHT0_15 + SHT1_15;

/*MSC:多次采样转换位,只对序列采样或者多次多次转换有效。

0:采样定时器需要SHI信号的上升沿触发

1:首次需要采样定时器SHI信号触发,之后的转换在上次转换之后随即开始。*/

ADC12CTL1 |= SHP + CONSEQ_0;

/*SHP: 1:采样信号源自采样定时器 0:采样信号源自采样输入信号

CONSEQ: 0: 单通道单次转换 1:序列通道单词转换 2:单通道多次转换 3:序列通道多次转换

CSTARTADD_x(0~15):转换起始位置 */

ADC12MCTL0 = EOS + SREF_0 + INCH_7;

/* EOS:序列结束位

SREF: 参考电压选择

INCH:模拟输入通道选择 */

ADC12IE |= 0x0001;//开相应模拟通道中断,转换完毕后引发中断

_EINT();

//ADC12CTL0 |= ADC12ON + ENC; //修改!!!// 这样写是不对的

ADC12CTL0 |= ADC12ON;

ADC12CTL0 |= ENC;

wait = 0; //此处可定义变量,指示转换是否完成

ADC12CTL0 |= ENC+ADC12SC; //转换开始 若希望在其他时间开始转换 可将次句放在别处逼比必

while(wait==0) ;

}

#pragma vector=ADC_VECTOR

__interrupt void ADC()

{int result[7];

wait=1;

result[0] = ADC12MEM0;

/*unsigned char q0;

int *pmem=ADC12MEM;

//转换结束的标志位置位

for(q0=0;q0<16;q0++)

{

AdMem[q0]= *pmem;

pmem++;

}*/

}

下面再来简要的介绍一下这个模块不易理解的地方

1、MSP430可以使用内部、外部的参考电压,内部1.5或2.5,外部0~3.3,可以通过寄存器设置,采样电压的输入范围最大为0~3.3即AVss~AVcc,不能检测负电压,如果需要检测负电压,可以使用运放,电压偏置成为正电压然后检测

2、使用外部AVss~AVcc作为参考电压不够稳定,但是精度高,使用内部电压较稳定。

3、程序中一定要打开全局中断_EINT();

ADC12
************************************************** ********** /
#定义__ MSP430_HAS_ADC12__ / *定义表明模块是* /

#定义ADC12CTL0_(0x01A0u)/ * ADC12控制0 * /
DEFW(ADC12CTL0,ADC12CTL0_)
#定义ADC12CTL1_(0x01A2u)/ * ADC12控制1 * /
DEFW(ADC12CTL1,ADC12CTL1_)
#定义ADC12IFG_(0x01A4u)/ * ADC12中断标志* /
DEFW(ADC12IFG,ADC12IFG_)
#定义ADC12IE_(0x01A6u)/ * ADC12中断使能* /
DEFW(ADC12IE,ADC12IE_)
#定义ADC12IV_(0x01A8u)/ * ADC12中断向量字* /
DEFW(ADC12IV,ADC12IV_)

#定义ADC12MEM_(0x0140u)/ * ADC12转换内存* /
的#ifndef __ IAR_SYSTEMS_ICC__
#定义ADC12MEM(ADC12MEM_)/ * ADC12转换存储器(汇编)* /
其他#
#定义ADC12MEM((INT *)ADC12MEM_)/ * ADC12转换存储器(C)* /
#ENDIF
#定义ADC12MEM0_(0x0140u)/ * ADC12转换内存0 * /
DEFW(ADC12MEM0,ADC12MEM0_)
#定义ADC12MEM1_(0x0142u)/ * ADC12转换内存1 * /
DEFW(ADC12MEM1,ADC12MEM1_)
#定义ADC12MEM2_(0x0144u)/ * ADC12转换内存2 * /
DEFW(ADC12MEM2,ADC12MEM2_)
#定义ADC12MEM3_(0x0146u)/ * ADC12转换记忆体3 * /
DEFW(ADC12MEM3,ADC12MEM3_)
#定义ADC12MEM4_(0x0148u)/ * ADC12转换内存4 * /
DEFW(ADC12MEM4,ADC12MEM4_)
#定义ADC12MEM5_(0x014Au)/ * ADC12转换记忆5 * /
DEFW(ADC12MEM5,ADC12MEM5_)
#定义ADC12MEM6_(0x014Cu)/ * ADC12转换存储器6 * /
DEFW(ADC12MEM6,ADC12MEM6_)
#定义ADC12MEM7_(0x014Eu)/ * ADC12转换记忆7 * /
DEFW(ADC12MEM7,ADC12MEM7_)
#定义ADC12MEM8_(0x0150u)/ * ADC12转换内存8 * /
DEFW(ADC12MEM8,ADC12MEM8_)
#定义ADC12MEM9_(0x0152u)/ * ADC12转换存储器9 * /
DEFW(ADC12MEM9,ADC12MEM9_)
#定义ADC12MEM10_(0x0154u)/ * ADC12转换记忆体10 * /
DEFW(ADC12MEM10,ADC12MEM10_)
#定义ADC12MEM11_(0x0156u)/ * ADC12转换记忆体11 * /
DEFW(ADC12MEM11,ADC12MEM11_)
#定义ADC12MEM12_(0x0158u)/ * ADC12转换记忆体12 * /
DEFW(ADC12MEM12,ADC12MEM12_)
#定义ADC12MEM13_(0x015Au)/ * ADC12转换记忆体13 * /
DEFW(ADC12MEM13,ADC12MEM13_)
#定义ADC12MEM14_(0x015Cu)/ * ADC12转换记忆体14 * /
DEFW(ADC12MEM14,ADC12MEM14_)
#定义ADC12MEM15_(0x015Eu)/ * ADC12转换记忆体15 * /
DEFW(ADC12MEM15,ADC12MEM15_)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top