新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 利用MSP430內(nèi)部DAC產(chǎn)生正弦信號(hào)

利用MSP430內(nèi)部DAC產(chǎn)生正弦信號(hào)

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
/*****************************************************************

文件名:DAC_10k
功能:使用msp430f169內(nèi)部DAC模塊通過(guò)DMA模塊的傳輸
產(chǎn)生10kHz的正玄信號(hào),本程序在一個(gè)周期內(nèi)取點(diǎn)
為100個(gè)
*****************************************************************/

本文引用地址:http://m.butianyuan.cn/article/201612/324251.htm

#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; // 停看門(mén)狗

INIT_XT2();

P5SEL=0XFF;
ADC12CTL0 = REFON; // 參考電壓為內(nèi)部2.5v
DMA0SA = (int) Sin_tab; // 源地址寄存器
DMA0DA = DAC12_0DAT_; // 目的地址寄存器
DMA0SZ = 100; // 傳輸基本單元的個(gè)數(shù)
DMACTL0 = DMA0TSEL_5; // DAC12_0CTL的DAC12IFG標(biāo)志
DMA0CTL = DMADT_4 + DMASRCINCR_3 + DMAEN; // DMADT_4:重復(fù)的塊傳輸方式 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;//打開(kāi)XT2振蕩器
BCSCTL2|=SELM_2+SELS;//SELM_2:MCLK的時(shí)鐘源選XT2 SELS:選擇SMCLK的時(shí)鐘源為XT2
do
{
IFG1&=~OFIFG;//清除震蕩錯(cuò)誤標(biāo)志
for(i=0;i<100;i++);
_NOP();
}
while((IFG1&OFIFG)!=0);
IFG1&=~OFIFG;
}

======================================================================================
/******************************************************************************
* 文件: main.c
* 說(shuō)明: MSP430F5438開(kāi)發(fā)板ADC12 轉(zhuǎn)換實(shí)驗(yàn)
* 設(shè)置斷點(diǎn)觀察 voltage 中的電壓值
* 改變可變電阻器R25 觀察 voltage 中的電壓值的變化
* 編譯: IAR Embedded Workbench IDE for MSP430 v5.10
******************************************************************************/
#include
#include "GPIO.h"
#include "BoardConfig.h"
#include "Clock.h"

/******************************************************************************
*宏定義區(qū)
******************************************************************************/
#define Num_of_Results 8 //數(shù)據(jù)存儲(chǔ)的最大值
/******************************************************************************
*函數(shù)聲名區(qū)
******************************************************************************/
void ADC_init(void);
float ADC_opera(void);
/******************************************************************************
*變量定義區(qū)
******************************************************************************/
volatile unsigned int results[Num_of_Results]; //存儲(chǔ) ADC12采樣轉(zhuǎn)換結(jié)果
static unsigned char index = 0;
float voltage; //電壓值運(yùn)算結(jié)果存儲(chǔ)
/*******************************系統(tǒng)主函數(shù)************************************/
int main( void )
{
WDTCTL=WDTPW+WDTHOLD;
BoardConfig(0xEF); // 板上資源配置
Init_CLK(); // 初始化系統(tǒng)時(shí)鐘
WDTCTL = WDT_ADLY_1_9;
SFRIE1 |= WDTIE; // WDT 中斷使能
ADC_init(); // ADC12轉(zhuǎn)換初始化
_EINT(); // 開(kāi)全局中斷

while(1)
{
if(index==Num_of_Results-1)
voltage=ADC_opera();
_NOP();
LPM1;
}
}
/******************************************************************************
* 函數(shù)名: void ADC_init(void)
* 功 能: ADC12初始化
* 參 數(shù): 無(wú)
* 返回值: 無(wú)
******************************************************************************/
void ADC_init(void)
{
P6SEL |= 0x01; // 打開(kāi)通道1
ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC;

ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2;
ADC12IE = 0x01;
ADC12CTL0 |= ADC12ENC;
ADC12CTL0 |= ADC12SC;
}
/******************************************************************************
* 函數(shù)名: void ADC_opera(void)
* 功 能: 將ADC采樣進(jìn)來(lái)的數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)
* 參 數(shù): 無(wú)
* 返回值: 無(wú)
******************************************************************************/

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;
}
/******************************************************************************
* 函數(shù)名: __interrupt void ADC12ISR (void)
* 功 能: ADC12 中斷服務(wù)函數(shù)
* 參 數(shù): 無(wú)
* 返回值: 無(wú)
******************************************************************************/
#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;
}
-----------------------------------------------------------------------------------------------------------------

這張圖片在我學(xué)習(xí)過(guò)程中幫了不少忙,程序看不懂了,可以來(lái)看看這些,或許會(huì)有些收獲,本人是學(xué)集成電路設(shè)計(jì)的,覺(jué)得很有幫助。

下面貼些自己的測(cè)試程序,別小看這幾行程序啊,可是我測(cè)試N次的出來(lái)的

#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復(fù)位的情況下才能對(duì)ADC12CTL0、1進(jìn)行設(shè)置?。。∵@點(diǎn)很重要哦?。?!

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

/*MSC:多次采樣轉(zhuǎn)換位,只對(duì)序列采樣或者多次多次轉(zhuǎn)換有效。

0:采樣定時(shí)器需要SHI信號(hào)的上升沿觸發(fā)

1:首次需要采樣定時(shí)器SHI信號(hào)觸發(fā),之后的轉(zhuǎn)換在上次轉(zhuǎn)換之后隨即開(kāi)始。*/

ADC12CTL1 |= SHP + CONSEQ_0;

/*SHP: 1:采樣信號(hào)源自采樣定時(shí)器 0:采樣信號(hào)源自采樣輸入信號(hào)

CONSEQ: 0: 單通道單次轉(zhuǎn)換 1:序列通道單詞轉(zhuǎn)換 2:?jiǎn)瓮ǖ蓝啻无D(zhuǎn)換 3:序列通道多次轉(zhuǎn)換

CSTARTADD_x(0~15):轉(zhuǎn)換起始位置 */

ADC12MCTL0 = EOS + SREF_0 + INCH_7;

/* EOS:序列結(jié)束位

SREF: 參考電壓選擇

INCH:模擬輸入通道選擇 */

ADC12IE |= 0x0001;//開(kāi)相應(yīng)模擬通道中斷,轉(zhuǎn)換完畢后引發(fā)中斷

_EINT();

//ADC12CTL0 |= ADC12ON + ENC; //修改?。?!// 這樣寫(xiě)是不對(duì)的

ADC12CTL0 |= ADC12ON;

ADC12CTL0 |= ENC;

wait = 0; //此處可定義變量,指示轉(zhuǎn)換是否完成

ADC12CTL0 |= ENC+ADC12SC; //轉(zhuǎn)換開(kāi)始 若希望在其他時(shí)間開(kāi)始轉(zhuǎn)換 可將次句放在別處逼比必


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: MSP430內(nèi)部DAC正弦信

評(píng)論


技術(shù)專區(qū)

關(guān)閉