久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

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

作者:余春雨老師   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年12月18日   【字體:

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

#include  <msp430x16x.h>
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;                        // 參考電壓為內(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;//打開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
* 說明:   MSP430F5438開發(fā)板 ADC12 轉(zhuǎn)換實(shí)驗(yàn)
*         設(shè)置斷點(diǎn)觀察 voltage 中的電壓值
*         改變可變電阻器 R25 觀察 voltage 中的電壓值的變化
* 編譯:   IAR Embedded Workbench IDE for MSP430 v5.10
******************************************************************************/
#include  <msp430x54x.h>
#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();                                      //  開全局中斷
   
  while(1)
  {
    if(index==Num_of_Results-1)
    voltage=ADC_opera();
    _NOP();
    LPM1;
  }
}
/******************************************************************************
* 函數(shù)名: void ADC_init(void)
* 功  能: ADC12初始化
* 參  數(shù): 無
* 返回值: 無
******************************************************************************/
void ADC_init(void)
{
  P6SEL |= 0x01;                            //  打開通道1
  ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC; 
                                            
  ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2;       
  ADC12IE = 0x01;                          
  ADC12CTL0 |= ADC12ENC;                    
  ADC12CTL0 |= ADC12SC;                         
}
/******************************************************************************
* 函數(shù)名: void ADC_opera(void)
* 功  能: 將ADC采樣進(jìn)來的數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)
* 參  數(shù): 無
* 返回值: 無
******************************************************************************/

float ADC_opera(void)
{
  unsigned long temp=0;
  float voltage;
  for(unsigned char i=0;i<Num_of_Results;i++)
  {
    temp +=results[i];
  }
  voltage=((temp/Num_of_Results)*3.3/4095);
  return voltage;
}
/******************************************************************************
* 函數(shù)名:  __interrupt void ADC12ISR (void)
* 功  能: ADC12 中斷服務(wù)函數(shù)
* 參  數(shù): 無
* 返回值: 無
******************************************************************************/
#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í)過程中幫了不少忙,程序看不懂了,可以來看看這些,或許會(huì)有些收獲,本人是學(xué)集成電路設(shè)計(jì)的,覺得很有幫助。

 

下面貼些自己的測(cè)試程序,別小看這幾行程序啊,可是我測(cè)試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復(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)換之后隨即開始。*/

    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;//開相應(yīng)模擬通道中斷,轉(zhuǎn)換完畢后引發(fā)中斷

    _EINT();

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

    ADC12CTL0 |= ADC12ON;

    ADC12CTL0 |= ENC;

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

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

    while(wait==0) ;    

}

#pragma vector=ADC_VECTOR

__interrupt void ADC()

{int  result[7];

        wait=1;

        result[0] = ADC12MEM0;

        /*unsigned char q0;

 int *pmem=ADC12MEM;

     //轉(zhuǎn)換結(jié)束的標(biāo)志位置位

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

 {

  AdMem[q0]= *pmem;

  pmem++;

 }*/

}


下面再來簡(jiǎn)要的介紹一下這個(gè)模塊不易理解的地方

1、MSP430可以使用內(nèi)部、外部的參考電壓,內(nèi)部1.5或2.5,外部0~3.3,可以通過寄存器設(shè)置,采樣電壓的輸入范圍最大為0~3.3即AVss~AVcc,不能檢測(cè)負(fù)電壓,如果需要檢測(cè)負(fù)電壓,可以使用運(yùn)放,電壓偏置成為正電壓然后檢測(cè)

2、使用外部AVss~AVcc作為參考電壓不夠穩(wěn)定,但是精度高,使用內(nèi)部電壓較穩(wěn)定。

3、程序中一定要打開全局中斷_EINT();

ADC12
************************************************** ********** /
#定義__ MSP430_HAS_ADC12__ / *定義表明模塊是* /

#定義ADC12CTL0_(0x01A0u)/ * ADC12控制0 * /
DEFW(ADC12CTL0,ADC12CTL0_)
#定義ADC12CTL1_(0x01A2u)/ * ADC12控制1 * /
DEFW(ADC12CTL1,ADC12CTL1_)
#定義ADC12IFG_(0x01A4u)/ * ADC12中斷標(biāo)志* /
DEFW(ADC12IFG,ADC12IFG_)
#定義ADC12IE_(0x01A6u)/ * ADC12中斷使能* /
DEFW(ADC12IE,ADC12IE_)
#定義ADC12IV_(0x01A8u)/ * ADC12中斷向量字* /
DEFW(ADC12IV,ADC12IV_)

#定義ADC12MEM_(0x0140u)/ * ADC12轉(zhuǎn)換內(nèi)存* /
的#ifndef __ IAR_SYSTEMS_ICC__
#定義ADC12MEM(ADC12MEM_)/ * ADC12轉(zhuǎn)換存儲(chǔ)器(匯編)* /
其他#
#定義ADC12MEM((INT *)ADC12MEM_)/ * ADC12轉(zhuǎn)換存儲(chǔ)器(C)* /
#ENDIF
#定義ADC12MEM0_(0x0140u)/ * ADC12轉(zhuǎn)換內(nèi)存0 * /
DEFW(ADC12MEM0,ADC12MEM0_)
#定義ADC12MEM1_(0x0142u)/ * ADC12轉(zhuǎn)換內(nèi)存1 * /
DEFW(ADC12MEM1,ADC12MEM1_)
#定義ADC12MEM2_(0x0144u)/ * ADC12轉(zhuǎn)換內(nèi)存2 * /
DEFW(ADC12MEM2,ADC12MEM2_)
#定義ADC12MEM3_(0x0146u)/ * ADC12轉(zhuǎn)換記憶體3 * /
DEFW(ADC12MEM3,ADC12MEM3_)
#定義ADC12MEM4_(0x0148u)/ * ADC12轉(zhuǎn)換內(nèi)存4 * /
DEFW(ADC12MEM4,ADC12MEM4_)
#定義ADC12MEM5_(0x014Au)/ * ADC12轉(zhuǎn)換記憶5 * /
DEFW(ADC12MEM5,ADC12MEM5_)
#定義ADC12MEM6_(0x014Cu)/ * ADC12轉(zhuǎn)換存儲(chǔ)器6 * /
DEFW(ADC12MEM6,ADC12MEM6_)
#定義ADC12MEM7_(0x014Eu)/ * ADC12轉(zhuǎn)換記憶7 * /
DEFW(ADC12MEM7,ADC12MEM7_)
#定義ADC12MEM8_(0x0150u)/ * ADC12轉(zhuǎn)換內(nèi)存8 * /
DEFW(ADC12MEM8,ADC12MEM8_)
#定義ADC12MEM9_(0x0152u)/ * ADC12轉(zhuǎn)換存儲(chǔ)器9 * /
DEFW(ADC12MEM9,ADC12MEM9_)
#定義ADC12MEM10_(0x0154u)/ * ADC12轉(zhuǎn)換記憶體10 * /
DEFW(ADC12MEM10,ADC12MEM10_)
#定義ADC12MEM11_(0x0156u)/ * ADC12轉(zhuǎn)換記憶體11 * /
DEFW(ADC12MEM11,ADC12MEM11_)
#定義ADC12MEM12_(0x0158u)/ * ADC12轉(zhuǎn)換記憶體12 * /
DEFW(ADC12MEM12,ADC12MEM12_)
#定義ADC12MEM13_(0x015Au)/ * ADC12轉(zhuǎn)換記憶體13 * /
DEFW(ADC12MEM13,ADC12MEM13_)
#定義ADC12MEM14_(0x015Cu)/ * ADC12轉(zhuǎn)換記憶體14 * /
DEFW(ADC12MEM14,ADC12MEM14_)
#定義ADC12MEM15_(0x015Eu)/ * ADC12轉(zhuǎn)換記憶體15 * /
DEFW(ADC12MEM15,ADC12MEM15_)

#定義ADC12MCTL_(0x0080u)/ * ADC12內(nèi)存控制* /
的#ifndef __ IAR_SYSTEMS_ICC__
#定義ADC12MCTL(ADC12MCTL_)/ * ADC12存儲(chǔ)器控制(用于匯編)* /
其他#
#定義ADC12MCTL((char *)的ADC12MCTL_)/ * ADC12存儲(chǔ)器控制(對(duì)于C)* /
#ENDIF
#定義ADC12MCTL0_(0x0080u)/ * ADC12內(nèi)存控制0 * /
DEFC(ADC12MCTL0,ADC12MCTL0_)
#定義ADC12MCTL1_(0x0081u)/ * ADC12內(nèi)存控制1 * /
DEFC(ADC12MCTL1,ADC12MCTL1_)
#定義ADC12MCTL2_(0x0082u)/ * ADC12內(nèi)存控制2 * /
DEFC(ADC12MCTL2,ADC12MCTL2_)
#定義ADC12MCTL3_(0x0083u)/ * ADC12內(nèi)存控制3 * /
DEFC(ADC12MCTL3,ADC12MCTL3_)
#定義ADC12MCTL4_(0x0084u)/ * ADC12內(nèi)存控制4 * /
DEFC(ADC12MCTL4,ADC12MCTL4_)
#定義ADC12MCTL5_(0x0085u)/ * ADC12內(nèi)存控制5 * /
DEFC(ADC12MCTL5,ADC12MCTL5_)
#定義ADC12MCTL6_(0x0086u)/ * ADC12內(nèi)存控制6 * /
DEFC(ADC12MCTL6,ADC12MCTL6_)
#定義ADC12MCTL7_(0x0087u)/ * ADC12內(nèi)存控制7 * /
DEFC(ADC12MCTL7,ADC12MCTL7_)
#定義ADC12MCTL8_(0x0088u)/ * ADC12內(nèi)存控制8 * /
DEFC(ADC12MCTL8,ADC12MCTL8_)
#定義ADC12MCTL9_(0x0089u)/ * ADC12內(nèi)存控制9 * /
DEFC(ADC12MCTL9,ADC12MCTL9_)
#定義ADC12MCTL10_(0x008Au)/ * ADC12內(nèi)存控制10 * /
DEFC(ADC12MCTL10,ADC12MCTL10_)
#定義ADC12MCTL11_(0x008Bu)/ * ADC12內(nèi)存控制11 * /
DEFC(ADC12MCTL11,ADC12MCTL11_)
#定義ADC12MCTL12_(0x008Cu)/ * ADC12內(nèi)存控制12 * /
DEFC(ADC12MCTL12,ADC12MCTL12_)
#定義ADC12MCTL13_(0x008Du)/ * ADC12內(nèi)存控制13 * /
DEFC(ADC12MCTL13,ADC12MCTL13_)
#定義ADC12MCTL14_(0x008Eu)/ * ADC12內(nèi)存控制14 * /
DEFC(ADC12MCTL14,ADC12MCTL14_)
#定義ADC12MCTL15_(0x008Fu)/ * ADC12內(nèi)存控制15 * /
DEFC(ADC12MCTL15,ADC12MCTL15_)

/ * ADC12CTL0 * /
#定義ADC12SC(0×001)/ * ADC12開始轉(zhuǎn)換* /
#定義ENC(0x002)/ * ADC12啟用轉(zhuǎn)換* /
#定義ADC12TOVIE(量0x004)/ * ADC12定時(shí)器溢出中斷使能* /
#定義ADC12OVIE(量0x008)/ * ADC12溢出中斷使能* /
#定義ADC12ON(量0x010)/ * ADC12開/使能* /
#定義REFON對(duì)*(量0x020)/ * ADC12參考/
#定義REF2_5V(量0x040)/ * ADC12參考0:1.5 V / 1:2.5 V * /
#定義MSC(量0x080)/ * ADC12多SampleConversion * /
#定義SHT00(0x0100u)/ * ADC12采樣保持0選擇0 * /
#定義SHT01(0x0200u)/ * ADC12采樣保持0選擇1 * /
#定義SHT02(0x0400u)/ * ADC12采樣保持0選擇2 * /
#定義SHT03(0x0800u)/ * ADC12采樣保持0選擇3 * /
#定義SHT10(0x1000u)/ * ADC12采樣保持0選擇0 * /
#定義SHT11(0x2000u)/ * ADC12采樣保持1選擇1 * /
#定義SHT12(0x4000u)/ * ADC12采樣保持2選擇2 * /
#定義SHT13(0x8000u)/ * ADC12采樣保持3選擇3 * /
#定義MSH(量0x080)

#定義SHT0_0(0 * 0x100u)/ * ADC12采樣保持0選擇位:0 * /
#定義SHT0_1(1 * 0x100u)/ * ADC12采樣保持0選擇位:1 * /
#定義SHT0_2(2 * 0x100u)/ * ADC12采樣保持0選擇位:2 * /
#定義SHT0_3(3 * 0x100u)/ * ADC12采樣保持0選擇位:3 * /
#定義SHT0_4(4 * 0x100u)/ * ADC12采樣保持0選擇位:4 * /
#定義SHT0_5(5 * 0x100u)/ * ADC12采樣保持0選擇位:5 * /
#定義SHT0_6(6 * 0x100u)/ * ADC12采樣保持0選擇位:6 * /
#定義SHT0_7(7 * 0x100u)/ * ADC12采樣保持0選擇位:7 * /
#定義SHT0_8(8 * 0x100u)/ * ADC12采樣保持0選擇位:8 * /
#定義SHT0_9(9 * 0x100u)/ * ADC12采樣保持0選擇位:9 * /
#定義SHT0_10(10 * 0x100u)/ * ADC12采樣保持0選擇位:10 * /
#定義SHT0_11(11 * 0x100u)/ * ADC12采樣保持0選擇位:11 * /
#定義SHT0_12(12 * 0x100u)/ * ADC12采樣保持0選擇位:12 * /
#定義SHT0_13(13 * 0x100u)/ * ADC12采樣保持0選擇

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 久久91精品国产一区二区三区 | 亚洲精品视频在线看 | 日本精品在线播放 | 亚洲成人二区 | 一级欧美一级日韩片免费观看 | 日韩在线欧美 | 日韩一区二区三区在线视频 | 8x国产精品视频一区二区 | 国产乱码精品一区二区三区中文 | 福利片在线观看 | 欧美成人影院 | 91国在线视频 | 国产超碰人人爽人人做人人爱 | 每日更新av | 日日碰狠狠躁久久躁96avv | 精品日韩一区二区三区av动图 | 精品国产三级 | 国产一在线 | 久久激情视频 | 99久久免费精品 | 日韩精品一区二区三区在线观看 | a级黄色片在线观看 | 国精日本亚洲欧州国产中文久久 | 日韩精品久久久久久 | 99av成人精品国语自产拍 | 亚洲精品av在线 | 国产精品一区二区三区免费观看 | 日本成年免费网站 | 欧美日韩高清一区二区三区 | 亚洲精品视频在线观看免费 | 欧美日韩亚洲一区 | 成人a视频 | 日韩在线不卡视频 | www.日韩免费 | 真人女人一级毛片免费播放 | 狠狠干天天干 | 日本精品裸体写真集在线观看 | 一级毛片免费 | 亚洲欧洲综合av | 天天激情综合 | 五月天激情电影 |