本帖最后由 eltonchang2001 于 2022-11-9 11:30 编辑
HT32F52352芯片内部配有一个 12-bit 多通道 A/D 转换器,并提供了 14 个通道,其中包括 12 个提供模拟信号的外部通道和2 个内部通道。另外,A/D 转换器有3种工作模式,即单次转换、连续转换及非连续转换模式。 在外部模拟信号连接PA6的情况下,若采用连续转换模式,则输出的结果如图1至图3所示。 图1 接入3.3V 图2 悬空状态 图3 接地状态
测试的主程序为: - #include "ht32.h"
- #include "ht32_board.h"
- #include "ht32_board_config.h"
- void ADC_Configuration(void);
- volatile bool gADC_SingleEndOfConversion;
- vu32 gPotentiometerLevel;
- int main(void)
- {
- RETARGET_Configuration();
- ADC_Configuration();
- ADC_Cmd(HTCFG_ADC_PORT, ENABLE);
- ADC_SoftwareStartConvCmd(HTCFG_ADC_PORT, ENABLE);
- while (1)
- {
- if (gADC_SingleEndOfConversion)
- {
- printf("\rPotentiometer level is %04d", (int)gPotentiometerLevel);
- __Delay(1000000);
- }
- }
- }
所添加的ADC配置函数为: - void ADC_Configuration(void)
- {
- {
- CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
- CKCUClock.Bit.AFIO = 1;
- CKCUClock.Bit.HTCFG_ADC_IPN = 1;
- CKCU_PeripClockConfig(CKCUClock, ENABLE);
- }
- AFIO_GPxConfig(HTCFG_VR_GPIO_ID, HTCFG_VR_AFIO_PIN, HTCFG_ADC_AFIO_MODE);
- {
- CKCU_SetADCnPrescaler(HTCFG_ADC_CKCU_ADCPRE, CKCU_ADCPRE_DIV64);
- ADC_RegularGroupConfig(HTCFG_ADC_PORT, CONTINUOUS_MODE, 1, 0);
- #if (LIBCFG_ADC_SAMPLE_TIME_BY_CH)
- // The sampling time is set by the last parameter of the function "ADC_RegularChannelConfig()".
- #else
- ADC_SamplingTimeConfig(HTCFG_ADC_PORT, 0);
- #endif
- ADC_RegularChannelConfig(HTCFG_ADC_PORT, HTCFG_VR_ADC_CH, 0, 0);
- ADC_RegularTrigConfig(HTCFG_ADC_PORT, ADC_TRIG_SOFTWARE);
- }
- ADC_IntConfig(HTCFG_ADC_PORT, ADC_INT_SINGLE_EOC, ENABLE);
- NVIC_EnableIRQ(HTCFG_ADC_IRQn);
- }
进行ADC中断处理的函数为: - void HTCFG_ADC_IRQHandler(void)
- {
- extern vu32 gPotentiometerLevel;
- extern volatile bool gADC_SingleEndOfConversion;
- ADC_ClearIntPendingBit(HTCFG_ADC_PORT, ADC_FLAG_SINGLE_EOC);
- gPotentiometerLevel = (HTCFG_ADC_PORT->DR[0] & 0x0FFF);
- gADC_SingleEndOfConversion = TRUE;
- }
此外,在ht32_board_config.h文件中需添加如下内容: - #if (LIBCFG_NO_ADC)
- #error "This example code does not apply to the chip you selected."
- #endif
- #define HTCFG_ADC_IPN ADC0
- #if defined(USE_HT32F52352_SK)
- #define _HTCFG_VR_GPIOX A
- #define _HTCFG_VR_GPION 6
- #define _HTCFG_VR_ADC_CHN 6
- #endif
- #define HTCFG_VR_GPIO_ID STRCAT2(GPIO_P, _HTCFG_VR_GPIOX)
- #define HTCFG_VR_AFIO_PIN STRCAT2(AFIO_PIN_, _HTCFG_VR_GPION)
- #define HTCFG_VR_ADC_CH STRCAT2(ADC_CH_, _HTCFG_VR_ADC_CHN)
- #define HTCFG_ADC_PORT STRCAT2(HT_, HTCFG_ADC_IPN)
- #define HTCFG_ADC_AFIO_MODE STRCAT2(AFIO_FUN_, HTCFG_ADC_IPN)
- #define HTCFG_ADC_CKCU_ADCPRE STRCAT2(CKCU_ADCPRE_, HTCFG_ADC_IPN)
- #define HTCFG_ADC_IRQn STRCAT2(HTCFG_ADC_IPN, _IRQn)
|