## 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;
## 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;
举报