<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/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; // 停看門狗

          INIT_XT2();

          P5SEL=0XFF;
          ADC12CTL0 = REFON; // 參考電壓為內(nèi)部2.5v
          DMA0SA = (int) Sin_tab; // 源地址寄存器
          DMA0DA = DAC12_0DAT_; // 目的地址寄存器
          DMA0SZ = 100; // 傳輸基本單元的個數(shù)
          DMACTL0 = DMA0TSEL_5; // DAC12_0CTL的DAC12IFG標志
          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的時鐘源選XT2 SELS:選擇SMCLK的時鐘源為XT2
          do
          {
          IFG1&=~OFIFG;//清除震蕩錯誤標志
          for(i=0;i<100;i++);
          _NOP();
          }
          while((IFG1&OFIFG)!=0);
          IFG1&=~OFIFG;
          }

          ======================================================================================
          /******************************************************************************
          * 文件: main.c
          * 說明: MSP430F5438開發(fā)板ADC12 轉(zhuǎn)換實驗
          * 設(shè)置斷點觀察 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ù)存儲的最大值
          /******************************************************************************
          *函數(shù)聲名區(qū)
          ******************************************************************************/
          void ADC_init(void);
          float ADC_opera(void);
          /******************************************************************************
          *變量定義區(qū)
          ******************************************************************************/
          volatile unsigned int results[Num_of_Results]; //存儲 ADC12采樣轉(zhuǎn)換結(jié)果
          static unsigned char index = 0;
          float voltage; //電壓值運算結(jié)果存儲
          /*******************************系統(tǒng)主函數(shù)************************************/
          int main( void )
          {
          WDTCTL=WDTPW+WDTHOLD;
          BoardConfig(0xEF); // 板上資源配置
          Init_CLK(); // 初始化系統(tǒng)時鐘
          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采樣進來的數(shù)據(jù)轉(zhuǎn)換成十進制數(shù)
          * 參 數(shù): 無
          * 返回值: 無
          ******************************************************************************/

          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ù): 無
          * 返回值: 無
          ******************************************************************************/
          #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;
          }
          -----------------------------------------------------------------------------------------------------------------

          這張圖片在我學習過程中幫了不少忙,程序看不懂了,可以來看看這些,或許會有些收獲,本人是學集成電路設(shè)計的,覺得很有幫助。

          下面貼些自己的測試程序,別小看這幾行程序啊,可是我測試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ù)位的情況下才能對ADC12CTL0、1進行設(shè)置!??!這點很重要哦!??!

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

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

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

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

          ADC12CTL1 |= SHP + CONSEQ_0;

          /*SHP: 1:采樣信號源自采樣定時器 0:采樣信號源自采樣輸入信號

          CONSEQ: 0: 單通道單次轉(zhuǎn)換 1:序列通道單詞轉(zhuǎn)換 2:單通道多次轉(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; //修改?。?!// 這樣寫是不對的

          ADC12CTL0 |= ADC12ON;

          ADC12CTL0 |= ENC;

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

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


          上一頁 1 2 下一頁

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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();