【HC32L196PCTA测评】+ADC应用篇
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 显示电压值
这个 ADC 还是有个不错的特点,它有个内部通道可以转换得出 1/3 AVCC 电压值,这样可以直接测得电源电压,而不用再单独拉一路外部的分压电路来测电源电压了,适合电池供电的低功耗应用场景。 这个芯片的ADC精度和稳定性咋样 yangxiaor520 发表于 2023-8-11 18:05
这个芯片的ADC精度和稳定性咋样
尚可 直接测电源电压不错 这个应用里边使用的是adc采集的那种模式呀 tpgf 发表于 2023-9-8 17:34
这个应用里边使用的是adc采集的那种模式呀
单次循环 这种温度显示的 一般显示的比实际的滞后多长时间呢 单次采集如何保证模拟量采集的精度呢 wakayi 发表于 2023-9-9 15:55
单次采集如何保证模拟量采集的精度呢
adc模拟量采集的精度和采集方式关系不是很大吧 如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗 xiaoqizi 发表于 2023-9-9 16:25
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗
个人感觉如果超过的不大 短时间应该不会的 xiaoqizi 发表于 2023-9-9 16:25
如何采样信号的幅值超过adc的上限了 会对引脚产生伤害吗
加限位保护呀! jinglixixi 发表于 2023-8-11 21:37
尚可
大佬,我买大华大136的开发板,用官方给的ADC采集例程,用debug调试时为什么AD值都是0XAAAAAAAAAAA,请问这是什么原因? 单片机123258 发表于 2024-3-8 10:57
大佬,我买大华大136的开发板,用官方给的ADC采集例程,用debug调试时为什么AD值都是0XAAAAAAAAAAA,请问 ...
加不同电压看看,也或许输入的通道不正确等,例程应该是没问题的。 jinglixixi 发表于 2024-3-8 11:12
加不同电压看看,也或许输入的通道不正确等,例程应该是没问题的。
不同电压都试过了,没有反应,通道的话是看例程里面的注释加的,应该也没错,愁人 单片机123258 发表于 2024-3-8 11:14
不同电压都试过了,没有反应,通道的话是看例程里面的注释加的,应该也没错,愁人 ...
还有一种可能是所用ADC引脚在初始化之后又被赋予其它功能,或是检测信号没有被传递到内部检测通道,如断线类的情况等。也可先用其它的ADC例程来做一下测量来帮助分析。 jinglixixi 发表于 2024-3-9 12:31
还有一种可能是所用ADC引脚在初始化之后又被赋予其它功能,或是检测信号没有被传递到内部检测通道,如断 ...
官方库的所有例程都是这样,DEBUG的AD值都是0XAAAAAAAAA,大佬可以给一个你调好的 HC32L13系列的AD 采集程序么?
Adc_SGL_Always_Start()
这个函数不是库函数吧 单片机123258 发表于 2024-3-11 08:19
官方库的所有例程都是这样,DEBUG的AD值都是0XAAAAAAAAA,大佬可以给一个你调好的 HC32L13系列的AD 采集程 ...
好久不用,为省硬盘就清了。
页:
[1]
2