您的位置 首页 资料

使用MSP430内部DAC发生正弦信号

*****************************************************************文件名:DAC_10k功能:使用msp430f169内部DAC模块通过

/*****************************************************************

文件名:DAC_10k
功用:运用msp430f169内部DAC模块经过DMA模块的传输
发生10kHz的正玄信号,本程序在一个周期内取点
为100个
*****************************************************************/

#include
static int Sin_tab[100] = {
1638,1740,1843,1944,2045,2143,2240,2335,2426,2515,2600,2681,2758,2831,
2899,2962,3020,3072,3119,3160,3195,3224,3246,3262,3272,3272,3263,3247,
3224,3196,3161,3120,3074,3021,2964,2901,2833,2760,2683,2602,2517,2429,
2337,2243,2146,2047,1947,1845,1743,1640,1537,1435,1333,1233,1134,1037,
943,851,762,677,596,519,446,378,314,256,204,157,116,81,52,29,13,3,0,2,
12,28,50,78,113,154,200,252,310,373,440,513,590,671,756,756,844,936,
1030,1127,1225,1326,1427,1529};
void INIT_XT2();
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停看门狗

INIT_XT2();

P5SEL=0XFF;
ADC12CTL0 = REFON; // 参阅电压为内部2.5v
DMA0SA = (int) Sin_tab; // 源地址寄存器
DMA0DA = DAC12_0DAT_; // 意图地址寄存器
DMA0SZ = 100; // 传输根本单元的个数
DMACTL0 = DMA0TSEL_5; // DAC12_0CTL的DAC12IFG标志
DMA0CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // DMADT_4:重复的块传输方法 Rpt, inc src, word-word
DAC12_0CTL = DAC12LSEL_2 + DAC12IR + DAC12AMP_5 + DAC12IFG + DAC12ENC; // Config
// **force first interrupt**
CCTL1 = OUTMOD_3; // Set/reset
CCR1 = 1; // PWM Duty Cycle
CCR0 = 8-1; // ~1kHz Clock period
TACTL = TASSEL_2 + MC_1; // SMCLK, up-mode

_BIS_SR(LPM0_bits); // Enter LPM0
}
void INIT_XT2()
{
unsigned char i;
BCSCTL1&=~XT2OFF;//翻开XT2振荡器
BCSCTL2|=SELM_2+SELS;//SELM_2:MCLK的时钟源选XT2 SELS:挑选SMCLK的时钟源为XT2
do
{
IFG1&=~OFIFG;//铲除震动过错标志
for(i=0;i<100;i++);
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}

======================================================================================
/******************************************************************************
* 文件: main.c
* 阐明: MSP430F5438开发板ADC12 转化试验
* 设置断点调查 voltage 中的电压值
* 改动可变电阻器R25 调查 voltage 中的电压值的改变
* 编译: IAR Embedded Workbench IDE for MSP430 v5.10
******************************************************************************/
#include
#include “GPIO.h”
#include “BoardConfig.h”
#include “Clock.h”

/******************************************************************************
*宏界说区
******************************************************************************/
#define Num_of_Results 8 //数据存储的最大值
/******************************************************************************
*函数声名区
******************************************************************************/
void ADC_init(void);
float ADC_opera(void);
/******************************************************************************
*变量界说区
******************************************************************************/
volatile unsigned int results[Num_of_Results]; //存储 ADC12采样转化成果
static unsigned char index = 0;
float voltage; //电压值运算成果存储
/*******************************体系主函数************************************/
int main( void )
{
WDTCTL=WDTPW+WDTHOLD;
BoardConfig(0xEF); // 板上资源配置
Init_CLK(); // 初始化体系时钟
WDTCTL = WDT_ADLY_1_9;
SFRIE1 |= WDTIE; // WDT 中止使能
ADC_init(); // ADC12转化初始化
_EINT(); // 开大局中止

while(1)
{
if(index==Num_of_Results-1)
voltage=ADC_opera();
_NOP();
LPM1;
}
}
/******************************************************************************
* 函数名: void ADC_init(void)
* 功 能: ADC12初始化
* 参 数: 无
* 返回值: 无
******************************************************************************/
void ADC_init(void)
{
P6SEL |= 0x01; // 翻开通道1
ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC;

ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2;
ADC12IE = 0x01;
ADC12CTL0 |= ADC12ENC;
ADC12CTL0 |= ADC12SC;
}
/******************************************************************************
* 函数名: void ADC_opera(void)
* 功 能: 将ADC采样进来的数据转化成十进制数
* 参 数: 无
* 返回值: 无
******************************************************************************/

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; //转化开端 若期望在其他时刻开端转化 可将次句放在别处逼比必

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/317254.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部