单片机交流
直播中

qjqb

8年用户 1302经验值
擅长:5762
私信 关注
[问答]

调试ATMEL SAMC20J多通道ADC遇到了哪些问题

调试ATMEL SAMC20J多通道ADC遇到了哪些问题?有什么解决办法吗?

回帖(1)

陈存楼

2021-9-23 17:36:36
  ## ATMEL SAMC20J多通道ADC问题## 最近,在学习使用ATMEL单片机,用到的是SAMC20J18A,当调试多通道ADC时,遇到了一些问题,其中有关多通道ADC采样问题整了比较久。记录一下,备忘和留下记号,希望可以帮到有需要的有缘人。 在ATMEL IDE Atmel Studio 7,有一些相关的例程,但都是比较简单的应用例程,就像ADC的例程里,都只是提供单路ADC的,而多通道ADC采样功能基本上只字不提,并且在网上也找不到相关有效的解决方法(网上有人实现两路采样,但要每次都重新初始化,效率肯定不高也不合理,所以只能自己找方法)。
  在相关文档中,我找到比较有用的资料有:
  1、Pin Scan(ADC应用文档里)
  2、 Automatic Sequences(芯片规格书里) 回到代码中,找到adc_enable_positive_input_sequence这个函数,里面有对SEQCTRL register进行设置
  adc_module-》SEQCTRL.reg = positive_input_sequence_mask_enable;
  最终修改configure_adc初始化函数。具体如下:
  void configure_adc(void)
  {
  struct adc_config config_adc;
  adc_get_config_defaults(&config_adc);
  #if (!SAML21) && (!SAML22) && (!SAMC21)
  //config_adc.gain_factor = ADC_GAIN_FACTOR_DIV2;
  #endif
  //config_adc.positive_input_sequence_mask_enable = 0x00c;
  config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV8;
  config_adc.reference = ADC_REFERENCE_INTVCC1;
  #if (SAMC21)
  config_adc.positive_input = ADC_POSITIVE_INPUT_PIN5;
  #else
  config_adc.positive_input = ADC_POSITIVE_INPUT_PIN10;
  #endif
  config_adc.resolution = ADC_RESOLUTION_12BIT;
  #if (SAMC21)
  adc_init(&adc_instance, ADC1, &config_adc);
  #else
  adc_init(&adc_instance, ADC0, &config_adc
  #endif
  adc_enable_positive_input_sequence(&adc_instance,0xC00);
  adc_enable(&adc_instance);
  }
  adc_enable_positive_input_sequence函数的参数0xC00,是根据应用改的,我用到是ADC_POSITIVE_INPUT_PIN10和ADC_POSITIVE_INPUT_PIN11两通道。config_adc.positive_input 的值对应起始通道ADC_POSITIVE_INPUT_PIN10。
  这样就可以实现两通道采样。当设置adc_read_buffer_job(&adc_instance, adc_result_buffer, ADC_SAMPLES)后,采样 结果就存放在 adc_result_buffer中。是不是很简单??但这问题确实纠緾我整整一天时间!!!
  另外我把上面 //config_adc.gain_factor = ADC_GAIN_FACTOR_DIV2;给注释了,原因是在SAMC20中无定义。
  最后的采样结果是 adc_result0 = adc_result_buffer[0]/2;
  adc_result1 = adc_result_buffer[1]/2;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分