[其他] 【HC32L196PCTA测评】+ADC应用篇

[复制链接]
3639|21
 楼主| jinglixixi 发表于 2023-8-10 23:42 | 显示全部楼层 |阅读模式
AD, ADC, HC, dc, pc
HC32L196配有ADC数模转换器,用它可对外部的模拟信号加以检测并转换为数字信息量。
在配置配置OLED屏的情况下,可直接将检测值显示处理,并可变换成相应的电压值来显示。
在使用通道0的情况下,其对输入引脚的配置函数为:
  1. void App_AdcPortInit(void)
  2. {
  3.     ///< 开启ADC/BGR GPIO外设时钟
  4.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  5.     Gpio_SetAnalogMode(GpioPortA, GpioPin0);
  6. }
将采样模式设置为单次模式的函数为:
  1. void App_AdcSglCfg(void)
  2. {
  3.     ///< 配置单次采样通道
  4.     Adc_CfgSglChannel(AdcExInputCH0);
  5.     ///< 启动单次一直采样
  6.     Adc_SGL_Always_Start();
  7. }
ADC初始化的函数为:
  1. void App_AdcInit(void)
  2. {
  3.     stc_adc_cfg_t              stcAdcCfg;
  4.     DDL_ZERO_STRUCT(stcAdcCfg);
  5.     ///< 开启ADC/BGR外设时钟
  6.     Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
  7.     Bgr_BgrEnable();                                      ///< 开启BGR
  8.     ///< ADC 初始化配置
  9.     stcAdcCfg.enAdcMode         = AdcSglMode;             ///<采样模式-单次
  10.     stcAdcCfg.enAdcClkDiv       = AdcMskClkDiv1;             ///<采样分频-1
  11.     stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk;      ///<采样周期数-12
  12.     stcAdcCfg.enAdcRefVolSel    = AdcMskRefVolSelInBgr2p5;    ///<参考电压选择-内部2.5V
  13.     stcAdcCfg.enAdcOpBuf        = AdcMskBufDisable;         ///<OP BUF配置-关
  14.     stcAdcCfg.enInRef           = AdcMskInRefEnable;         ///<内部参考电压使能-开
  15.     stcAdcCfg.enAdcAlign        = AdcAlignRight;              ///<转换结果对齐方式-右
  16.     Adc_Init(&stcAdcCfg);
  17. }
实现数据检测及显示的主程序为:
  1. int32_t main(void)
  2. {
  3.     App_AdcPortInit();
  4.     App_AdcInit();
  5.     App_AdcSglCfg();
  6.         App_OledInit();
  7.         OLED_Init();
  8.         OLED_Clear();
  9.         OLED_ShowString(20,0,"HC32L196 TEST",16);
  10.         OLED_ShowString(20,2,"OLED DISPLAY",16);       
  11.     OLED_ShowString(20,4,"ADC=",16);
  12.     while(1)
  13.     {
  14.         if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
  15.         {
  16.             u32AdcRestult = Adc_GetSglResult();
  17.                         OLED_ShowNum(52,4,u32AdcRestult,4,16);
  18.             Adc_ClrIrqStatus(AdcMskIrqSgl);
  19.         }
  20.                 delay1ms(1000);
  21.     }
  22. }

经程序的编译与下载,其显示效果如图1至图3所示。
1.jpg
1 检测3.3V电压

2.jpg
2 检测GND电压

3.jpg
3 悬空状态电压

在添加电压值变换的情况下,其主程序为:
  1. int32_t main(void)
  2. {   
  3.     uint32_t V,U;
  4.     App_AdcPortInit();
  5.     App_AdcInit();
  6.     App_AdcSglCfg();
  7.         App_OledInit();
  8.         OLED_Init();
  9.         OLED_Clear();
  10.         OLED_ShowString(20,0,"HC32L196 TEST",16);
  11.         OLED_ShowString(20,2,"OLED DISPLAY",16);       
  12.     OLED_ShowString(20,4,"ADC=",16);
  13.     OLED_ShowString(20,6,"U= .",16);
  14.     while(1)
  15.     {
  16.         if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
  17.         {
  18.             u32AdcRestult = Adc_GetSglResult();
  19.                         V=u32AdcRestult;
  20.                         OLED_ShowNum(52,4,V,4,16);
  21.             Adc_ClrIrqStatus(AdcMskIrqSgl);
  22.                         U=V*3.3/4096;
  23.                         OLED_ShowNum(36,6,U,1,16);
  24.                         U=(V*330/4096)%100;
  25.                         OLED_ShowNum(52,6,U,2,16);
  26.         }
  27.                 delay1ms(1000);
  28.     }
  29. }

经程序的编译与下载,其显示效果如图4所示。
4.jpg
4 显示电压值

yang377156216 发表于 2023-8-11 09:06 | 显示全部楼层
这个 ADC 还是有个不错的特点,它有个内部通道可以转换得出 1/3 AVCC 电压值,这样可以直接测得电源电压,而不用再单独拉一路外部的分压电路来测电源电压了,适合电池供电的低功耗应用场景。
yangxiaor520 发表于 2023-8-11 18:05 来自手机 | 显示全部楼层
这个芯片的ADC精度和稳定性咋样
 楼主| jinglixixi 发表于 2023-8-11 21:37 | 显示全部楼层
yangxiaor520 发表于 2023-8-11 18:05
这个芯片的ADC精度和稳定性咋样

尚可
stly 发表于 2023-8-11 22:50 | 显示全部楼层
直接测电源电压不错
tpgf 发表于 2023-9-8 17:34 | 显示全部楼层
这个应用里边使用的是adc采集的那种模式呀
 楼主| jinglixixi 发表于 2023-9-9 08:18 | 显示全部楼层
tpgf 发表于 2023-9-8 17:34
这个应用里边使用的是adc采集的那种模式呀

单次循环
renzheshengui 发表于 2023-9-9 15:43 | 显示全部楼层
这种温度显示的 一般显示的比实际的滞后多长时间呢
wakayi 发表于 2023-9-9 15:55 | 显示全部楼层
单次采集如何保证模拟量采集的精度呢
wowu 发表于 2023-9-9 16:13 | 显示全部楼层
wakayi 发表于 2023-9-9 15:55
单次采集如何保证模拟量采集的精度呢

adc模拟量采集的精度和采集方式关系不是很大吧
xiaoqizi 发表于 2023-9-9 16:25 | 显示全部楼层
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗
木木guainv 发表于 2023-9-9 16:34 | 显示全部楼层
xiaoqizi 发表于 2023-9-9 16:25
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗

个人感觉如果超过的不大 短时间应该不会的
 楼主| jinglixixi 发表于 2023-9-10 09:53 | 显示全部楼层
xiaoqizi 发表于 2023-9-9 16:25
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗

加限位保护呀!
单片机123258 发表于 2024-3-8 10:57 | 显示全部楼层

大佬,我买大华大136的开发板,用官方给的ADC采集例程,用debug调试时为什么AD值都是0XAAAAAAAAAAA,请问这是什么原因?
 楼主| jinglixixi 发表于 2024-3-8 11:12 | 显示全部楼层
单片机123258 发表于 2024-3-8 10:57
大佬,我买大华大136的开发板,用官方给的ADC采集例程,用debug调试时为什么AD值都是0XAAAAAAAAAAA,请问 ...

加不同电压看看,也或许输入的通道不正确等,例程应该是没问题的。
单片机123258 发表于 2024-3-8 11:14 | 显示全部楼层
jinglixixi 发表于 2024-3-8 11:12
加不同电压看看,也或许输入的通道不正确等,例程应该是没问题的。

不同电压都试过了,没有反应,通道的话是看例程里面的注释加的,应该也没错,愁人
 楼主| jinglixixi 发表于 2024-3-9 12:31 | 显示全部楼层
单片机123258 发表于 2024-3-8 11:14
不同电压都试过了,没有反应,通道的话是看例程里面的注释加的,应该也没错,愁人 ...

还有一种可能是所用ADC引脚在初始化之后又被赋予其它功能,或是检测信号没有被传递到内部检测通道,如断线类的情况等。也可先用其它的ADC例程来做一下测量来帮助分析。
单片机123258 发表于 2024-3-11 08:19 | 显示全部楼层
jinglixixi 发表于 2024-3-9 12:31
还有一种可能是所用ADC引脚在初始化之后又被赋予其它功能,或是检测信号没有被传递到内部检测通道,如断 ...

官方库的所有例程都是这样,DEBUG的AD值都是0XAAAAAAAAA,大佬可以给一个你调好的 HC32L13系列的AD 采集程序么?
单片机123258 发表于 2024-3-11 14:59 | 显示全部楼层
Adc_SGL_Always_Start()
这个函数不是库函数吧
 楼主| jinglixixi 发表于 2024-3-13 23:12 | 显示全部楼层
单片机123258 发表于 2024-3-11 08:19
官方库的所有例程都是这样,DEBUG的AD值都是0XAAAAAAAAA,大佬可以给一个你调好的 HC32L13系列的AD 采集程 ...

好久不用,为省硬盘就清了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部