DSP28335学习记录(四)——ADC、DMA
本文記錄一下仿真模式下的printf()的使用,ADC,DMA,
目錄
一、仿真模式下的printf()
二、ADC
?2.1 ADC模式
2.2 觸發源,中斷,覆蓋功能
2.3 如何初始化配置
三、DMA
一、仿真模式下的printf()
這塊推薦這個:CCS中printf()的使用
其實想找一下用仿真器的COM口做串口的方法,沒有找到。這個在CCS仿真模式下直接用printf的方式,還挺方便的。
二、ADC
F28335 的 ADC 模塊主要包括以下特點:
- --12 位模數轉換
- --2 個采樣保持器(S/H)
- --同時或順序采樣
- --模擬電壓輸入范圍 0-3V
- --ADC 轉換時鐘頻率最高可配置為 25MHz,采樣帶寬 12.5MHz
- --16 通道模擬輸入
- --排序器支持 16 通道獨立循環“自動轉換”,每次轉換通道可以軟件編程 選擇。
- --16 個結果寄存器存放 ADC 轉換的結果,轉換后的數字量表示為: 數字值=4095*(輸入模擬值-ADCLO)/3,輸入模擬值在 0-3V 之間
-
--多個觸發源啟動 ADC 轉換(SOC):?
①S/W--軟件立即啟動
②外部引腳
③ePWMx SOCA 啟動
④ePWMx SOCB 啟動
- --靈活的中斷控制,允許每個或者每隔一個序列轉換結束產生中斷請求
- --排序器可工作在啟動/停止模式
- --采樣保持(S/H)采集時間窗口有獨立的預定標控制
在使用 ADC 轉換模塊時,特別要注意的是 F28335 的 AD 的輸入范圍 0-3V,若 輸入負電壓或高于 3V 的電壓就會燒壞 AD 模塊,這一點要務必引起重視。超出輸 入范圍的電壓可在前級電路,通過電阻進行分壓,或經運放比例電路進行處理后 再輸入。連接到 ADCINxx 引腳的模擬輸入信號要盡可能的遠離數字電路信號線, ADC 模塊的電源供電要與數字電源電源隔離開,避免數字電源的高頻干擾,ADC 的參考源是影響 AD 精度的一個重要因數,注意 ADC 參考源的電壓紋波處理
ADC的內部框圖:16個輸入通道,分AB兩組,兩個采樣保持器,一個轉換模塊,兩個排序器。
由于有兩個采樣保持器,所以根據工作方式分:順序采樣,同步采樣。后面講。
雙排序器根據工作方式分:級聯模式,雙排序器模式。
以上兩個模塊排列組合,ADC共有4中模式。
?2.1 ADC模式
1,級聯模式
在級聯排序器操作方式下,2 個 8 狀態排序器(SEQ1 和 SEQ2)構成一個 16狀態的排序SEQ。只能設置一個觸發源,按照順序轉換。
2,雙排序器模式
兩個排序器獨立運行,分別獨立設置一個觸發源,只有一個AD轉換模塊,所以分時復用,轉換順序下圖。?
3,順序采樣
和級聯排序模式下一樣,就是按照順序轉換。級聯排序其順序采樣也是最常用的模式。
4,同步采樣
如果一個輸入來自 ADCINA0-ADCINA7,另一個輸入來自 ADCINB0-ADCINB7, ADC 能夠實現 2 個 ADCINxx 輸入的同時采樣。此外,要求 2 個輸入必須有同樣的 采樣和保持偏移量(比如 ADCINA4 和 ADCINB4,不能是 ADCINA7 和 ADCINA6)。 為了讓 ADC 模塊工作在同步采樣模式,必須設置 ADCTRL3 寄存器中的 SMODE_SEL 位為 1。
在同步采樣模式下,CONVxx 寄存器的最高位不起作用,每個采樣和保持緩沖 器對 CONVxx 寄存器低 3 位確定的引腳進行采樣。例如,如果 CONVxx 寄存器的值 是 0110b,ADCINA6 就由采樣保持器 A 采樣,ADCINB6 有采樣保持器 B 采樣,和 1110b 的效果是一樣的,如果 CONVxx 寄存器的值是 1001b,ADCINA1 由采樣和保 持器 A 采樣,ADCINB1 由采樣和保持器 B 采樣。采樣保持兩路可以同步進行,因 為有兩個采樣保持器,但是轉換不可能同時進行。轉換器首先轉換采樣保持器 A 中鎖存的電壓量,然后轉換采樣保持器 B 中鎖存的電壓量。采樣保持器 A 轉換的 結果保存到當前的 ADCRESULTn 寄存器(如果排序器已經復位,SEQ1 的結果放到 ADCRESULT0),采樣保持器 B 轉換的結果保存到下一個(順延)ADCRESULTn 寄 存器(如果排序器已經復位,SEQ1 的結果放到 ADCRESULT1),結果寄存器指針 每次增加 2。
2.2 觸發源,中斷,覆蓋功能
1,觸發源
2,中斷
?在不同工作模式下如何使用中斷模式 1 和中斷模式 2。
情形 1:在第 1 個和第 2 個序列中采樣的數量不相等。
(1)中斷模式 1(每個 EOS 到來時產生中斷請求)
①排序器用 MAX_CONVn=1 初始化,轉換 I1 和 I2。
②在中斷服務子程序 a 中,通過軟件將 MAX_CONVn 的值設為 2,轉換 V1、V2 和 V3。
③在中斷服務子程序 b 中,完成下列任務:
--將 MAX_CONVn 的值再次設置為 1,轉換 I1 和 I2。
--從 ADC 結果寄存器中讀出 I1、I2、V1、V2 和 V3 的值。
--復位排序器。
④重復操作第②、③步。每次 SEQ_CNTRn 等于 0 時產生中斷,并且中斷能夠 被識別。
情形 2:在第 1 個和第 2 個序列中采樣的數量相等。
(2)中斷模式 2 操作(每隔一個 EOS 信號產生中斷請求)
①排序器設置 MAX_CONVn=2 初始化,轉換 I1、I2、I3 或 V1、V2 和 V3。
②在服務子程序 b 和 d 中,完成下列任務。
--從 ADC 結果寄存器中讀出 I1、I2、I3 或者 V1、V2 和 V3 的值。
--復位排序器。
--重復第②步。
情形 3:兩個序列的采樣個數是相等的(帶空讀)
(3)中斷模式 2(隔一個 EOS 信號產生中斷請求)
①MAX_CONVn=2,初始化序列器,轉換 I1、I2 和 x(空采樣)。
②在中斷服務子程序 b 和 d 中,完成下列任務:
--從 ADC 結果寄存器中讀出 I1、I2、x、V1、V2 和 V3 的值。
--復位排序器。
--重復第②步。在①中,I1、I2 后的 X 采樣為一個空的采樣,其實并沒有要求采樣。然而利用模式 2 間隔產生中斷請求的特性,可以減小中斷服務子程序和 CPU 的開銷。
3,排序器覆蓋功能:(開DMA時,需要使能)
通常在運行模式下,排序器 SEQ1、SEQ2 或者級聯 SEQ 用于選擇 ADC 通道, 并將轉換的結果存儲在相應的 ADCRESULTn 寄存器中。在 MAX_CONVn 設置的轉換 結束時,排序器自動返回 0。在使用排序器覆蓋功能時,排序器的自動返回可通 過軟件控制,這由 ADC 控制寄存器 1(ADCCTRL1)的第 5 位控制。例如假定 SEQOVRD 位為 0,ADC 工作在級聯模式下的連續轉換模式,MAX_CONV1 設置為 7,通常情況 下,排序器會遞增并將 ADC 轉換結果更新結果寄存器到 ADCRESULT7 寄存器,然 后返回到 0,。當 ADCRESULT7 寄存器更新完成后,相應的中斷標志位被置位。當 SEQ_OVRD 位被重新置位,排序器在更新 7 個結果寄存器后不再回繞到 0,而將繼 續增加,并更新 ADCRESULT8 寄存器,直到 ADCRESULT15 為止。ADCRESULT15 寄 存器更新完畢再返回到 0。這可以將結果寄存器看成 FIFO,用于 ADC 對連續數據 的捕捉。當 ADC 在最高數據速率下進行轉換時,這個功能有助于捕捉 ADC 的數據
2.3 如何初始化配置
ADC有8個設置寄存器,不過使用起來很簡單。
ADC配置步驟:
1,ADC外設時鐘使能
2,高速外設時鐘分頻。從系統時鐘進入ADC模塊的,最高25M。
3,ADC初始化。
4,ADC內核時鐘分頻。用于ADC轉換的。
5,采樣持續時間。
6,排序器模式
7,采樣方式。
8,設置輸入通道,開幾個口就設置幾個。
9,設置最大通道數。
10,設置是否連續轉換。
(11,排序器覆蓋模式使能,開DMA時)
(12,使能SOC觸發。用SOC信號觸發模式時)
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; //采樣持續時間,最大值AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 級聯模式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; //最大轉換通道數AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 非連續轉換模式AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; //// Start SEQ1AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //使能epwm_SOCA信號的觸發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用起來很簡單,只是幾個功能函數參數可能有點不好理解。
DMA配置方式:
1,使能DMA外設時鐘,
2,初始化DMA。
3,配置下面幾個函數:
????????DMACH1AddrConfig
????????DMACH1BurstConfig
????????DMACH1TransferConfig
????????DMACH1WrapConfig
????????DMACH1ModeConfig
4,啟動DMA。
DMACH1BurstConfig:幀函數,一個觸發信號執行一次
三個參數:
數據個數(類型Uint16),
每傳一個數據,源指針增加量,
每傳一個數據,目的指針增加量。
DMACH1TransferConfig:傳輸函數,主要設置幾幀數據產生一個中斷
三個參數:
幀個數,達到數會產生中斷,
每傳一幀,源指針增加量,
每傳一幀,目的指針增加量。
?DMACH1WrapConfig:打包函數,主要設置返回步長。
四個參數:
執行多少幀,源指針將返回,
源指針返回之后,加上一個偏移量。
執行多少幀,目的指針將返回,
目的指針返回之后,加上一個偏移量。
(其實不難理解,我們看一下寄存器的說明就清楚了。)
細心的可能發現 DMACH1TransferConfig 和 DMACH1WrapConfig 指針偏移量某些情況下好像有功能重合。數據手冊中提到過,DMACH1WrapConfig設置偏移量時,會忽略DMACH1TransferConfig的偏移量。DMACH1WrapConfig的打包幀個數大于DMACH1TransferConfig時,DMACH1WrapConfig將失效。?
DMACH1ModeConfig是DMA配置寄存器:
①persel--選擇觸發源,值為下列選項:
????????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--使能觸發源,值為 PERINT_DISABLE 或 PERINT_ENABLE。
③oneshot--使能 oneshot 模式,值為 ONESHOT_DISABLE 或 ONESHOT_ENABLE。此模式下,一次觸發完成全部 burst。
④cont--使能 Continuous 模式,值為 CONT_DISABLE 或 CONT_ENABLE。此模 式下,傳送完畢后 DMA 重新被初始化,并等待觸發源。
⑤synce--使能外圍設備同步,值為 SYNC_DISABLE 或 SYNC_ENABLE。
⑥syncsel--同步選擇。值為 SYNC_SRC 或 SYNC_DST。
⑦ovrinte--使能溢出中斷。值為 OVRFLOW_DISABLE 或 OVEFLOW_ENABLE。
⑧datasize--每次傳送位數。值為 SIXTEEN_BIT 或 THIRTYTWO_BIT。
⑨chintmode--通道中斷產生模式。CHINT_BEGIN:傳送開始發中斷。 CHINT_END:傳送結束發中斷。
⑩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個數,每傳一個數指針加1DMACH1TransferConfig(9,1,1); //傳10幀數據觸發中斷,每幀之間指針加1DMACH1WrapConfig(0ffff,0,0ffff,0); //關閉打包DMACH1ModeConfig(DMA_SEQ1INT, //觸發源SEQ1PERINT_ENABLE, //使能觸發源ONESHOT_DISABLE, //關閉單次運行CONT_ENABLE, //使能連續運行SYNC_DISABLE, //關閉同步SYNC_SRC, //和源設備同步OVRFLOW_DISABLE, //關閉溢出中斷SIXTEEN_BIT, //16位傳送CHINT_END, //傳送結束產生中斷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(;;); }待續。。
總結
以上是生活随笔為你收集整理的DSP28335学习记录(四)——ADC、DMA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使jets3t支持https
- 下一篇: 记录关于富文本编辑器出现的不能插入图片问