0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CH32内部参考电压的自学笔记

撞上电子 2023-12-14 08:00 次阅读

CH32V/F单片机能够在一定的电压范围内进行工作,以CH32V203C8T6 芯片为例,在不使用 USB 外设时,最低工作电压能够达到 2.4V。较为宽泛的工作电压,允许单片机直接使用电池供电,但由于 CH32V203C8T6 芯片没有独立的 Vref 引脚,使用 ADC 的过程中无法换算出真实的电压。为解决无法获得真实电压的问题,可以使用内置参考电压换算当前供电电压(即 ADC参考电压)。对于项目要求精确测量时,也可尝试使用该方法对 ADC 进行校准。

电源电压的换算

CH32V203C8T6 芯片内部参考电压是典型值为 1.2V,正负偏差为 0.04V 的电压范围,在 ADC 转换精度要求不高的应用场景下,可以直接使用 1.2V 换算芯片供电电压。

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

如果需要更加精确的转换结果,就应在稳定的供电条件下,先对内部参考电压进行测量并将结果保存在 Flash 中,实际的使用过程中,再根据已知的内部参考电压进行换算。

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

实现上述操作,可参考以下代码:

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 参考电压)的改变而改变。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6034

    文章

    44528

    浏览量

    633606
  • 电压
    +关注

    关注

    45

    文章

    5576

    浏览量

    115639
  • ch32
    +关注

    关注

    0

    文章

    73

    浏览量

    633
收藏 人收藏

    评论

    相关推荐

    CH32和stm32的库函数一样吗?

    CH32和stm32的库函数一样吗? STM32是ST公司推出的一款32位微控制器,其拥有强大的性能及丰富的外设功能,实现了嵌入式应用的功能。而在STM32的开发中,库函数是不可或缺的,因为它简化
    的头像 发表于 08-16 11:15 985次阅读

    ch32和stm32参数对比

    ch32和stm32参数对比 随着物联网技术、智能家居、工业自动化等领域的快速发展,MCU芯片市场也逐渐走向多样化和智能化。其中,32位微控制器不仅在性能、功能、可靠性方面更加优越,而且在应用领域
    的头像 发表于 08-16 11:15 1724次阅读

    ch32和stm32的区别

    ch32和stm32的区别 引言 STM32是STMicroelectronics基于ARM Cortex-M处理器架构生产的一系列微控制器,而CH32是中国制造商WCH生产的一组微控制器。 在本文
    的头像 发表于 08-16 11:16 2200次阅读

    ch32和gd32的区别

    ch32和gd32的区别 Ch32和Gd32是两种不同的芯片,它们有着不同的架构、性能、功耗等特征。本文将详细介绍Ch32和Gd32的区别。 一、架构 Ch32采用的是ARM Cort
    的头像 发表于 08-16 11:16 2078次阅读

    ch32和AT32的区别

    ch32和AT32的区别 AT32 和 CH32 是两款不同的单片机,各自具有独特的特点和优势。在本文中,我们将深入探讨这两款芯片的差异,并分析它们的性能和应用。让我们首先了解一下 AT32
    的头像 发表于 08-16 11:16 2639次阅读

    ch32和gd32哪个好用?

    ch32和gd32哪个好用 Ch32和Gd32是两个比较常见的芯片系列,都是基于ARM Cortex-M3内核设计的,因此具有类似的特点和性能。在选择使用哪个芯片时,需要根据具体的项目需求和开发
    的头像 发表于 08-16 11:16 1438次阅读

    CH32与STM32系列单片机有哪些不同?

    CH32与STM32系列单片机有哪些不同? STM32系列单片机和CH32单片机都是现代化的高性能微控制器,它们都拥有众多的功能和广泛的应用。但是,这两个系列的单片机在某些方面确实存在一些不同,这也
    的头像 发表于 08-16 11:16 2749次阅读

    gd32和ch32的区别

    gd32和ch32的区别 GD32和CH32是两个不同的芯片系列,都是由中国厂商GigaDevice生产的。虽然这两种芯片有许多相似之处,但它们在一些关键特性的设计和性能方面存在一些区别。 1.
    的头像 发表于 08-16 11:32 1554次阅读

    ch32单片机的参数 ch32V307工作温度

    ch32单片机的参数 ch32V307工作温度  单片机是一种高度集成的电子元器件,它集成了计算机中的主要组成部分,使得它能够独立完成计算、控制等任务。随着科技的不断发展,单片机技术也不断得到进步
    的头像 发表于 08-22 15:18 1730次阅读

    ch32优势 ch32v307可以做什么?

    ch32优势 ch32v307可以做什么? Ch32v307是现代技术中的一种优势产品,它可以为用户提供各种功能和服务,包括但不限于节能、高效、安全、灵活等特点。 一、节能: Ch32
    的头像 发表于 08-22 15:19 1551次阅读

    ch32可以用keil吗?ch32和stm32编程有区别吗?

    ch32可以用keil吗?ch32和stm32编程有区别吗? CH32是山外电子推出的一款基于RISC-V架构的32位微控制器芯片,其具有性价比高的特点,适用于一些成本敏感的产品。而STM32则是意
    的头像 发表于 08-22 15:19 2313次阅读

    ch32单片机怎么样?ch32好用吗?ch32和stm32的区别

    ch32单片机怎么样?ch32好用吗?ch32和stm32的区别  Ch32单片机是龙芯微电子推出的一种高性能、低功耗的32位嵌入式处理器。它集成了ARM Cortex-M4内核,配备
    的头像 发表于 08-22 15:19 4145次阅读

    ch32可以用hal库吗

    ch32可以用hal库吗  ch32是什么? 首先,我们需要了解ch32是什么。 ch32是一款基于Cortex-M0内核的单片机,由GD32公司(中国制造)生产。它提供了许多通用外设
    的头像 发表于 08-22 15:19 1220次阅读

    ch32和esp32的区别

    ch32和esp32的区别 ESP32是一款由乐鑫科技推出的微控制器,拥有多个通信接口、基于双核处理器的32位CPU、Wi-Fi和蓝牙等功能,广泛应用于物联网、智能家居、工业控制等领域。而CH32
    的头像 发表于 08-22 15:48 1362次阅读

    ch32控制板是什么?

    ch32控制板是什么?  Ch32控制板是一种用于电路控制的板卡,它可以实现对电路中各种元器件的控制以及电路中数据的采集和处理,是实现智能控制的重要组成部分。Ch32控制板采用了先进的芯片和电路设计
    的头像 发表于 08-22 15:48 1342次阅读