打印
[其他]

【HC32L196PCTA测评】+ADC应用篇

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

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

2 检测GND电压

3 悬空状态电压

在添加电压值变换的情况下,其主程序为:
int32_t main(void)
{   
    uint32_t V,U;
    App_AdcPortInit();
    App_AdcInit();
    App_AdcSglCfg();
        App_OledInit();
        OLED_Init();
        OLED_Clear();
        OLED_ShowString(20,0,"HC32L196 TEST",16);
        OLED_ShowString(20,2,"OLED DISPLAY",16);       
    OLED_ShowString(20,4,"ADC=",16);
    OLED_ShowString(20,6,"U= .",16);
    while(1)
    {
        if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
        {
            u32AdcRestult = Adc_GetSglResult();
                        V=u32AdcRestult;
                        OLED_ShowNum(52,4,V,4,16);
            Adc_ClrIrqStatus(AdcMskIrqSgl);
                        U=V*3.3/4096;
                        OLED_ShowNum(36,6,U,1,16);
                        U=(V*330/4096)%100;
                        OLED_ShowNum(52,6,U,2,16);
        }
                delay1ms(1000);
    }
}

经程序的编译与下载,其显示效果如图4所示。
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精度和稳定性咋样

尚可

使用特权

评论回复
5
stly| | 2023-8-11 22:50 | 只看该作者
直接测电源电压不错

使用特权

评论回复
6
tpgf| | 2023-9-8 17:34 | 只看该作者
这个应用里边使用的是adc采集的那种模式呀

使用特权

评论回复
7
jinglixixi|  楼主 | 2023-9-9 08:18 | 只看该作者
tpgf 发表于 2023-9-8 17:34
这个应用里边使用的是adc采集的那种模式呀

单次循环

使用特权

评论回复
8
renzheshengui| | 2023-9-9 15:43 | 只看该作者
这种温度显示的 一般显示的比实际的滞后多长时间呢

使用特权

评论回复
9
wakayi| | 2023-9-9 15:55 | 只看该作者
单次采集如何保证模拟量采集的精度呢

使用特权

评论回复
10
wowu| | 2023-9-9 16:13 | 只看该作者
wakayi 发表于 2023-9-9 15:55
单次采集如何保证模拟量采集的精度呢

adc模拟量采集的精度和采集方式关系不是很大吧

使用特权

评论回复
11
xiaoqizi| | 2023-9-9 16:25 | 只看该作者
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗

使用特权

评论回复
12
木木guainv| | 2023-9-9 16:34 | 只看该作者
xiaoqizi 发表于 2023-9-9 16:25
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗

个人感觉如果超过的不大 短时间应该不会的

使用特权

评论回复
13
jinglixixi|  楼主 | 2023-9-10 09:53 | 只看该作者
xiaoqizi 发表于 2023-9-9 16:25
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗

加限位保护呀!

使用特权

评论回复
14
单片机123258| | 2024-3-8 10:57 | 只看该作者

大佬,我买大华大136的开发板,用官方给的ADC采集例程,用debug调试时为什么AD值都是0XAAAAAAAAAAA,请问这是什么原因?

使用特权

评论回复
15
jinglixixi|  楼主 | 2024-3-8 11:12 | 只看该作者
单片机123258 发表于 2024-3-8 10:57
大佬,我买大华大136的开发板,用官方给的ADC采集例程,用debug调试时为什么AD值都是0XAAAAAAAAAAA,请问 ...

加不同电压看看,也或许输入的通道不正确等,例程应该是没问题的。

使用特权

评论回复
16
单片机123258| | 2024-3-8 11:14 | 只看该作者
jinglixixi 发表于 2024-3-8 11:12
加不同电压看看,也或许输入的通道不正确等,例程应该是没问题的。

不同电压都试过了,没有反应,通道的话是看例程里面的注释加的,应该也没错,愁人

使用特权

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

还有一种可能是所用ADC引脚在初始化之后又被赋予其它功能,或是检测信号没有被传递到内部检测通道,如断线类的情况等。也可先用其它的ADC例程来做一下测量来帮助分析。

使用特权

评论回复
18
单片机123258| | 2024-3-11 08:19 | 只看该作者
jinglixixi 发表于 2024-3-9 12:31
还有一种可能是所用ADC引脚在初始化之后又被赋予其它功能,或是检测信号没有被传递到内部检测通道,如断 ...

官方库的所有例程都是这样,DEBUG的AD值都是0XAAAAAAAAA,大佬可以给一个你调好的 HC32L13系列的AD 采集程序么?

使用特权

评论回复
19
单片机123258| | 2024-3-11 14:59 | 只看该作者
Adc_SGL_Always_Start()
这个函数不是库函数吧

使用特权

评论回复
20
jinglixixi|  楼主 | 2024-3-13 23:12 | 只看该作者
单片机123258 发表于 2024-3-11 08:19
官方库的所有例程都是这样,DEBUG的AD值都是0XAAAAAAAAA,大佬可以给一个你调好的 HC32L13系列的AD 采集程 ...

好久不用,为省硬盘就清了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

464

主题

2783

帖子

38

粉丝