一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

【有那么點詳細的CW32學習筆記】ADC“自動模式”

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2024-03-04 18:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上個章節(jié)介紹了ADC的基本框架和用法,本章節(jié)會較為全面地講解如何靈活地使用ADC功能。

通常來說,外設執(zhí)行的各種命令都是由CPU發(fā)出的,比如我們需要進行AD轉(zhuǎn)換,就通過某個寄存器標志位啟動ADC,隨后用判斷函數(shù)去檢測執(zhí)行情況,亦或是開啟中斷功能,轉(zhuǎn)換完成之后會提示CPU,再由CPU判斷接下來該做什么。

這當然沒問題,不過有些時候,我們需要實現(xiàn)一些循環(huán)重復的功能,比如在做傅里葉分析的時候,需要按照固定間隔采集一定數(shù)量的數(shù)據(jù),比如采樣率1000Hz,共采集1024個數(shù)據(jù)。為了實現(xiàn)這個目標,當然可以使用軟件定時實現(xiàn),也可以使用定時器外設,在中斷服務函數(shù)中直接進行AD轉(zhuǎn)換來定時獲取數(shù)據(jù),但數(shù)據(jù)很多,若是還要進行快速傅里葉變換,CPU會在定時器中斷中花費很多時間來采集數(shù)據(jù),留給計算的時間就少了很多。有一種方案可以完美解決這類問題,不僅可以保證數(shù)據(jù)采集的精確性,還幾乎不需要CPU參與,那就是使用定時器觸發(fā)ADC轉(zhuǎn)換,而AD轉(zhuǎn)換完成之后會由DMA進行數(shù)據(jù)搬運,若CPU需要使用這批數(shù)據(jù),直接訪問數(shù)據(jù)進行讀取即可 。具體的邏輯關系如下圖所示。

圖片

這種組合涉及到DMA、ADC、定時器的使用,文章將詳細介紹上圖的聯(lián)動過程。

  • 按照順序,首先是定時器觸發(fā)AD轉(zhuǎn)換。

前文也提到過,一般來講可以用軟件開關去啟動AD轉(zhuǎn)換,此處并沒有用到這一功能,而是使用定時器觸發(fā),這是一種硬件觸發(fā)方式,且觸發(fā)源不屬于ADC外設本身,故而也是一種外部觸發(fā)方式。在ADC外設的配置項中,可以設置AD轉(zhuǎn)換的開啟是否由外部信號觸發(fā),只要ADC能正常使用,再配置好外部觸發(fā)源,我們就能用外部硬件信號觸發(fā)AD采集了。

注意!在實際使用中,外部觸發(fā)源不一定非得是定時器,它也可以是某個片外模塊提供的事件電平(完成事件會改變指定IO的電平,就和中斷一樣),最簡單的就是按鍵觸發(fā)的IO中斷。

  • 接下來是第二個部分,DMA功能的配置。

DMA,全名叫直接存儲器訪問,這個外設可以像CPU一樣訪問單片機內(nèi)部的各個存儲區(qū)(包括RAM和外設寄存器),但它只能做一件事情,就是數(shù)據(jù)搬運。通俗來說,數(shù)據(jù)存放在0-9共10個格子里面,DMA可以把這10個數(shù)據(jù)搬運到其他地方(并不會改變原本的值,效果類似賦值語句),而其他地方可以是同一個地方(將10個數(shù)據(jù)按順序搬運10次,最終一層層覆蓋到同一個地址),也可以是不同地方(將10個數(shù)據(jù)搬運10次并最終存放在10個不同地址的存儲空間)。

總體上來講DMA只做搬運這一個功能,除了搬運轉(zhuǎn)換完成的AD數(shù)據(jù),他還能用于各種數(shù)據(jù)接口(比如UART、SPI等),或是其他需要大量賦值的場合。

注意!****DMA并不能完全代替CPU進行數(shù)據(jù)轉(zhuǎn)移,因為DMA*不像* CPU那樣擁有全部存儲區(qū)域的訪問權(quán)限。

  • 最后是定時器的配置,這一部分沒什么變化,就是選擇一個可以用來觸發(fā)AD采集的定時器,按需求配置即可。不過需要注意的是,記得把溢出中斷打開,這個是AD轉(zhuǎn)換的啟動開關

介紹完了每一步需要做的事情,下面說說代碼應該怎么寫。我會貼出主要代碼,對于一些變量我會做說明但不做代碼展示(變量什么的自己隨便定義一個就行了呀?。?/em>

圖片

這段就是正常配置一個定時器,本案例中選擇的是通用定時器2,根據(jù)手冊,它可以觸發(fā)AD采集。

圖片

除最后一行,其余代碼與上一章節(jié)的初始化過程沒太大差別,只需把DMA功能開啟即可。這里補充一下其他配置項的說明:

  1. 時鐘頻率和采樣時鐘周期,如上一章說到的,采樣時間當然是越長越好,其中的時鐘頻率就是ADC外設從內(nèi)部時鐘電路獲得的時鐘信號,頻率越高,ADC速度越快,這個時鐘速度一定程度上決定了一個ADC的最大采樣速率(1秒內(nèi)完成的轉(zhuǎn)換次數(shù))。
  2. 右對齊設置。AD轉(zhuǎn)換的結(jié)果是存放在一個寄存器里面的,它本質(zhì)上是個二進制數(shù),右對齊就是將轉(zhuǎn)換結(jié)果的第0位放到最右邊,高位不為1的補0,若仍不清楚,可自行百度。
  3. 轉(zhuǎn)換結(jié)果累加。為滿足一些需求,ADC結(jié)果可能需要進行數(shù)據(jù)處理來減小誤差,求加權(quán)平均值是一種很常用的辦法,該功能開啟之后,每次轉(zhuǎn)換的結(jié)果都會直接累加,方便開發(fā)者取出后直接求平均值(所以實際上不要這個功能也可以)。
  4. 我們使用的是定時器觸發(fā)采樣,所以只需要使用單次采集模式就行了,ADC會在每次轉(zhuǎn)換完成之后停止并等待下一次采集的啟動信號(定時器溢出中斷)。

總的來說,一定記住要把外部觸發(fā)打開并綁定定時器2,隨后只要定時器2的標志位被置位一次,ADC就會啟動一次。

相對來說比較麻煩的是DMA的配置,要配置一個DMA,首先需要確定數(shù)據(jù)搬運的起點和終點 ,我們搬運的起點只有一個,就是ADC轉(zhuǎn)換結(jié)果寄存器,搬運的終點是一個1024大小的數(shù)組,其中起點被稱為源地址,終點被稱為目標地址,且這兩個地址都可以設置成自增模式(完成一次搬運之后,地址自動+1)。

圖片

關于DMA的初始化,DMA通常會有不止一個通道,每個通道都能獨立進行數(shù)據(jù)搬運,初始化函數(shù)需要開啟DMA的時鐘總線,打開要用的DMA通道的中斷。

圖片

關于DMA的啟動和配置:

傳輸模式 :DMA幫助CPU進行數(shù)據(jù)搬運,這難免會出現(xiàn)DMA和CPU傳輸沖突的情況,非鎖定傳輸會在DMA搬運數(shù)據(jù)的間隔內(nèi)預留時間間隙,必要時候CPU會搶占對外設的訪問權(quán)限,屆時CPU可進行數(shù)據(jù)傳輸,DMA只能等待CPU放棄對該外設的使用權(quán)限后才能繼續(xù)自己的數(shù)據(jù)傳輸。相對應的,還有鎖定傳輸,具體的功能在用戶手冊DMA章節(jié)有詳細介紹。

傳輸位寬 :根據(jù)需要搬運的數(shù)據(jù)長度進行選擇即可。

觸發(fā)方式和觸發(fā)源 :由于我們需要的是在AD轉(zhuǎn)換完成之后立刻進行數(shù)據(jù)搬運,所以DMA的觸發(fā)方式選擇為硬件觸發(fā),觸發(fā)源應該設置為ADC轉(zhuǎn)化為完成,這會讓DMA在每次ADC轉(zhuǎn)換完成之后都進行一次數(shù)據(jù)搬運,且不論ADC處于什么模式。

源地址和目標地址 :源地址設置為ADC數(shù)據(jù)寄存器,具體的地址有兩種辦法來獲取,一種是用圖中的辦法,對寄存器取地址,另一種辦法是直接查用戶手冊,找到ADC數(shù)據(jù)寄存器的基地址和偏移量計算得到地址(這種辦法最終填進去的是一個hex數(shù))。目標地址也是直接取地址數(shù)組即可。

地址自增 :我們不希望源地址有變動,故源地址設置成不自增;目標地址是一個數(shù)組,所以每搬運一次數(shù)據(jù)都要讓目標地址自增一個元素,這樣下一次搬運的時候,數(shù)據(jù)就會被正確寫入下一個格子。

傳輸次數(shù) :需求是采集1024個數(shù)據(jù),那傳輸次數(shù)自然是1024次。

全部配置完后完成DMA的功能初始化,隨后只需要啟動ADC、定時器、DMA功能即可,圖中代碼做了一個開關啟動,方便隨時關閉。關閉的時候清零定時器計數(shù)器是為了在下次啟動的時候讓定時采集依然準確。

準備工作基本完成,接下來還剩一些小細節(jié)需要處理,我們打開了DMA和定時器的中斷功能,他們會在完成搬運之后進入中斷服務函數(shù),至少得寫個清除標志位的語句,除此之外還要加一些小功能。

圖片

圖片

定時器的中斷服務函數(shù)只需要清除標志位即可,DMA的中斷函數(shù)除了清除標志位,還需要將采樣功能關掉(至少得把定時器關了)。如果使用的不是定時器觸發(fā),而是ADC的連續(xù)采樣模式,需要在這里手動關閉ADC,不然即使DMA完成了搬運,ADC還會繼續(xù)進行AD轉(zhuǎn)換,由于DMA搬運已經(jīng)完成了,自增的地址也不會自己變回去,之后就會出現(xiàn)“意想不到的”DMA錯誤搬運,但本案例中使用的是單次采集模式,ADC只在啟動之后采集一次,所以不必擔心ADC會連續(xù)采樣導致程序異常的問題。

現(xiàn)在快速編寫一個按鍵檢測函數(shù)并調(diào)用剛剛寫好的啟動代碼,其中的key_down變量會在按鍵中斷服務函數(shù)中被置位。

圖片圖片

再在main函數(shù)中循環(huán)調(diào)用這個按鍵檢測函數(shù),按鍵按下抬起后就會自動采集ADC數(shù)據(jù),這里我用vofa+上位機顯示一下采集的數(shù)據(jù)。

圖片

我這里采集的是單片機上定時器1輸出的50Hz方波,占空比為50%,周期為20ms,效果還不錯。

圖片

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • ADC
    ADC
    +關注

    關注

    0

    文章

    214

    瀏覽量

    16845
  • CW32
    +關注

    關注

    1

    文章

    255

    瀏覽量

    1251
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    那么點詳細CW32學習筆記】單片機啟動\庫函數(shù)構(gòu)成

    此篇文章是CW32F030C8T6的參考資料,很詳細,適合初學者。
    的頭像 發(fā)表于 08-10 11:13 ?1502次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】單片機啟動\庫函數(shù)構(gòu)成

    那么點詳細CW32學習筆記】通用定時器——輸出比較

    個要點步驟: 有時鐘源輸入、計數(shù)器工作、一個可以比較的值(自動重裝載值) 。其工作流程是這樣的:計數(shù)器會隨著時鐘源對時鐘源提供的脈沖進行計數(shù),計數(shù)值不斷上漲(或下降),如果計數(shù)值和自動重裝載值一樣,
    的頭像 發(fā)表于 12-28 11:24 ?1815次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】通用定時器——輸出比較

    那么點詳細CW32學習筆記】看手冊配置時鐘樹

    本章針對CW32F030C8T6的時鐘樹進行詳細解析,續(xù)第一章啟動文件的相關講解。
    的頭像 發(fā)表于 08-17 14:54 ?1486次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】看手冊配置時鐘樹

    那么點詳細CW32學習筆記】模數(shù)轉(zhuǎn)換器

    來說,想要判斷大小就需要有對比,因此該數(shù)字指示的電壓大小實際上是一個比較的結(jié)果。 ADC將需要測量的電壓信號Ut與已知電壓的信號U作比較,并最終輸出一個數(shù)字表示Ut相當于多少比例的U。 接下來就可以看看CW32ADC外設結(jié)構(gòu)框
    的頭像 發(fā)表于 02-29 09:41 ?1135次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】模數(shù)轉(zhuǎn)換器

    【應用筆記CW32 自舉程序中使用的 ISP 協(xié)議

    提供的 ISP 模式,通過 UART 串口方便地實現(xiàn)對 CW32 微控制器片上 FLASH主存儲器的擦除和燒寫。本應用筆記將介紹如何進入 CW32 微控制器 ISP
    發(fā)表于 06-06 13:26

    應用筆記(二)| 武漢芯源CW32自舉程序中使用的ISP協(xié)議

    CW32微控制器片上FLASH主存儲器的擦除和燒寫。本應用筆記將介紹如何進入CW32微控制器ISP模式,以及所使用的ISP協(xié)議,并詳細介紹
    的頭像 發(fā)表于 07-11 16:08 ?1921次閱讀
    應用<b class='flag-5'>筆記</b>(二)| 武漢芯源<b class='flag-5'>CW32</b>自舉程序中使用的ISP協(xié)議

    CW32 低功耗模式的特性介紹

    CW32系列芯片支持3種工作模式,運行模式、休眠模式以及深度休眠模式,本文以CW32L083為例
    的頭像 發(fā)表于 12-30 10:53 ?1562次閱讀
    <b class='flag-5'>CW32</b> 低功耗<b class='flag-5'>模式</b>的特性介紹

    cw32和gd32的區(qū)別

    cw32和gd32的區(qū)別 CW32和GD32是兩種不同的芯片系列,分別由WCH和GigaDevice公司推出,兩者很多不同之處,下面我們來詳細介紹。 首先從
    的頭像 發(fā)表于 08-16 11:15 ?2595次閱讀

    淺談CW32系列模數(shù)轉(zhuǎn)換器(ADC

    CW32系列模數(shù)轉(zhuǎn)換器(ADC
    的頭像 發(fā)表于 10-25 15:43 ?1708次閱讀
    淺談<b class='flag-5'>CW32</b>系列模數(shù)轉(zhuǎn)換器(<b class='flag-5'>ADC</b>)

    CW32的SPI單工模式主從通信介紹

    CW32的SPI單工模式主從通信介紹
    的頭像 發(fā)表于 10-24 15:50 ?1300次閱讀
    <b class='flag-5'>CW32</b>的SPI單工<b class='flag-5'>模式</b>主從通信介紹

    應用筆記-CW32 自舉程序中使用的 ISP 協(xié)議

    ,通過UART串口方便地實現(xiàn)對CW32微控制器片上FLASH主存儲器的擦除和燒寫。本應用筆記將介紹如何進入CW32微控制器ISP模式,以及所使用的ISP協(xié)議,并
    發(fā)表于 06-06 13:37 ?7次下載

    基于CW32的物聯(lián)網(wǎng)應用

    CW32】基于CW32的物聯(lián)網(wǎng)應用
    的頭像 發(fā)表于 11-02 15:55 ?1229次閱讀
    基于<b class='flag-5'>CW32</b>的物聯(lián)網(wǎng)應用

    那么點詳細CW32學習筆記】通用異步收發(fā)器—發(fā)送篇

    本章介紹CW32通用異步收發(fā)器的使用。 雖然大部分時候會被簡單稱為“串口”,但實際上 用“串口”來指代UART并不正確 。串口對應并口的概念,在串口通信中,數(shù)據(jù)被以二進制形式發(fā)送,并且每次發(fā)送都只
    的頭像 發(fā)表于 11-17 17:30 ?1253次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】通用異步收發(fā)器—發(fā)送篇

    那么點詳細CW32學習筆記】IIC接口-主機發(fā)送

    例程鏈接 : https://pan.baidu.com/s/1s1XwqDFkO8fK4SRSTKsNhA?pwd=mshk 提取碼 :mshk 本章將介紹CW32的IIC接口,并最終點亮一塊
    的頭像 發(fā)表于 01-11 09:53 ?993次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】IIC接口-主機發(fā)送

    那么點詳細CW32學習筆記】IIC接口-OLED驅(qū)動

    ,實際上就是密集LED點陣,所以必定有用于控制大量LED燈的驅(qū)動器,本教學使用的OLED驅(qū)動是SSD1306,該驅(qū)動器多種通信接口,這里使用IIC接口(具體使用什么接口,數(shù)據(jù)手冊上會有詳細介紹) 根據(jù)SSD1306數(shù)據(jù)手冊的描述,該設備的從機地址取決于SA0的電平,但
    的頭像 發(fā)表于 01-11 09:49 ?1205次閱讀
    【<b class='flag-5'>有</b><b class='flag-5'>那么點</b><b class='flag-5'>詳細</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】IIC接口-OLED驅(qū)動