[活动专区] 【AT-START-F425测评】9、adc采样(参考电压、VSSA、外部输入)

[复制链接]
1216|0
 楼主| freeelectron 发表于 2022-3-17 10:15 | 显示全部楼层 |阅读模式
1、ADC与ADC通道
18625623296eb0e63d.png
可以看出本次评测的mcu有1路ADC,16个外部通道,依次是ADC_IN0-ADC_IN15



2、两个内部通道
除了16个外部通道外,其实还有两个内部通道,一个连接到VSSA,是ADC_IN16,一个连接到内部参考电压,ADC_IN17


3、代码实现
  1. void AdcGpioInit(void)
  2. {
  3.         /* enable the  clock */
  4.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  5.         
  6.         gpio_init_type gpio_init_struct;

  7.         /* set default parameter */
  8.         gpio_default_para_init(&gpio_init_struct);
  9.         /* configure the led gpio */
  10.         gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  11.         gpio_init_struct.gpio_pins = GPIO_PINS_1  ;
  12.         gpio_init(GPIOA, &gpio_init_struct);
  13. }


  14. void AdcConfig(void)
  15. {
  16.         adc_base_config_type adc_base_struct;
  17.         crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  18.         crm_adc_clock_div_set(CRM_ADC_DIV_6);

  19.         adc_base_default_para_init(&adc_base_struct);
  20.         adc_base_struct.sequence_mode = FALSE;
  21.         adc_base_struct.repeat_mode = FALSE;
  22.         adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  23.         adc_base_struct.ordinary_channel_length = 1;
  24.         adc_base_config(ADC1, &adc_base_struct);

  25.         adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
  26.         adc_tempersensor_vintrv_enable(TRUE);

  27.         adc_enable(ADC1, TRUE);
  28.         
  29.         adc_calibration_init(ADC1);
  30.         while(adc_calibration_init_status_get(ADC1));
  31.         
  32.         adc_calibration_start(ADC1);
  33.         while(adc_calibration_status_get(ADC1));
  34. }


  35. uint16_t AdcSample(uint8_t channel)
  36. {
  37.         adc_ordinary_channel_set(ADC1, (adc_channel_select_type)channel, 1, ADC_SAMPLETIME_239_5);
  38.         adc_ordinary_software_trigger_enable(ADC1,TRUE);
  39.         while(!adc_flag_get(ADC1, ADC_CCE_FLAG));
  40.         adc_flag_clear(ADC1, ADC_CCE_FLAG);

  41.         return adc_ordinary_conversion_data_get(ADC1);
  42. }


  43. void AdcInit(void)
  44. {
  45.         AdcGpioInit();
  46.         AdcConfig();
  47. }


  48. void AdcPolling(void)
  49. {
  50.         static uint32_t tick=0;
  51.         float temperature=0;
  52.         uint16_t ref=0;
  53.         float Vdd=0;
  54.         
  55.         if(SystemGetTick()-tick>1000)
  56.         {
  57.                 ref=AdcSample(ADC_CHANNEL_17);
  58.         
  59.                 Vdd=1.2/(float)ref*4095;
  60.                
  61.                 printf("\r\nVdd=%.3f V\r\n",Vdd);
  62.                 printf("Channel 1=%.3fV\r\n",AdcSample(ADC_CHANNEL_1)*Vdd / 4095);
  63.                 printf("Channel 16=%.3fV\r\n",AdcSample(ADC_CHANNEL_16)*Vdd / 4095);
  64.                                 
  65.                 tick =SystemGetTick();
  66.         }
  67. }
代码实现中,使用内部参考电压校准,计算出VDD的值,通道1为外部输入。

4、现象
5180262329902a730a.png

611186232995ce504b.png
外部通道1的实际输入电压是1.61v,与采样出来的误差不大。





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

本版积分规则

个人签名:stm32/LoRa物联网:304350312

66

主题

786

帖子

11

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