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 显示电压值
|