<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

CW32數字電壓電流表軟件教程(五):ADC采樣及顯示

武漢芯源半導體 ? 來源:CW32生態社區 ? 2024-05-21 10:34 ? 次閱讀

6.1. ADC基礎知識

6.1.1. 什么是ADC

模擬數字轉換器即A/D轉換器,或簡稱ADC,通常是指一個將模擬信號轉變為數字信號電子元件。通常的模數轉換器是將一個輸入電壓信號轉換為一個輸出的數字信號。由于數字信號本身不具有實際意義,僅僅表示一個相對大小。故任何一個模數轉換器都需要一個參考模擬量作為轉換的標準,比較常見的參考標準為最大的可轉換信號大小。而輸出的數字量則表示輸入信號相對于參考信號的大小。

6.1.2. CW32的ADC介紹

CW32F003 內部集成一個 12 位精度、最高 1M SPS 轉換速度的逐次逼近型模數轉換器 (SAR ADC),最多可將 16 路模擬信號轉換為數字信號?,F實世界中的絕大多數信號都是模擬量,如光、電、聲、圖像信號等,都要由 ADC 轉換成數字信號,才能由 MCU 進行數字化處理。

要特性

12 位精度

編程轉換速度,最高達 1M SPS

16 路輸入轉換通道

- 13 路外部引腳輸入

- 內置溫度傳感器

- 內置 BGR 1.2V 基準

- 1/3 VDD 電源電壓

4 路參考電壓源(Vref)

- VDD 電源電壓

- ExRef(PB04)引腳電壓

- 內置 1.5V 參考電壓

- 內置 2.5V 參考電壓

采樣電壓輸入范圍:0 ~ Vref

多種轉換模式,全部支持轉換累加功能

- 單次轉換

- 多次轉換

- 連續轉換

- 序列掃描轉換

- 序列斷續轉換

支持單通道、序列通道兩種通道選擇,最大同時支持 4 個序列

支持輸入通道電壓閾值監測

內置信號跟隨器,可轉換高阻抗輸入信號

支持片內外設自動觸發 ADC 轉換

6.1.3. ADC基本參數

分辨率:表示ADC轉換器的輸出精度,通常以位數(bit)表示,比如8位、10位、12位等,位數越高,精度越高。

采樣率:表示ADC對模擬輸入信號進行采樣的速率,通常以每秒采樣次數(samples per second,SPS)表示,也稱為轉換速率,表示ADC能夠進行多少次模擬到數字的轉換。

采樣范圍:指ADC可以采集到的模擬輸入信號的電壓范圍,范圍見下:

0 ≤ ADC ≤ Vref

Vref 為參考電壓,CW32F003有四路電壓參考源見上文。

6.1.4. 基本原理

CW32F003采用的是逐次逼近型的12位ADC,逐次逼近型ADC是一種常見的ADC工作原理,它的思想是通過比較模擬信號與參考電壓之間的大小關系來逐步逼近輸入信號的數字表示。在逐次逼近型ADC中,輸入信號和參考電壓被加入一個差分放大器中,產生一個差分電壓。

然后,這個差分電壓被輸入到一個逐步逼近的數字量化器中,該量化器以逐步遞減的方式將其與一系列參考電壓進行比較。具體來說,在每個逼近階段,量化器將輸入信號與一個中間電壓點進行比較,將該電壓點上方或下方的參考電壓作為下一個逼近階段的參考電壓。這個過程一直持續到量化器逼近到最終的數字輸出值為止。

我們數字電壓電流表的采樣電路原理圖如下圖所示,

de92337a-1710-11ef-b74b-92fbcf53809c.png

圖6-1 電壓采樣電路原理圖

如果使用1.5V作為參考電壓,根據R8和R7的阻值配比可以得到最高采樣電壓為:

1.5 / 10 * (220 + 10)= 34.5V

電流采樣的電路原理圖見圖6-2,對電流采樣本質上是對檢流電阻的電壓進行采樣。

dec9a90e-1710-11ef-b74b-92fbcf53809c.png

圖6-2 電流采樣原理圖

6.2. ADC優點

1.數字信號具有良好的抗干擾性。數字信號是由一系列離散的數字表示,因此可以抵抗模擬信號受到的各種干擾,如噪聲、漂移等。

2.方便數字信號的存儲、處理和傳輸。由于數字信號是離散的,因此它們可以輕松存儲在計算機內存或其他數字設備中,方便進行處理和傳輸。

3.具有可編程性?,F代的ADC出現了很多可編程的功能,例如可編程增益、采樣率和濾波器等,可以根據不同的應用場景進行優化。

4.適用性廣泛。ADC被廣泛應用于工業、通信、醫療、電子測量、音頻、視頻等領域,可轉換各種不同類型的模擬信號,包括電壓、電流、聲音、光信號等。

6.3. ADC應用

ADC的應用非常廣泛。例如,我們可以用ADC將傳感器的模擬信號轉換為數字信號,然后通過計算機進行處理和分析;ADC在音頻處理中也起著重要的作用,將模擬聲音信號轉換為數字信號,并接下來進行數字信號處理;無線電通信中的信號調制也需要使用ADC等??偟膩碚f,ADC在現代電子工程中非常重要,是數字信號處理和控制技術的關鍵部分。

6.4. ADC采樣顯示

在下面我們對CW32F003的ADC通道進行配置,輸入5V電壓給電壓表,CW32將采樣得到的值輸入數碼管顯示,對ADC通道的配置代碼如下;

#include "ADC.h"


uint16_t Volt_Buffer;        //存放ADC采樣值


void ADC_init(void)
{
    ADC_InitTypeDef     ADC_InitStructure;         //ADC配置結構體
    ADC_SerialChTypeDef ADC_SerialChStructure;     //ADC序列通道結構體
    GPIO_InitTypeDef    GPIO_Init_Struct;


    __RCC_GPIOB_CLK_ENABLE(); //打開ADC對應引腳時鐘   
    __RCC_ADC_CLK_ENABLE();   // 打開ADC時鐘


    GPIO_Init_Struct.IT   = GPIO_IT_NONE;
    GPIO_Init_Struct.Mode = GPIO_MODE_ANALOG;//將GPIO的模式配置成模擬功能
    GPIO_Init_Struct.Pins = GPIO_PIN_1;      // PB01是電壓采集引腳
    GPIO_Init(CW_GPIOB, &GPIO_Init_Struct);
    PB01_ANALOG_ENABLE();                    //使能模擬引腳


    ADC_StructInit(&ADC_InitStructure);      // ADC默認值初始化
    ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4; //ADC工作時鐘配置 PCLK/4 = 6/4 = 1.5Mhz


/*信號電壓較低時,可以降低參考電壓來提高分辨率。改變參考電壓后,同樣二進制表示的電壓值就會不一樣,
  最大的二進制(全1)表示的就是你的參考電壓,在計算實際電壓時,就需要將參考電壓考慮進去。*/
    ADC_InitStructure.ADC_VrefSel    = ADC_Vref_BGR1p5;//參考電壓設置為1.5V
    //由于電壓信號為慢速信號,ADC采樣時間為十個ADC采樣周期以確保準確 
    ADC_InitStructure.ADC_SampleTime = ADC_SampTime10Clk;
    //Sqr為序列配置寄存器,這里只用到了序列0的通道,所以配置成0表示只轉換Sqr0序列
    ADC_SerialChStructure.ADC_SqrEns     = ADC_SqrEns0;     
    ADC_SerialChStructure.ADC_Sqr0Chmux  = ADC_SqrCh9;//配置ADC序列,PB01是ADC的第9通道
    ADC_SerialChStructure.ADC_InitStruct = ADC_InitStructure; //ADC初始化


    ADC_SerialChContinuousModeCfg(&ADC_SerialChStructure);   //ADC序列連續轉換模式配置
    ADC_ClearITPendingAll();           //清除ADC所有中斷狀態
    ADC_Enable();                      // ADC使能
    ADC_SoftwareStartConvCmd(ENABLE);  //ADC轉換軟件啟動命令
}


void Get_ADC_Value(void)               //取得ADC采樣的值傳給全局變量Volt_Buffer
{
    ADC_GetSqr0Result(&Volt_Buffer);
}

在主函數中初始化ADC后在BTIM1的中斷服務程序中調用 Get_ADC_Value 得到ADC采樣的值,再在主函數的 while 循環中調用數碼管顯示函數 Display 將ADC采樣值顯示到數碼管上。下圖為數字電壓電流表接入5V電壓時的采樣顯示圖??梢钥吹浇尤?V時ADC采樣得到669,我們可以計算:

(669/4096)* [(1.5/10)*(200+10)] = 5.145 V

其中4096代表CW32的ADC采樣精度12位為2^12=4096,由于我們的測試樣品中220KΩ的電阻被替換成了200KΩ,所以計算公式如上,與萬用表測量數值相符。(各位學員最終收到的版本是220KΩ的電阻)

deff60ee-1710-11ef-b74b-92fbcf53809c.png

圖6-3 ADC采樣顯示

df242992-1710-11ef-b74b-92fbcf53809c.png

圖6-4 萬用表測量5V

6.5. ADC采樣計算

根據上文,ADC所采樣的值雖然準確地顯示在數碼管上,但采樣值仍需要轉換成標準值。計算思路與上述公式類似,只是顯示到數碼管上需要將數值擴大100倍。因此采樣計算的思路為:將采樣得到的值(比如在5V輸入的情況下ADC采樣得到668)用上述計算公式計算得到的結果后乘以100:

(668/4096)* [(1.5/10)*(200+10)] * 100 = 513.7 V

由于變量為整形,最終輸入給顯示函數 Display 的值為513,在 Display 函數里對輸入的值進行判定,如果輸入值大于1000,則數碼管只能顯示xx.x V,所以我們只取輸入值的千百十位;如果輸入值小于1000,比如現在輸入值為513,則數碼管可顯示x.xx V,分別將513的百十個位存入 Seg_Reg 數組中。

最終需要添加一個 Cal_Buffer 變量來存儲 Volt_Buffer 的值、一個電壓計算函數,再修改 Display 函數見下文:

uint16_t Cal_Buffer;  //存儲 Volt_Buffer 的值


#define ADC_REF_VALUE (1500) //擴大1000倍  1.5 * 1000 = 1500
#define R2            (200) //單位:KΩ
#define R1            (10)


void Volt_Cal(void)   //將ADC采樣值轉化為標準值
{
  Cal_Buffer = Volt_Buffer;   //存儲中斷服務程序中取得的ADC采樣值
  Cal_Buffer = (Cal_Buffer * ADC_REF_VALUE >> 12) * (R2 + R1)/R1;//計算得到的值為標準值的1000倍


    if(Cal_Buffer % 10 >= 5)     // 四舍五入
    {
        Cal_Buffer = Cal_Buffer / 10 + 1;  
    }
    else
    {
        Cal_Buffer = Cal_Buffer / 10;   //此時的值為標準值的100倍
    }
}

在 while 循環中調用數碼管顯示函數 Display 之前先調用 Volt_Cal 函數。

int main()
{
  RCC_Configuration();
  Seg_Init();
  Btim1_Init();
  ADC_init();


  while(1)
    {
      Volt_Cal();
      Display(Cal_Buffer); 
    }
}

Display 函數的更新如下:

void Display(uint32_t value)
{
  uint8_t Thousands;   //千位
  uint8_t Hundreds;    //百位
  uint8_t Tens;        //十位
  uint8_t Units;       //個位


  Thousands = value / 1000;     //如果輸入值大于1000,只取輸入值的千百十位
  if(Thousands > 0)             //大于0則說明輸入值的千位有值
    {
       Units     = value % 10;
       value     = Units > 5 ? (value + 10) : value; // 根據后一位四舍五入
       Thousands = value / 1000 % 10;                //只取千百十位
       Hundreds  = value / 100 % 10;
       Tens      = value / 10 % 10;


       // 顯示xx.x伏
       Seg_Reg[0] = Thousands;
       Seg_Reg[1] = Hundreds + 10; // 加dp顯示
       Seg_Reg[2] = Tens;
    }


  else                            //如果輸入值的千位沒有值,則取百十個位
    {
        Units     = value % 10;
        Tens      = value / 10 % 10;
        Hundreds  = value / 100 % 10;


        // 顯示x.xx伏
        Seg_Reg[0] = Hundreds + 10; // 加dp顯示
        Seg_Reg[1] = Tens;
        Seg_Reg[2] = Units;
    }
}
最終顯示效果如下圖(輸入接5V):

df5a0bfc-1710-11ef-b74b-92fbcf53809c.png

圖6-5 采樣計算后顯示值 此時萬用表測得電壓如下:

df91094a-1710-11ef-b74b-92fbcf53809c.png

圖6-6 萬用表測量值(5V)



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 差分放大器
    +關注

    關注

    8

    文章

    421

    瀏覽量

    51697
  • 電源電壓
    +關注

    關注

    2

    文章

    932

    瀏覽量

    23648
  • ADC采樣
    +關注

    關注

    0

    文章

    134

    瀏覽量

    12738
  • 模擬數字轉換器

    關注

    0

    文章

    74

    瀏覽量

    12414
  • 電壓電流表
    +關注

    關注

    0

    文章

    24

    瀏覽量

    2034

原文標題:CW32數字電壓電流表軟件教程-實驗五:ADC采樣及顯示

文章出處:【微信號:武漢芯源半導體,微信公眾號:武漢芯源半導體】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CW32數字電壓電流表-產品硬件設計要點

    主要功能: 1、對5-99V的電壓與0.1-3A的電流進行測量與顯示 2、通過藍牙發送測得的數據 3、作為一款CW32+數碼管的迷你開發板 設計要點: 1、使用
    的頭像 發表于 04-25 15:20 ?1368次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>數字</b><b class='flag-5'>電壓電流表</b>-產品硬件設計要點

    CW32數字電壓電流表軟件教程(一):LED原理與驅動基礎知識詳解

    LED 驅動指的是通過穩定的電源為 LED 提供合適的電流電壓,使其正常工作點亮。LED 驅動方式主要有恒流和恒壓兩種。
    的頭像 發表于 05-06 15:33 ?1083次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>數字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>(一):LED原理與驅動基礎知識詳解

    CW32數字電壓電流表軟件教程(三):數碼管顯示數字

    數碼管的顯示原理是由多個發光的二極管共陰極或者共陽極組成的成“8”字形的顯示器件。數碼管通過不同的組合可用來顯示數字0~9、字符A ~ F及小數點“.”。
    的頭像 發表于 05-14 14:20 ?1830次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>數字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>(三):數碼管<b class='flag-5'>顯示</b><b class='flag-5'>數字</b>

    CW32數字電壓電流表軟件教程-實驗三:數碼管顯示數字

    原理是由多個發光的二極管共陰極或者共陽極組成的成“8”字形的顯示器件。數碼管通過不同的組合可用來顯示數字0~9、字符A ~ F及小數點“.”。數碼管的工作原理是通過控制外部的I/O端口進行驅動數碼管的各個
    的頭像 發表于 05-31 15:21 ?618次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>數字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實驗三:數碼管<b class='flag-5'>顯示</b><b class='flag-5'>數字</b>

    電流表電壓表的選擇和使用

    。使用電流表時要將電流表串聯接人被測電路。在測量較高電壓電路的電流時,電流表應串聯接在被測電路中的低電位端,如圖1(a)所示。如果錯接成并聯
    發表于 02-08 09:23

    關于電流表前級采樣有尖峰如何濾波

    [tr=transparent]我用單片機做了一個電流表,電流表前期用的LM358放大,但是前級采樣的輸入負載引起有尖峰,實際電壓130毫伏,但是尖峰
    發表于 04-10 19:53

    求個最簡單的labview電壓表電流表,能實時顯示電壓電流就行

    求個最簡單的labview電壓表電流表,能測出電壓電流顯示就行我在做一個系統設計,里面需要用到電壓
    發表于 03-16 09:52

    數字電流表的設計

    1 應用背景1.1設計意義數字電流表的誕生打破了傳統電子測量儀器的模式和格局。它顯示清晰直觀、讀數準確,采用了先進的數顯技術,大大地減少了因人為因素所造成的測量誤差事件。數字
    發表于 08-06 06:22

    INA219電壓電流表的資料分享

    描述電壓電流表INA219這真的是一個很酷的小設備,它不僅可以讓你測量電流,還可以測量電壓。通過一點乘法,您甚至可以測量功率。在電壓方面,您可以直接超過 Arduino 5 伏的限制。
    發表于 08-18 07:16

    求:推薦微型寬溫數字電壓電流表

    各位大神: 因項目需求,需采購寬溫微型數字電壓電流表頭。工作溫度范圍是:-40°~60°,最低也要在-25°~50°。 不知群里的大神有推薦么?
    發表于 08-27 15:22

    CW Programmer CW32系列芯片燒錄工具配套軟件

    CW Programmer CW32系列芯片的燒錄工具配套軟件
    發表于 09-15 07:44

    淺談CW32系列模數轉換器(ADC

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

    基于CW32的物聯網應用

    CW32】基于CW32的物聯網應用
    的頭像 發表于 11-02 15:55 ?401次閱讀
    基于<b class='flag-5'>CW32</b>的物聯網應用

    CW32數字電壓電流表軟件教程-實驗四:數碼管動態顯示

    5.1.數碼管動態顯示原理 所謂動態掃描顯示即輪流向各位數碼管送出段碼和位碼,利用發光管的余輝和人眼視覺暫留作用,使人眼的感覺好像各位數碼管同時都在顯示。明確了原理,我們要使電壓電流表
    的頭像 發表于 05-31 15:23 ?109次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>數字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件教程</b>-實驗四:數碼管動態<b class='flag-5'>顯示</b>

    CW32數字電壓電流表軟件進階教程-1.電壓電流同時顯示

    基于[CW32數字電壓電流表軟件教程-實驗七:基本數據處理算法(均值濾波)],可以對電壓電流進行同時采集
    的頭像 發表于 05-31 15:50 ?140次閱讀
    <b class='flag-5'>CW32</b><b class='flag-5'>數字</b><b class='flag-5'>電壓電流表</b><b class='flag-5'>軟件</b>進階教程-1.<b class='flag-5'>電壓電流</b>同時<b class='flag-5'>顯示</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>