本帖最后由 jinglixixi 于 2023-3-12 11:42 编辑
在HC32F4A0开发板上,配有3个ADC数据采集通道,并在一个通道上配有10K的电位器来调节模拟信号,其电路如图1所示。在使用时,需将开关J13拨到AVCC一侧。
此外,值得称赞的是该开发板是一款面向应用而设计的产品,这从它的上下钳位电路即可看出,在一般的采样电路上是不会这样细心的。
图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所示的检测效果。
图2 满量程状态
图3 中间值状态
图3 零值状态
那我们该如何来使用其它2个检测通道呢?
我们可以通过图4所示的接口来引入外部的检测信号,具体的使用是接如一个NTC热敏电阻来检测温度。
图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所示的检测结果,因此可见该开发板是很有实用价值的。
图5 室温检测
图6 体温检测