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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

CH32內(nèi)部參考電壓的自學(xué)筆記

撞上電子 ? 2023-12-14 08:00 ? 次閱讀

CH32V/F單片機(jī)能夠在一定的電壓范圍內(nèi)進(jìn)行工作,以CH32V203C8T6 芯片為例,在不使用 USB 外設(shè)時(shí),最低工作電壓能夠達(dá)到 2.4V。較為寬泛的工作電壓,允許單片機(jī)直接使用電池供電,但由于 CH32V203C8T6 芯片沒有獨(dú)立的 Vref 引腳,使用 ADC 的過程中無法換算出真實(shí)的電壓。為解決無法獲得真實(shí)電壓的問題,可以使用內(nèi)置參考電壓換算當(dāng)前供電電壓(即 ADC參考電壓)。對(duì)于項(xiàng)目要求精確測(cè)量時(shí),也可嘗試使用該方法對(duì) ADC 進(jìn)行校準(zhǔn)。

電源電壓的換算

CH32V203C8T6 芯片內(nèi)部參考電壓是典型值為 1.2V,正負(fù)偏差為 0.04V 的電壓范圍,在 ADC 轉(zhuǎn)換精度要求不高的應(yīng)用場(chǎng)景下,可以直接使用 1.2V 換算芯片供電電壓。

d97045dc-9a13-11ee-9788-92fbcf53809c.png

如果需要更加精確的轉(zhuǎn)換結(jié)果,就應(yīng)在穩(wěn)定的供電條件下,先對(duì)內(nèi)部參考電壓進(jìn)行測(cè)量并將結(jié)果保存在 Flash 中,實(shí)際的使用過程中,再根據(jù)已知的內(nèi)部參考電壓進(jìn)行換算。

d9830ac8-9a13-11ee-9788-92fbcf53809c.png

實(shí)現(xiàn)上述操作,可參考以下代碼:

u16 ADC_val = 0;s32 val_mv = 0;u16 Vref = 0; // Flash中存儲(chǔ)的內(nèi)部參考電壓實(shí)測(cè)值s32 Vref_To_VDD = 0; // 由Vref的實(shí)測(cè)值換算出的電源電壓值
if ( *(u32*)(FAST_FLASH_PROGRAM_START_ADDR) == 0xe339e339 ) { // 判斷Flash中是否有內(nèi)部參考電壓的實(shí)測(cè)值 printf("Address:0x%08x -> %08x\r\n", FAST_FLASH_PROGRAM_START_ADDR, *(u32*)(FAST_FLASH_PROGRAM_START_ADDR)); // 獲取內(nèi)部參考電壓實(shí)測(cè)值,此時(shí)務(wù)必保證電源電壓或參考電壓(如果有)的準(zhǔn)確 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); // 將測(cè)得的結(jié)果存儲(chǔ)在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 初始化過程中的校準(zhǔn)

ADC 初始化函數(shù)中完成了一次校準(zhǔn)過程,經(jīng)過校準(zhǔn)環(huán)節(jié)可大幅減小因內(nèi)部電容器組的變化而造成的精準(zhǔn)度誤差。校準(zhǔn)過程中 ADC 僅獲取了 Vcc 的采樣值,與實(shí)際電壓大小無關(guān),因此,在浮動(dòng)電壓供電的場(chǎng)景中,不會(huì)引入額外的誤差。獲取校準(zhǔn)值函數(shù),通過寫 ADC_CTLR2 寄存器RSTCAL 位置 1 初始化校準(zhǔn)寄存器,等待 RSTCAL 硬件清 0完成初始化。置位 CAL 位,啟動(dòng)校準(zhǔn)功能,校準(zhǔn)結(jié)束后,硬件自動(dòng)清除 CAL 位,將校準(zhǔn)碼存儲(chǔ)到 ADC_RDATAR 中。使用多次校準(zhǔn)結(jié)果,計(jì)算 ADC 補(bǔ)償。

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}

可以在校準(zhǔn)值轉(zhuǎn)換的 for 循環(huán)中添加打印,觀察每次校準(zhǔn)值結(jié)果是否隨芯片供電電壓(即 ADC 參考電壓)的改變而改變。

d996f196-9a13-11ee-9788-92fbcf53809c.png

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

    關(guān)注

    6050

    文章

    44703

    瀏覽量

    641300
  • 電壓
    +關(guān)注

    關(guān)注

    45

    文章

    5654

    瀏覽量

    116675
  • ch32
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    749
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CH32和stm32的庫(kù)函數(shù)一樣嗎?

    CH32和stm32的庫(kù)函數(shù)一樣嗎? STM32是ST公司推出的一款32位微控制器,其擁有強(qiáng)大的性能及豐富的外設(shè)功能,實(shí)現(xiàn)了嵌入式應(yīng)用的功能。而在STM32的開發(fā)中,庫(kù)函數(shù)是不可或缺的,因?yàn)樗?jiǎn)化
    的頭像 發(fā)表于 08-16 11:15 ?1188次閱讀

    ch32和stm32參數(shù)對(duì)比

    ch32和stm32參數(shù)對(duì)比 隨著物聯(lián)網(wǎng)技術(shù)、智能家居、工業(yè)自動(dòng)化等領(lǐng)域的快速發(fā)展,MCU芯片市場(chǎng)也逐漸走向多樣化和智能化。其中,32位微控制器不僅在性能、功能、可靠性方面更加優(yōu)越,而且在應(yīng)用領(lǐng)域
    的頭像 發(fā)表于 08-16 11:15 ?1991次閱讀

    ch32和stm32的區(qū)別

    ch32和stm32的區(qū)別 引言 STM32是STMicroelectronics基于ARM Cortex-M處理器架構(gòu)生產(chǎn)的一系列微控制器,而CH32是中國(guó)制造商WCH生產(chǎn)的一組微控制器。 在本文
    的頭像 發(fā)表于 08-16 11:16 ?2556次閱讀

    ch32和gd32的區(qū)別

    ch32和gd32的區(qū)別 Ch32和Gd32是兩種不同的芯片,它們有著不同的架構(gòu)、性能、功耗等特征。本文將詳細(xì)介紹Ch32和Gd32的區(qū)別。 一、架構(gòu) Ch32采用的是ARM Cort
    的頭像 發(fā)表于 08-16 11:16 ?2377次閱讀

    ch32和AT32的區(qū)別

    ch32和AT32的區(qū)別 AT32 和 CH32 是兩款不同的單片機(jī),各自具有獨(dú)特的特點(diǎn)和優(yōu)勢(shì)。在本文中,我們將深入探討這兩款芯片的差異,并分析它們的性能和應(yīng)用。讓我們首先了解一下 AT32
    的頭像 發(fā)表于 08-16 11:16 ?2999次閱讀

    ch32和gd32哪個(gè)好用?

    ch32和gd32哪個(gè)好用 Ch32和Gd32是兩個(gè)比較常見的芯片系列,都是基于ARM Cortex-M3內(nèi)核設(shè)計(jì)的,因此具有類似的特點(diǎn)和性能。在選擇使用哪個(gè)芯片時(shí),需要根據(jù)具體的項(xiàng)目需求和開發(fā)
    的頭像 發(fā)表于 08-16 11:16 ?1662次閱讀

    CH32與STM32系列單片機(jī)有哪些不同?

    CH32與STM32系列單片機(jī)有哪些不同? STM32系列單片機(jī)和CH32單片機(jī)都是現(xiàn)代化的高性能微控制器,它們都擁有眾多的功能和廣泛的應(yīng)用。但是,這兩個(gè)系列的單片機(jī)在某些方面確實(shí)存在一些不同,這也
    的頭像 發(fā)表于 08-16 11:16 ?3026次閱讀

    gd32和ch32的區(qū)別

    gd32和ch32的區(qū)別 GD32和CH32是兩個(gè)不同的芯片系列,都是由中國(guó)廠商GigaDevice生產(chǎn)的。雖然這兩種芯片有許多相似之處,但它們?cè)谝恍╆P(guān)鍵特性的設(shè)計(jì)和性能方面存在一些區(qū)別。 1.
    的頭像 發(fā)表于 08-16 11:32 ?1728次閱讀

    ch32單片機(jī)的參數(shù) ch32V307工作溫度

    ch32單片機(jī)的參數(shù) ch32V307工作溫度? 單片機(jī)是一種高度集成的電子元器件,它集成了計(jì)算機(jī)中的主要組成部分,使得它能夠獨(dú)立完成計(jì)算、控制等任務(wù)。隨著科技的不斷發(fā)展,單片機(jī)技術(shù)也不斷得到進(jìn)步
    的頭像 發(fā)表于 08-22 15:18 ?1961次閱讀

    ch32優(yōu)勢(shì) ch32v307可以做什么?

    ch32優(yōu)勢(shì) ch32v307可以做什么? Ch32v307是現(xiàn)代技術(shù)中的一種優(yōu)勢(shì)產(chǎn)品,它可以為用戶提供各種功能和服務(wù),包括但不限于節(jié)能、高效、安全、靈活等特點(diǎn)。 一、節(jié)能: Ch32
    的頭像 發(fā)表于 08-22 15:19 ?1844次閱讀

    ch32可以用keil嗎?ch32和stm32編程有區(qū)別嗎?

    ch32可以用keil嗎?ch32和stm32編程有區(qū)別嗎? CH32是山外電子推出的一款基于RISC-V架構(gòu)的32位微控制器芯片,其具有性價(jià)比高的特點(diǎn),適用于一些成本敏感的產(chǎn)品。而STM32則是意
    的頭像 發(fā)表于 08-22 15:19 ?2509次閱讀

    ch32單片機(jī)怎么樣?ch32好用嗎?ch32和stm32的區(qū)別

    ch32單片機(jī)怎么樣?ch32好用嗎?ch32和stm32的區(qū)別? Ch32單片機(jī)是龍芯微電子推出的一種高性能、低功耗的32位嵌入式處理器。它集成了ARM Cortex-M4內(nèi)核,配備
    的頭像 發(fā)表于 08-22 15:19 ?4624次閱讀

    ch32可以用hal庫(kù)嗎

    ch32可以用hal庫(kù)嗎? ch32是什么? 首先,我們需要了解ch32是什么。 ch32是一款基于Cortex-M0內(nèi)核的單片機(jī),由GD32公司(中國(guó)制造)生產(chǎn)。它提供了許多通用外設(shè)
    的頭像 發(fā)表于 08-22 15:19 ?1427次閱讀

    ch32和esp32的區(qū)別

    ch32和esp32的區(qū)別 ESP32是一款由樂鑫科技推出的微控制器,擁有多個(gè)通信接口、基于雙核處理器的32位CPU、Wi-Fi和藍(lán)牙等功能,廣泛應(yīng)用于物聯(lián)網(wǎng)、智能家居、工業(yè)控制等領(lǐng)域。而CH32
    的頭像 發(fā)表于 08-22 15:48 ?1619次閱讀

    ch32控制板是什么?

    ch32控制板是什么?? Ch32控制板是一種用于電路控制的板卡,它可以實(shí)現(xiàn)對(duì)電路中各種元器件的控制以及電路中數(shù)據(jù)的采集和處理,是實(shí)現(xiàn)智能控制的重要組成部分。Ch32控制板采用了先進(jìn)的芯片和電路設(shè)計(jì)
    的頭像 發(fā)表于 08-22 15:48 ?1562次閱讀