360|2

1196

帖子

1

资源

纯净的硅(高级)

【HC32F4A0开发板测评】+ADC数据采集与温度测控 [复制链接]

本帖最后由 jinglixixi 于 2023-3-12 11:42 编辑

在HC32F4A0开发板上,配有3个ADC数据采集通道,并在一个通道上配有10K的电位器来调节模拟信号,其电路如图1所示。在使用时,需将开关J13拨到AVCC一侧。

此外,值得称赞的是该开发板是一款面向应用而设计的产品,这从它的上下钳位电路即可看出,在一般的采样电路上是不会这样细心的。

image.png

图1 通道3接口电路

 

在该电路的基础上,只需为其添加一个OLED屏就可构成一个数字式电压表。

其以巡回方式采集数据的函数为 :

static void AdcPolling(void)
{
    uint16_t u16AdcValue;
    int32_t iRet = LL_ERR;
    __IO uint32_t u32TimeCount = 0UL;
    ADC_Start(ADC_UNIT);
    do {
        if (ADC_GetStatus(ADC_UNIT, ADC_EOC_FLAG) == SET) {
            ADC_ClearStatus(ADC_UNIT, ADC_EOC_FLAG);
            iRet = LL_OK;
            break;
        }
    } while (u32TimeCount++ < ADC_TIMEOUT_VAL);
    if (iRet == LL_OK) {
        u16AdcValue = ADC_GetValue(ADC_UNIT, ADC_CH);
	   	OLED_ShowNum(20,6,ADC_CAL_VOL(u16AdcValue),4,16);
    } else {
        ADC_Stop(ADC_UNIT);
        DDL_Printf("ADC exception.\r\n");
    }
}

 

完成显示功能的主程序为:

int32_t main(void)
{
    LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU);
	LED_Init();
	OLED_Init();
    OLED_Clear();
	OLED_ShowString(20,0,"HC32F4A0SITB",16);
	OLED_ShowString(20,2,"ADC & NTC",16);
	OLED_ShowString(20,4,"voltage:(mV)",16);
    DDL_PrintfInit(BSP_PRINTF_DEVICE, 19200U, BSP_PRINTF_Preinit);
    AdcConfig();
    LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU);
    for (;;) {
        AdcPolling();
        DDL_DelayMS(500UL);
    }
}

 

经编译下载,通过调节电位器即可产生图2至图4所示的检测效果。

image.png 图2  满量程状态

 

image.png 图3  中间值状态

 

image.png 图3  零值状态

 

那我们该如何来使用其它2个检测通道呢?

我们可以通过图4所示的接口来引入外部的检测信号,具体的使用是接如一个NTC热敏电阻来检测温度。

image.png

图4  模拟信号接口

 

为使用通道ADC3_IN18来进行检测,需对以下定义项加以修改:

#define ADC_UNIT            (CM_ADC3)

#define ADC_PERIPH_CLK      (FCG3_PERIPH_ADC3)

#define ADC_CH             (ADC_CH18)

#define ADC_CH_PORT        (GPIO_PORT_H)

#define ADC_CH_PIN          (GPIO_PIN_04)

#define t_max               20

 

然后再将寻回采集函数加以修改,修改后的内容为:

static void AdcPolling(void)
{
    uint16_t u16AdcValue,u,V;
    int32_t iRet = LL_ERR;
    __IO uint32_t u32TimeCount = 0UL;
    ADC_Start(ADC_UNIT);
    do {
        if (ADC_GetStatus(ADC_UNIT, ADC_EOC_FLAG) == SET) {
            ADC_ClearStatus(ADC_UNIT, ADC_EOC_FLAG);
            iRet = LL_OK;
            break;
        }
    } while (u32TimeCount++ < ADC_TIMEOUT_VAL);
    if (iRet == LL_OK) {
        u16AdcValue = ADC_GetValue(ADC_UNIT, ADC_CH);
	   	OLED_ShowNum(20,4,ADC_CAL_VOL(u16AdcValue),4,16);
		u=ADC_CAL_VOL(u16AdcValue);
		if((u<=2042)&&(u>1644)) u=0+(2042-u)/4;
        if((u<=1644)&&(u>1268)) V=10+(1644-u)/37;
        if((u<=1268)&&(u>947)) V=20+(1268-u)/32;
        if((u<=947)&&(u>692)) V=30+(947-u)/25;
        OLED_ShowNum(60,6,V,3,16);
		if((V > t_max)  GPIO_ResetPins(GPIO_PORT_E, GPIO_PIN_03);
		else     GPIO_SetPins(GPIO_PORT_E,GPIO_PIN_03);
    } else {
        ADC_Stop(ADC_UNIT);
        DDL_Printf("ADC exception.\r\n");
    }
}

 

对应的温度测控主程序为:

int32_t main(void)
{
    LL_PERIPH_WE(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU);
    LED_Init();
	OLED_Init();
    OLED_Clear();
	OLED_ShowString(20,0,"HC32F4A0SITB",16);
	OLED_ShowString(20,2,"voltage:(mV)",16);
	OLED_ShowString(20,6,"temp=    C",16);
    DDL_PrintfInit(BSP_PRINTF_DEVICE, 19200U, BSP_PRINTF_Preinit);
    AdcConfig();
    LL_PERIPH_WP(LL_PERIPH_GPIO | LL_PERIPH_FCG | LL_PERIPH_PWC_CLK_RMU);
    for (;;) {
        AdcPolling();
        DDL_DelayMS(500UL);
    }
}

 

经下载测试,即可得到图5和图6所示的检测结果,因此可见该开发板是很有实用价值的。

image.png 图5  室温检测

 

image.png 图6  体温检测    

最新回复

感谢支持!!!   详情 回复 发表于 2023-3-13 00:19

回复

3309

帖子

3

资源

版主

这个例子非常经典,是学习的好例子!

点评

感谢支持!!!  详情 回复 发表于 2023-3-13 00:19

回复

1196

帖子

1

资源

纯净的硅(高级)

lugl4313820 发表于 2023-3-12 12:43 这个例子非常经典,是学习的好例子!

感谢支持!!!


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表