社区导航

 
查看: 1474|回复: 8

[求助] 谁有使用ASF采集两个以上ADC数据的程序?

[复制链接]

3950

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

发表于 2015-4-2 12:51:18 | 显示全部楼层 |阅读模式
Atmel Studio 6.2里提供的例程都是一路的,我试着改配置,在采集完通道0后再采集通道1,怎么也调不过。
代码里单独采集通道0和通道1都能正常读到数据。

最后完全复制一份配置和代码,一份是通道0一份是通道1,通道0配置,读取,通道1配置,读取。也不能正常读到数据。

快被折磨屎了。
虾扯蛋

回复

使用道具 举报

5919

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2015-4-2 14:08:19 | 显示全部楼层
可以参考我的程序,里面采集了两路ADC的信号。

http://bbs.eeworld.com.cn/thread-457318-1-1.html


回复 支持 反对

使用道具 举报

5919

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2015-4-2 14:11:58 | 显示全部楼层


参考函数,这个是SAM R21的,其他型号应该也差不多吧:



  1. uint16_t ADC_get(uint8_t chn)
  2. {
  3.         struct adc_config config_adc;
  4.         struct adc_module adc_instance;
  5.         volatile uint16_t result;

  6.         adc_get_config_defaults(&config_adc);
  7.         config_adc.positive_input = chn;
  8.         config_adc.reference = ADC_REFERENCE_INTVCC1;
  9.         config_adc.gain_factor = ADC_INPUTCTRL_GAIN_DIV2;
  10.         config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV256;
  11.         config_adc.accumulate_samples = ADC_AVGCTRL_SAMPLENUM_8;
  12.         adc_init(&adc_instance, ADC, &config_adc);
  13.         adc_enable(&adc_instance);

  14.         adc_start_conversion(&adc_instance);

  15.         do {
  16.         } while (adc_read(&adc_instance, &result) == STATUS_BUSY);
  17.         adc_disable(&adc_instance);

  18.         return result;
  19. }
复制代码




点评

你的代码测试了很好用。 我在调试的时候发现在下一次执行adc_init()时提示错误信息 /* Module must be disabled before initialization. Abort. */ 你的代码在采集完数据后把ADC关闭了正好解决这个问题,非常  详情 回复 发表于 2015-4-2 14:39

回复 支持 反对

使用道具 举报

2842

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2015-4-2 14:35:33 | 显示全部楼层
有木有这么诡异?

点评

下一次初始化时没有关闭ADC,所以报错。  详情 回复 发表于 2015-4-2 14:39
So what......

回复 支持 反对

使用道具 举报

3950

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2015-4-2 14:39:04 | 显示全部楼层
dcexpert 发表于 2015-4-2 14:11
参考函数,这个是SAM R21的,其他型号应该也差不多吧:

你的代码测试了很好用。

我在调试的时候发现在下一次执行adc_init()时提示错误信息                /* Module must be disabled before initialization. Abort. */

你的代码在采集完数据后把ADC关闭了正好解决这个问题,非常感谢。



像这种每采集一个通道就要初始化,使能,再禁能,这样做效率会不会很低?有其它办法可以实现再高效的数据采集吗?比如MSP430的ADC序列功能?

点评

每次都重新初始化,效率肯定不高。但是如果要求不太高,这样也够用了,MCU速度是足够快的。如果需要高速ADC,这样应该是不行。这个是使用了查询方式等待ADC转换,使用中断方式可能会骚好一点。 ASF这个架构虽然  详情 回复 发表于 2015-4-2 15:22
虾扯蛋

回复 支持 反对

使用道具 举报

3950

TA的帖子

8

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2015-4-2 14:39:56 | 显示全部楼层
ljj3166 发表于 2015-4-2 14:35
有木有这么诡异?

下一次初始化时没有关闭ADC,所以报错。
虾扯蛋

回复 支持 反对

使用道具 举报

5919

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2015-4-2 15:22:43 | 显示全部楼层
本帖最后由 dcexpert 于 2015-4-2 15:26 编辑
littleshrimp 发表于 2015-4-2 14:39
你的代码测试了很好用。

我在调试的时候发现在下一次执行adc_init()时提示错误信息                /* Module must be disabled before initialization. Abort. */

你的代码在采集完数据后把ADC关闭了正好解决这个问题,非常感谢。



像这种每采集一个通道就要初始化,使能,再禁能,这样做效率会不会很低?有其它办法可以实现再高效的数据采集吗?比如MSP430的ADC序列功能?

每次都重新初始化,效率肯定不高。但是如果要求不太高,这样也够用了,MCU速度是足够快的。如果需要高速ADC,这样应该是不行。这个是使用了查询方式等待ADC转换,使用中断方式可能会稍好一点。高速采样通常会使用DMA方式。

ASF这个架构虽然使用方便,不用关心太多底层细节,但是也限制了很多东西。ATMEL现在好像还不支持ADC多通道扫描方式(也可能是我没有看到,至少ASF中没有这个选项)。但是它支持多次采样以及过采样提高转换精度,这个功能在其他MCU中很少见到。



回复 支持 反对

使用道具 举报

559

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2015-4-4 19:29:02 | 显示全部楼层
每次都重新初始化,设计是不合理的。SAM系列是支持ADC多通道扫描方式,ASF也支持,只是没有现成的例子。需要自己加代码。如下:
注意:
                config_adc.pin_scan.offset_start_scan    = 0;
                config_adc.pin_scan.inputs_to_scan       = 2;
第二句是扫描2个通道,第一句是扫描起始偏移量为零。
起始通道由下面这句确定。
               config_adc.positive_input  = ADC_POSITIVE_INPUT_PIN6;


  1. void configure_adc7(void)
  2. {
  3.         //! [setup_config]
  4.         struct adc_config config_adc;
  5.         //! [setup_config]
  6.         //! [setup_config_defaults]
  7.         adc_get_config_defaults(&config_adc);
  8.         //! [setup_config_defaults]

  9.         //! [setup_modify_conf]
  10.         config_adc.clock_source    = GCLK_GENERATOR_3;
  11.         config_adc.gain_factor     = ADC_GAIN_FACTOR_1X;
  12.         config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV8;
  13.         config_adc.reference       = ADC_REFCTRL_REFSEL_INT1V;
  14.         config_adc.positive_input  = ADC_POSITIVE_INPUT_PIN6;//ADC_POSITIVE_INPUT_TEMP;
  15.         config_adc.resolution      = ADC_RESOLUTION_12BIT;
  16.        
  17.                 config_adc.pin_scan.offset_start_scan    = 0;
  18.                 config_adc.pin_scan.inputs_to_scan       = 2;
  19.        
  20.         //! [setup_modify_conf]

  21.         //! [setup_set_config;
  22.         adc_init(&adc_instance, ADC, &config_adc);
  23.         //! [setup_set_config]

  24.         //! [setup_enable]
  25.         adc_enable(&adc_instance);
  26.         //! [setup_enable]
  27. }
复制代码

回复 支持 反对

使用道具 举报

559

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2015-4-4 19:33:40 | 显示全部楼层

主程序中用下面语句读出。结果也是按采集顺序交错的。

                adc_read_buffer_job(&adc_instance, adc_result_buffer, ADC_SAMPLES);

                //! [job_complete_poll]
                while (adc_read_done == false)
                {
                        /* Wait for asynchronous ADC read to complete */
                }
               

回复 支持 反对

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-6-25 04:38 , Processed in 0.381180 second(s), 16 queries , Redis On.

快速回复 返回顶部 返回列表
关闭