內部參考電壓的使用應用筆記

来源:https://www.cnblogs.com/wchmcu/archive/2023/10/25/17787275.html
-Advertisement-
Play Games

內置參考電壓的使用 應用筆記 前言 CH32V/F 系列單片機能夠在一定的電壓範圍內進行工作,以 CH32V203C8T6 晶元為例,在不使用 USB 外設時,最低工作電壓能夠達到 2.4V。較為寬泛的工作電壓,允許單片機直接使用電池供電,但由於 CH32V203C8T6 晶元沒有獨立的 Vref ...


內置參考電壓的使用

應用筆記

 

前言

CH32V/F 系列單片機能夠在一定的電壓範圍內進行工作,以 CH32V203C8T6 晶元為例,在不使用 USB 外設時,最低工作電壓能夠達到 2.4V。較為寬泛的工作電壓,允許單片機直接使用電池供電,但由於 CH32V203C8T6 晶元沒有獨立的 Vref 引腳,使用 ADC 的過程中無法換算出真實的電壓。

為解決無法獲得真實電壓的問題,可以使用內置參考電壓換算當前供電電壓(即 ADC參考電壓)。對於項目要求精確測量時,也可嘗試使用該方法對 ADC 進行校準。

 

電源電壓的換算

CH32V203C8T6 晶元內部參考電壓是典型值為 1.2V,正負偏差為 0.04V 的電壓範圍,在 ADC 轉換精度要求不高的應用場景下,可以直接使用 1.2V 換算晶元供電電壓。

圖1 CH32V203C8T6 晶元數據手冊(V1.4)內部參考電壓截圖

如果需要更加精確的轉換結果,就應在穩定的供電條件下,先對內部參考電壓進行測量並將結果保存在 Flash 中,實際的使用過程中,再根據已知的內部參考電壓進行換算。

圖2 提供了內部參考電壓使用的流程。

圖2 內部參考電壓的使用

實現上述操作,可參考以下代碼。

u16 ADC_val = 0;
s32 val_mv = 0;
u16 Vref = 0;               // Flash中存儲的內部參考電壓實測值
s32 Vref_To_VDD = 0;        // 由Vref的實測值換算出的電源電壓值 

if ( *(u32*)(FAST_FLASH_PROGRAM_START_ADDR) == 0xe339e339 ) {       // 判斷Flash中是否有內部參考電壓的實測值
    printf("Address:0x%08x -> %08x\r\n", FAST_FLASH_PROGRAM_START_ADDR, *(u32*)(FAST_FLASH_PROGRAM_START_ADDR));
    // 獲取內部參考電壓實測值,此時務必保證電源電壓或參考電壓(如果有)的準確
    ADC_val = Get_ADC_Average(ADC_Channel_Vrefint, 255);            // 255次取平均
    ADC_val = Get_ConversionVal(ADC_val);
    val_mv = (ADC_val * 3300 / 4096);
    printf("Vref_mv -> %d\r\n", val_mv);
    // 將測得的結果存儲在Flash中
    buf[0] = val_mv;
    FLASH_Unlock_Fast();
    FLASH_ProgramPage_Fast(FAST_FLASH_PROGRAM_START_ADDR, buf);
    FLASH_Lock_Fast();
    printf("Address:0x%08x -> %08x\r\n", FAST_FLASH_PROGRAM_START_ADDR, *(u32*)(FAST_FLASH_PROGRAM_START_ADDR));
} else {
    printf("Address:0x%08x -> %08x\r\n", FAST_FLASH_PROGRAM_START_ADDR, *(u32*)(FAST_FLASH_PROGRAM_START_ADDR));
    Vref = *(u32*)(FAST_FLASH_PROGRAM_START_ADDR);
    ADC_val = Get_ADC_Average(ADC_Channel_Vrefint, 255);            // 255次取平均
    ADC_val = Get_ConversionVal(ADC_val);
    Vref_To_VDD = (4096 * Vref / ADC_val);
    printf("Vref_To_VDD_mV -> %d\r\n", Vref_To_VDD);
    }

 

ADC 初始化過程中的校準

ADC 初始化函數中完成了一次校準過程,經過校準環節可大幅減小因內部電容器組的變化而造成的精準度誤差。校準過程中 ADC 僅獲取了 Vcc 的採樣值,與實際電壓大小無關,因此,在浮動電壓供電的場景中,不會引入額外的誤差。

獲取校準值函數,通過寫 ADC_CTLR2 寄存器的 RSTCAL 位置 1 初始化校準寄存器,等待 RSTCAL 硬體清 0完成初始化。置位 CAL 位,啟動校準功能,校準結束後,硬體自動清除 CAL 位,將校準碼存儲到 ADC_RDATAR 中。使用多次校準結果,計算 ADC 補償。

int16_t Get_CalibrationValue(ADC_TypeDef *ADCx)
{
    __IO uint8_t  i, j;
    uint16_t      buf[10];
    __IO uint16_t t;
#if defined (CH32V20x_D6)
    __IO uint16_t p;
#endif

    for(i = 0; i < 10; i++){
        ADC_ResetCalibration(ADCx);
        while(ADC_GetResetCalibrationStatus(ADCx));
        ADC_StartCalibration(ADCx);
        while(ADC_GetCalibrationStatus(ADCx));
        buf[i] = ADCx->RDATAR;
//        printf("CalibrationValue[%d]->%d\r\n", i, buf[i]);
    }

    for(i = 0; i < 10; i++){
        for(j = 0; j < 9; j++){
            if(buf[j] > buf[j + 1])
            {
                t = buf[j];
                buf[j] = buf[j + 1];
                buf[j + 1] = t;
            }
        }
    }

#if defined (CH32V20x_D8) || defined (CH32V20x_D8W)
    t = 0;
    for( i = 0; i < 6; i++ ) {
        t += buf[i + 2];
    }

    t = ( t / 6 ) + ( ( t % 6 ) / 3 );

    return ( int16_t )( 2048 - ( int16_t )t );
#else
    t = 0;
    p = 0;
    /* 1024 */
    for(i = 0; i < 6; i++ ){
            if(buf[i+2] > 1536) break;
            t += buf[i+2];
    }

    if(i > 0){
            t = ( t / i ) + ( (( t % i )*2) / i );
    }
    else t = 1024;

    /* 2048 */
    j = 6-i;
    if(j > 0){
        for(; i < 6; i++ ){
                p += buf[i+2];
        }

        p = ( p / j ) + ( (( p % j )*2) / j );
    }
    else p = 2048;

    return ( int16_t )(((( int16_t )( 1024 - ( int16_t )t ) + ( int16_t )( 2048 - ( int16_t )p ))/2) + ((( int16_t )( 1024 - ( int16_t )t ) + ( int16_t )( 2048 - ( int16_t )p ))%2));

#endif
}

可以在校準值轉換的 for 迴圈中添加列印,觀察每次校準值結果是否隨晶元供電電壓(即 ADC 參考電壓)的改變而改變。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 閱讀本文前,需要先閱讀SpringMVC之RESTful概述 8.1、前期工作 8.1.1、創建實體類Employee package org.rain.pojo; import java.io.Serializable; /** * @author liaojy * @date 2023/10/1 ...
  • 後臺數據的處理語言有很多,Java 是對前端採集的數據的一種比較常見的開發語言。互聯網移動客戶端的用戶量特別大,大量的數據處理需求應運而生。可移動嵌入式設備的表現形式 很多,如 PC 端,手機移動端,智能手錶,Google 眼鏡等。Server2client 的互聯網開發模式比較常見,有一種新的數據 ...
  • MDI窗體的相關學習使用 1、設置MDI父窗體 在屬性中找到IsMdiContainer選項,設置為True 2、添加MDI子窗體,在項目中依次選擇添加->窗體,然後一直預設即可 添加後的項目目錄(Form1為父視窗,Form2、Form3為子視窗) 3、在Form1.cs中,創建對應MDI子視窗的 ...
  • 之前學習了一部分的C#基礎,但是感覺會的不多,很多地方依然需要通過做一點小Demo來進行鞏固,那麼這個C#的網路下載器,就來了 原理講解 首先我們編寫代碼之前,我們需要瞭解下網路下載的原理到底是什麼? 學習過C#中IO流部分的知識,或者你有其它的語言的基礎,學習過其它語言的文件IO的基礎,肯定瞭解過 ...
  • 一:背景 1. 講故事 上一篇我們聊到了 Console 為什麼會卡死,讀過那篇文章的朋友相信對 conhost.exe 有了一個大概的瞭解,這一篇更進一步聊一聊視窗的特殊事件 Ctrl+C 底層流轉到底是什麼樣的,為了方便講述,讓 chagtgpt 給我生成一段Ctrl+C 的業務代碼。 clas ...
  • C#棧和隊列的實現 用雙向鏈表實現一個隊列 public class DoubleNode { public int Value; public DoubleNode pre; public DoubleNode next; public DoubleNode(int value) { this.V ...
  • SSL和TLS 瞭解openssl之前,我們首先要瞭解SSL\TLS是什麼。 SSL(Secure Sockets Layer)是一個協議,叫作安全套接層協議。旨在為應用層數據提供加密的傳輸層通道。,即數據從應用層去往傳輸層,會首先被ssl給加密。 但是隨著時間的發展,SSL的繼任者TLS(Tran ...
  • 每次重裝系統後,都要重新安裝軟體,配置環境變數,極為繁瑣。故作環境環境變數備份,常用軟體恢復記錄,前提是你的軟體要安裝在非系統盤,D/E盤等 軟體安裝在非系統盤 開發軟體安裝在非系統盤,建好目錄。重裝系統後,只是重置系統盤,所以這些軟體不需要重新安裝。 譬如 java 相關目錄: PS D:\jav ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...