[AT32F437] ADC采样测试

[复制链接]
27|1
FrostShimmer 发表于 2026-5-22 08:43 | 显示全部楼层 |阅读模式
ADC和DAC是两座沟通模拟世界与数字世界的桥梁。ADC是将模拟量转化为量化数字,以表征模拟量的幅值;DAC则是将数字量转化为电压的幅值输出。

根据AT32F437的数据手册,对于ADC1外设的通道4对应PA4(我发现PA0引脚被占用了)。在配置完成AT32的时钟树之后,我们让系统主频工作在288MHz,这样也使得ADC1外设的输入时钟源的频率也达到了288MHz。

在本次应用中,我的ADC1分频系数使用了16分之一,故ADC1的工作频率为18MHz。剩下的配置使用了AT32 WorkBench的默认值。

ADC1的PA4通道的配置初始化代码如下:

  1. /**
  2.   * [url=/u/brief]@brief[/url]  init adc-common function.
  3.   * @param  none
  4.   * @retval none
  5.   */
  6. void wk_adc_common_init(void)
  7. {

  8.   adc_common_config_type adc_common_struct;

  9.   adc_reset();

  10.   /* adc_common_settings------------------------------------------------------------ */
  11.   adc_common_default_para_init(&adc_common_struct);
  12.   adc_common_struct.combine_mode = ADC_INDEPENDENT_MODE;
  13.   adc_common_struct.div = ADC_HCLK_DIV_16;
  14.   adc_common_struct.common_dma_mode = ADC_COMMON_DMAMODE_DISABLE;
  15.   adc_common_struct.common_dma_request_repeat_state = FALSE;
  16.   adc_common_struct.sampling_interval = ADC_SAMPLING_INTERVAL_5CYCLES;
  17.   adc_common_struct.tempervintrv_state = FALSE;
  18.   adc_common_struct.vbat_state = FALSE;
  19.   adc_common_config(&adc_common_struct);

  20. }

  21. /**
  22.   * @brief  init adc1 function.
  23.   * @param  none
  24.   * @retval none
  25.   */
  26. void wk_adc1_init(void)
  27. {
  28.   gpio_init_type gpio_init_struct;
  29.   adc_base_config_type adc_base_struct;

  30.   gpio_default_para_init(&gpio_init_struct);

  31.   /*gpio--------------------------------------------------------------------*/
  32.   /* configure the IN4 pin */
  33.   gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  34.   gpio_init_struct.gpio_pins = GPIO_PINS_4;
  35.   gpio_init(GPIOA, &gpio_init_struct);

  36.   /* adc_settings------------------------------------------------------------------- */
  37.   adc_base_default_para_init(&adc_base_struct);
  38.   adc_base_struct.sequence_mode = FALSE;
  39.   adc_base_struct.repeat_mode = FALSE;
  40.   adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  41.   adc_base_struct.ordinary_channel_length = 1;
  42.   adc_base_config(ADC1, &adc_base_struct);

  43.   adc_resolution_set(ADC1, ADC_RESOLUTION_12B);

  44.   adc_enable(ADC1, TRUE);
  45.   while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);

  46.   /* adc calibration---------------------------------------------------------------- */
  47.   adc_calibration_init(ADC1);
  48.   while(adc_calibration_init_status_get(ADC1));
  49.   adc_calibration_start(ADC1);
  50.   while(adc_calibration_status_get(ADC1));


  51. }
此时我们完成了ADC1的时钟频率配置,PA4的GPIO模式配置,设置12bit的采样精度,并启动了自校准功能,再次等待ADC1就绪。之后,我们就可以触发ADC1的采样功能了。

  1. while(1)
  2. {
  3.     if(tick == 0)
  4.     {
  5.         tick = 1000;
  6.         adc_ordinary_software_trigger_enable(ADC1, TRUE);
  7.         while(adc_flag_get(ADC1, ADC_OCCE_FLAG) == RESET);
  8.         val = adc_ordinary_conversion_data_get(ADC1);
  9.         dbg_printf("volt = %d\r\n", val);
  10.     }
  11. }

整体应用下来感觉还是非常方便与顺利的。单从AT WorkBench软件的打开速度上来比就比国外的图形化软件要快,要快的多。






tpgf 发表于 2026-5-22 16:43 | 显示全部楼层
AT32F437的ADC1时钟并非直接等于系统主频,而是源于APB总线时钟,且存在严格的频率上限
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

62

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0