[AT32L021] 【AT-START-L021测评】+ ADC采样测试

[复制链接]
 楼主| tlled 发表于 2024-11-28 12:37 | 显示全部楼层 |阅读模式
本帖最后由 tlled 于 2024-11-28 12:37 编辑

测试stm32l021芯片的ADC采样。
一、电路连接部分

使用电位器,连接到VDD与GND,中心点连接到PA0。
002.jpg


二、配置ADC

软件配置ADC的IN0接口

003.png


三、程序代码

3.1、adc.c
  1. #include "at32l021.h"
  2. #include "usart/usart.h"
  3. #include "adc/adc.h"


  4. void init_adc(void)
  5. {
  6.   gpio_init_type gpio_init_struct;
  7.   adc_base_config_type adc_base_struct;
  8.         
  9.         
  10.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  11.   crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  12.         
  13.   gpio_default_para_init(&gpio_init_struct);

  14.   /* gpio--------------------------------------------------------------------*/
  15.   /* configure the IN0 pin */
  16.   gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  17.   gpio_init_struct.gpio_pins = GPIO_PINS_0;
  18.   gpio_init(GPIOA, &gpio_init_struct);

  19.   /* config adc clock division */
  20.   crm_adc_clock_div_set(CRM_ADC_DIV_4);

  21.   /* adc_settings------------------------------------------------------------------- */
  22.   adc_base_default_para_init(&adc_base_struct);
  23.   adc_base_struct.sequence_mode = FALSE;
  24.   adc_base_struct.repeat_mode = FALSE;
  25.   adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  26.   adc_base_struct.ordinary_channel_length = 1;
  27.   adc_base_config(ADC1, &adc_base_struct);

  28.   adc_resolution_set(ADC1, ADC_RESOLUTION_12B);

  29.   /* adc_ordinary_conversionmode---------------------------------------------------- */
  30.   adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_1_5);
  31.   adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
  32.         
  33.   adc_enable(ADC1, TRUE);
  34.   while(adc_flag_get(ADC1, ADC_RDY_FLAG) == RESET);

  35.   /* adc calibration---------------------------------------------------------------- */
  36.   adc_calibration_init(ADC1);
  37.   while(adc_calibration_init_status_get(ADC1));
  38.   adc_calibration_start(ADC1);
  39.   while(adc_calibration_status_get(ADC1));
  40. }



  41. uint16_t  adc_read(void)
  42. {
  43.         uint16_t vol;
  44.         float vl=0.0;
  45.         adc_ordinary_software_trigger_enable(ADC1, TRUE);
  46.         while(adc_flag_get(ADC1, ADC_CCE_FLAG) == RESET);
  47.         adc_flag_clear(ADC1, ADC_CCE_FLAG);
  48.         vol=adc_ordinary_conversion_data_get(ADC1);
  49.         return vol;        
  50. }

  51. void adc_test(void)
  52. {
  53.         uint16_t ad;
  54.         float vol=0.0;
  55.         
  56.         ad=adc_read();

  57.                
  58.         vol = (float)ad*3.3/4096;
  59.   printf("value = %0.1f V\r\n", vol);
  60. }


3.2、main.c
  1. #include "at32l021_clock.h"
  2. #include "usart/usart.h"
  3. #include "led/led.h"
  4. #include "delay/delay.h"
  5. #include "i2c/i2c.h"
  6. #include "adc/adc.h"

  7. int main(void)
  8. {
  9.   system_clock_config();
  10.         init_usart(115200);
  11.         delay_init();
  12.         init_led();
  13.         init_i2c();
  14.         init_adc();
  15.   while(1)
  16.   {
  17.                 adc_test();
  18.     led2_tog();
  19.     delay_ms(200);
  20.   }
  21. }


四、测试结果

下载程序后,调整电位器,串口输出采样的电压值
001.png


您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

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