新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用MSP430內部DAC產生正弦信號

        利用MSP430內部DAC產生正弦信號

        作者: 時間:2016-12-01 來源:網絡 收藏
        /*****************************************************************

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

        本文引用地址:http://www.104case.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; // 參考電壓為內部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; //轉換開始 若希望在其他時間開始轉換 可將次句放在別處逼比必


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 安化县| 依兰县| 泗水县| 贵阳市| 洛川县| 陵川县| 铜陵市| 璧山县| 宁强县| 保山市| 慈溪市| 沙洋县| 宜丰县| 福清市| 分宜县| 来安县| 慈溪市| 五家渠市| 辽阳市| 新晃| 榆中县| 潜江市| 鄂尔多斯市| 宁化县| 西藏| 墨玉县| 孝昌县| 中宁县| 凤庆县| 锡林郭勒盟| 泸州市| 抚宁县| 广宁县| 桑日县| 交口县| 亳州市| 邻水| 墨竹工卡县| 清徐县| 浑源县| 怀宁县|