日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DSP28335学习记录(四)——ADC、DMA

發(fā)布時間:2024/1/8 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DSP28335学习记录(四)——ADC、DMA 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文記錄一下仿真模式下的printf()的使用,ADC,DMA,


目錄

一、仿真模式下的printf()

二、ADC

?2.1 ADC模式

2.2 觸發(fā)源,中斷,覆蓋功能

2.3 如何初始化配置

三、DMA


一、仿真模式下的printf()

這塊推薦這個:CCS中printf()的使用

其實想找一下用仿真器的COM口做串口的方法,沒有找到。這個在CCS仿真模式下直接用printf的方式,還挺方便的。

二、ADC

F28335 的 ADC 模塊主要包括以下特點:

  • --12 位模數(shù)轉(zhuǎn)換
  • --2 個采樣保持器(S/H)
  • --同時或順序采樣
  • --模擬電壓輸入范圍 0-3V
  • --ADC 轉(zhuǎn)換時鐘頻率最高可配置為 25MHz,采樣帶寬 12.5MHz
  • --16 通道模擬輸入
  • --排序器支持 16 通道獨立循環(huán)“自動轉(zhuǎn)換”,每次轉(zhuǎn)換通道可以軟件編程 選擇。
  • --16 個結(jié)果寄存器存放 ADC 轉(zhuǎn)換的結(jié)果,轉(zhuǎn)換后的數(shù)字量表示為: 數(shù)字值=4095*(輸入模擬值-ADCLO)/3,輸入模擬值在 0-3V 之間
  • --多個觸發(fā)源啟動 ADC 轉(zhuǎn)換(SOC):?

    ①S/W--軟件立即啟動

    ②外部引腳

    ③ePWMx SOCA 啟動

    ④ePWMx SOCB 啟動

  • --靈活的中斷控制,允許每個或者每隔一個序列轉(zhuǎn)換結(jié)束產(chǎn)生中斷請求
  • --排序器可工作在啟動/停止模式
  • --采樣保持(S/H)采集時間窗口有獨立的預(yù)定標(biāo)控制

在使用 ADC 轉(zhuǎn)換模塊時,特別要注意的是 F28335 的 AD 的輸入范圍 0-3V,若 輸入負電壓或高于 3V 的電壓就會燒壞 AD 模塊,這一點要務(wù)必引起重視。超出輸 入范圍的電壓可在前級電路,通過電阻進行分壓,或經(jīng)運放比例電路進行處理后 再輸入。連接到 ADCINxx 引腳的模擬輸入信號要盡可能的遠離數(shù)字電路信號線, ADC 模塊的電源供電要與數(shù)字電源電源隔離開,避免數(shù)字電源的高頻干擾,ADC 的參考源是影響 AD 精度的一個重要因數(shù),注意 ADC 參考源的電壓紋波處理

ADC的內(nèi)部框圖:16個輸入通道,分AB兩組,兩個采樣保持器,一個轉(zhuǎn)換模塊,兩個排序器。

由于有兩個采樣保持器,所以根據(jù)工作方式分:順序采樣,同步采樣。后面講。

雙排序器根據(jù)工作方式分:級聯(lián)模式,雙排序器模式。

以上兩個模塊排列組合,ADC共有4中模式。

?2.1 ADC模式

1,級聯(lián)模式

在級聯(lián)排序器操作方式下,2 個 8 狀態(tài)排序器(SEQ1 和 SEQ2)構(gòu)成一個 16狀態(tài)的排序SEQ。只能設(shè)置一個觸發(fā)源,按照順序轉(zhuǎn)換。

2,雙排序器模式

兩個排序器獨立運行,分別獨立設(shè)置一個觸發(fā)源,只有一個AD轉(zhuǎn)換模塊,所以分時復(fù)用,轉(zhuǎn)換順序下圖。?

3,順序采樣

和級聯(lián)排序模式下一樣,就是按照順序轉(zhuǎn)換。級聯(lián)排序其順序采樣也是最常用的模式。

4,同步采樣

如果一個輸入來自 ADCINA0-ADCINA7,另一個輸入來自 ADCINB0-ADCINB7, ADC 能夠?qū)崿F(xiàn) 2 個 ADCINxx 輸入的同時采樣。此外,要求 2 個輸入必須有同樣的 采樣和保持偏移量(比如 ADCINA4 和 ADCINB4,不能是 ADCINA7 和 ADCINA6)。 為了讓 ADC 模塊工作在同步采樣模式,必須設(shè)置 ADCTRL3 寄存器中的 SMODE_SEL 位為 1。

在同步采樣模式下,CONVxx 寄存器的最高位不起作用,每個采樣和保持緩沖 器對 CONVxx 寄存器低 3 位確定的引腳進行采樣。例如,如果 CONVxx 寄存器的值 是 0110b,ADCINA6 就由采樣保持器 A 采樣,ADCINB6 有采樣保持器 B 采樣,和 1110b 的效果是一樣的,如果 CONVxx 寄存器的值是 1001b,ADCINA1 由采樣和保 持器 A 采樣,ADCINB1 由采樣和保持器 B 采樣。采樣保持兩路可以同步進行,因 為有兩個采樣保持器,但是轉(zhuǎn)換不可能同時進行。轉(zhuǎn)換器首先轉(zhuǎn)換采樣保持器 A 中鎖存的電壓量,然后轉(zhuǎn)換采樣保持器 B 中鎖存的電壓量。采樣保持器 A 轉(zhuǎn)換的 結(jié)果保存到當(dāng)前的 ADCRESULTn 寄存器(如果排序器已經(jīng)復(fù)位,SEQ1 的結(jié)果放到 ADCRESULT0),采樣保持器 B 轉(zhuǎn)換的結(jié)果保存到下一個(順延)ADCRESULTn 寄 存器(如果排序器已經(jīng)復(fù)位,SEQ1 的結(jié)果放到 ADCRESULT1),結(jié)果寄存器指針 每次增加 2。

2.2 觸發(fā)源,中斷,覆蓋功能

1,觸發(fā)源

2,中斷

?在不同工作模式下如何使用中斷模式 1 和中斷模式 2。

情形 1:在第 1 個和第 2 個序列中采樣的數(shù)量不相等。

(1)中斷模式 1(每個 EOS 到來時產(chǎn)生中斷請求)

①排序器用 MAX_CONVn=1 初始化,轉(zhuǎn)換 I1 和 I2。

②在中斷服務(wù)子程序 a 中,通過軟件將 MAX_CONVn 的值設(shè)為 2,轉(zhuǎn)換 V1、V2 和 V3。

③在中斷服務(wù)子程序 b 中,完成下列任務(wù):

--將 MAX_CONVn 的值再次設(shè)置為 1,轉(zhuǎn)換 I1 和 I2。

--從 ADC 結(jié)果寄存器中讀出 I1、I2、V1、V2 和 V3 的值。

--復(fù)位排序器。

④重復(fù)操作第②、③步。每次 SEQ_CNTRn 等于 0 時產(chǎn)生中斷,并且中斷能夠 被識別。

情形 2:在第 1 個和第 2 個序列中采樣的數(shù)量相等。

(2)中斷模式 2 操作(每隔一個 EOS 信號產(chǎn)生中斷請求)

①排序器設(shè)置 MAX_CONVn=2 初始化,轉(zhuǎn)換 I1、I2、I3 或 V1、V2 和 V3。

②在服務(wù)子程序 b 和 d 中,完成下列任務(wù)。

--從 ADC 結(jié)果寄存器中讀出 I1、I2、I3 或者 V1、V2 和 V3 的值。

--復(fù)位排序器。

--重復(fù)第②步。

情形 3:兩個序列的采樣個數(shù)是相等的(帶空讀)

(3)中斷模式 2(隔一個 EOS 信號產(chǎn)生中斷請求)

①MAX_CONVn=2,初始化序列器,轉(zhuǎn)換 I1、I2 和 x(空采樣)。

②在中斷服務(wù)子程序 b 和 d 中,完成下列任務(wù):

--從 ADC 結(jié)果寄存器中讀出 I1、I2、x、V1、V2 和 V3 的值。

--復(fù)位排序器。

--重復(fù)第②步。在①中,I1、I2 后的 X 采樣為一個空的采樣,其實并沒有要求采樣。然而利用模式 2 間隔產(chǎn)生中斷請求的特性,可以減小中斷服務(wù)子程序和 CPU 的開銷。

3,排序器覆蓋功能:(開DMA時,需要使能)

通常在運行模式下,排序器 SEQ1、SEQ2 或者級聯(lián) SEQ 用于選擇 ADC 通道, 并將轉(zhuǎn)換的結(jié)果存儲在相應(yīng)的 ADCRESULTn 寄存器中。在 MAX_CONVn 設(shè)置的轉(zhuǎn)換 結(jié)束時,排序器自動返回 0。在使用排序器覆蓋功能時,排序器的自動返回可通 過軟件控制,這由 ADC 控制寄存器 1(ADCCTRL1)的第 5 位控制。例如假定 SEQOVRD 位為 0,ADC 工作在級聯(lián)模式下的連續(xù)轉(zhuǎn)換模式,MAX_CONV1 設(shè)置為 7,通常情況 下,排序器會遞增并將 ADC 轉(zhuǎn)換結(jié)果更新結(jié)果寄存器到 ADCRESULT7 寄存器,然 后返回到 0,。當(dāng) ADCRESULT7 寄存器更新完成后,相應(yīng)的中斷標(biāo)志位被置位。當(dāng) SEQ_OVRD 位被重新置位,排序器在更新 7 個結(jié)果寄存器后不再回繞到 0,而將繼 續(xù)增加,并更新 ADCRESULT8 寄存器,直到 ADCRESULT15 為止。ADCRESULT15 寄 存器更新完畢再返回到 0。這可以將結(jié)果寄存器看成 FIFO,用于 ADC 對連續(xù)數(shù)據(jù) 的捕捉。當(dāng) ADC 在最高數(shù)據(jù)速率下進行轉(zhuǎn)換時,這個功能有助于捕捉 ADC 的數(shù)據(jù)

2.3 如何初始化配置

ADC有8個設(shè)置寄存器,不過使用起來很簡單。

ADC配置步驟:

1,ADC外設(shè)時鐘使能

2,高速外設(shè)時鐘分頻。從系統(tǒng)時鐘進入ADC模塊的,最高25M。

3,ADC初始化。

4,ADC內(nèi)核時鐘分頻。用于ADC轉(zhuǎn)換的。

5,采樣持續(xù)時間。

6,排序器模式

7,采樣方式。

8,設(shè)置輸入通道,開幾個口就設(shè)置幾個。

9,設(shè)置最大通道數(shù)。

10,設(shè)置是否連續(xù)轉(zhuǎn)換。

(11,排序器覆蓋模式使能,開DMA時)

(12,使能SOC觸發(fā)。用SOC信號觸發(fā)模式時)

13,使能排序器。

例程,非DMA模式

#define ADC_MODCLK 3 #define ADC_CKPS 0x1 // ADC module clock = HSPCLK/2*ADC_CKPS = 25.0MHz/(1*2) = 12.5MHz #define ADC_SHCLK 0xf // S/H width in ADC module periods = 16 ADC clocksvoid ADC_Init(void) {// Specific clock setting for this example:EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADCEDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK) 25MEDIS;InitAdc(); // For this example, init the ADC// Specific ADC setup for this example:AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //時鐘分頻25/(ADC_CKPS+1)=12.5MAdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //采樣持續(xù)時間,最大值A(chǔ)dcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 級聯(lián)模式AdcRegs.ADCTRL3.bit.SMODE_SEL = 0; //順序采樣AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //ADC通道0配置AIN0AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 1; //ADC通道0配置AIN1AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 2; //ADC通道0配置AIN2AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 2; //最大轉(zhuǎn)換通道數(shù)AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 非連續(xù)轉(zhuǎn)換模式AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; //// Start SEQ1AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //使能epwm_SOCA信號的觸發(fā)SQE1AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //使能SEQ1}Uint16 Read_ADCValue(void) {while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4; }

三、DMA

28335的DMA用起來很簡單,只是幾個功能函數(shù)參數(shù)可能有點不好理解。

DMA配置方式:

1,使能DMA外設(shè)時鐘,

2,初始化DMA。

3,配置下面幾個函數(shù):

????????DMACH1AddrConfig

????????DMACH1BurstConfig
????????DMACH1TransferConfig
????????DMACH1WrapConfig
????????DMACH1ModeConfig

4,啟動DMA。

  • DMACH1AddrConfig:兩個參數(shù):源指針,目的指針。
  • DMACH1BurstConfig:幀函數(shù),一個觸發(fā)信號執(zhí)行一次

    三個參數(shù):

    數(shù)據(jù)個數(shù)(類型Uint16),

    每傳一個數(shù)據(jù),源指針增加量,

    每傳一個數(shù)據(jù),目的指針增加量。

  • DMACH1TransferConfig:傳輸函數(shù),主要設(shè)置幾幀數(shù)據(jù)產(chǎn)生一個中斷

    三個參數(shù):

    幀個數(shù),達到數(shù)會產(chǎn)生中斷,

    每傳一幀,源指針增加量,

    每傳一幀,目的指針增加量。

  • ?DMACH1WrapConfig:打包函數(shù),主要設(shè)置返回步長。

    四個參數(shù):

    執(zhí)行多少幀,源指針將返回,

    源指針返回之后,加上一個偏移量。

    執(zhí)行多少幀,目的指針將返回,

    目的指針返回之后,加上一個偏移量。

    (其實不難理解,我們看一下寄存器的說明就清楚了。)

  • 細心的可能發(fā)現(xiàn) DMACH1TransferConfig 和 DMACH1WrapConfig 指針偏移量某些情況下好像有功能重合。數(shù)據(jù)手冊中提到過,DMACH1WrapConfig設(shè)置偏移量時,會忽略DMACH1TransferConfig的偏移量。DMACH1WrapConfig的打包幀個數(shù)大于DMACH1TransferConfig時,DMACH1WrapConfig將失效。?

  • DMACH1ModeConfig是DMA配置寄存器:

    ①persel--選擇觸發(fā)源,值為下列選項:

    ????????DMA_SEQ1INT--------ADC

    ????????DMA_SEQ2INT--------ADC

    ????????DMA_XINT1 --------外部中斷

    ????????DMA_XINT2 --------外部中斷

    ????????DMA_XINT3 --------外部中斷

    ????????DMA_XINT4 --------外部中斷

    ????????DMA_XINT5 --------外部中斷

    ????????DMA_XINT6 --------外部中斷

    ????????DMA_XINT7 --------外部中斷

    ????????DMA_XINT13 --------外部中斷

    ????????DMA_TINT0 --------CPU 時鐘

    ????????DMA_TINT1 --------CPU 時鐘

    ????????DMA_TINT2 --------CPU 時鐘

    ????????DMA_MXEVTA --------McBSP-A

    ????????DMA_MREVTA --------McBSP-A

    ????????DMA_MXREVTB --------McBSP-B

    ????????DMA_MREVTB --------McBSP-B

    ②perinte--使能觸發(fā)源,值為 PERINT_DISABLE 或 PERINT_ENABLE。

    ③oneshot--使能 oneshot 模式,值為 ONESHOT_DISABLE 或 ONESHOT_ENABLE。此模式下,一次觸發(fā)完成全部 burst。

    ④cont--使能 Continuous 模式,值為 CONT_DISABLE 或 CONT_ENABLE。此模 式下,傳送完畢后 DMA 重新被初始化,并等待觸發(fā)源。

    ⑤synce--使能外圍設(shè)備同步,值為 SYNC_DISABLE 或 SYNC_ENABLE。

    ⑥syncsel--同步選擇。值為 SYNC_SRC 或 SYNC_DST。

    ⑦ovrinte--使能溢出中斷。值為 OVRFLOW_DISABLE 或 OVEFLOW_ENABLE。

    ⑧datasize--每次傳送位數(shù)。值為 SIXTEEN_BIT 或 THIRTYTWO_BIT。

    ⑨chintmode--通道中斷產(chǎn)生模式。CHINT_BEGIN:傳送開始發(fā)中斷。 CHINT_END:傳送結(jié)束發(fā)中斷。

    ⑩chinte--使能通道中斷。值為 CHINT_DISABLE 或 CHINT_ENABL

  • 上例程,

    void DMACH1_ADC_Init(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source) {EALLOW;SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA ClockEDIS;// Initialize DMADMAInitialize();// Configure DMA ChannelDMACH1AddrConfig(DMA_Dest,DMA_Source);DMACH1BurstConfig(3,1,1); //每幀傳4個數(shù),每傳一個數(shù)指針加1DMACH1TransferConfig(9,1,1); //傳10幀數(shù)據(jù)觸發(fā)中斷,每幀之間指針加1DMACH1WrapConfig(0ffff,0,0ffff,0); //關(guān)閉打包DMACH1ModeConfig(DMA_SEQ1INT, //觸發(fā)源SEQ1PERINT_ENABLE, //使能觸發(fā)源ONESHOT_DISABLE, //關(guān)閉單次運行CONT_ENABLE, //使能連續(xù)運行SYNC_DISABLE, //關(guān)閉同步SYNC_SRC, //和源設(shè)備同步OVRFLOW_DISABLE, //關(guān)閉溢出中斷SIXTEEN_BIT, //16位傳送CHINT_END, //傳送結(jié)束產(chǎn)生中斷CHINT_ENABLE); //使能中斷通道StartDMACH1(); //啟動DMA}interrupt void local_DINTCH1_ISR(void) // DMA Channel 1 {// To receive more interrupts from this PIE group, acknowledge this interruptPieCtrlRegs.PIEACK.bit.ACK7 = 1;// asm (" ESTOP0");//ok // for(;;); }

    待續(xù)。。

    總結(jié)

    以上是生活随笔為你收集整理的DSP28335学习记录(四)——ADC、DMA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。