HC32F4A0开发板ADC采样测试
1概述
1.1开发板接口
本MCU搭载3个ADC单元,单元1和2支持16个通道,单元3支持20个通道,可以转换来自外部引脚、以及芯片内部的模拟信号。模拟输入通道可以任意组合成一个序列,一个序列可以进行单次扫描转换,或连续扫描转换。支持对任意指定通道进行连续多次转换并对转换结果进行平均。ADC模块还搭载模拟看门狗功能,对任意指定通道的转换结果进行监视,检测其是否超出用户设定的范围;开发板的三路ADC通过连接器J10引出,其中ADC123_IN3连接可调电位器R105 10K,因此可以通过旋转电位器调节采样电压的值。
1.2开发板原理图
ADC采样外围电路如图1所示。
图1 ADC采样外围电路示意图
1.3测试设备
本次测试所用设备如表1所示,设备实物图连接图如图2所示:
测试设备 |
单位 |
数量 |
EV_F4A0_LQ176_REV1.0开发板 |
块 |
壹 |
ARM仿真器 |
个 |
壹 |
5V电源适配器 |
个 |
壹 |
RIGOL DHO804示波器 |
台 |
壹 |
表1 测试设备
图2 开发板实物连接图
2代码编写
时钟配置
static void AdcClockConfig(void)
{
CLK_SetClockDiv((CLK_BUS_PCLK2 | CLK_BUS_PCLK4), (CLK_PCLK2_DIV1 | CLK_PCLK4_DIV8));
CLK_SetPeriClockSrc(ADC_CLK);
}
采样函数
static void AdcPolling(uint16_t u16Width,uint16_t u16Height)
{
uint16_t u16AdcValue;
int32_t iRet = LL_ERR;
__IO uint32_t u32TimeCount = 0UL;
/* Can ONLY start sequence A conversion.
Sequence B needs hardware trigger to start conversion. */
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) {
/* Get any ADC value of sequence A channel that needed. */
u16AdcValue = ADC_GetValue(ADC_UNIT, ADC_CH);
lcd_show_xnum(20,60,(ADC_CAL_VOL(u16AdcValue))/1000,1,32,0,LCD_COLOR_BLACK,u16Width,u16Height);
lcd_show_xnum(52,60,(ADC_CAL_VOL(u16AdcValue))%1000,3,32,0,LCD_COLOR_BLACK,u16Width,u16Height);
} else {
ADC_Stop(ADC_UNIT);
lcd_show_string(20,100,u16Width,32,32,"error:",LCD_COLOR_BLACK,u16Width,u16Height);
}
}
主函数
int32_t main(void)
{
uint16_t u16Width;
uint16_t u16Height;
/* MCU Peripheral registers write unprotected */
LL_PERIPH_WE(LL_PERIPH_ALL);
/* Initialize system clock: */
BSP_CLK_Init();
BSP_IO_Init();
BSP_LED_Init();
/* EXCLK 30MHz */
//CLK_SetClockDiv(CLK_BUS_EXCLK, CLK_EXCLK_DIV8);
AdcConfig();
BSP_LCD_IO_Init();
/* Initialize NT35510 LCD */
BSP_NT35510_Init();
/* Clear LCD screen */
BSP_NT35510_Clear(LCD_COLOR_WHITE);
/* Turn on LCD backlight */
BSP_LCD_BKLCmd(EIO_PIN_SET);
/* MCU Peripheral registers write protected */
LL_PERIPH_WP(LL_PERIPH_ALL);
u16Width = BSP_NT35510_GetPixelWidth();
u16Height = BSP_NT35510_GetPixelHeight();
lcd_show_string(20,20,u16Width,32,32,"The sampling voltage is:",LCD_COLOR_BLACK,u16Width,u16Height);
lcd_show_string(40,60,u16Width,32,32,".",LCD_COLOR_BLACK,u16Width,u16Height);
lcd_show_string(100,60,u16Width,32,32,"V",LCD_COLOR_BLACK,u16Width,u16Height);
while(1){
AdcPolling(u16Width,u16Height);
};
}
3实验现象
3.1实验现象分析
调节开发板上的可调电位器,得到的电压值应符合变化趋势,通过示波器测量电位器的中间引脚,可和采样得到的电压值进行对比分析。
3.2实验现象
如视频所示
电压采集屏幕显示
示波器测量电压变化趋势