[讨论] [SAM R21]发现R21的ADC稳定性不太好

dcexpert   2015-3-1 22:49 楼主

这几天发现SAM R21的ADC转换不是太稳定,数据波动比较大。测试时将电位器接到ADC6上,使用内部1V基准,转换后发送到串口。

从图中可以看到,数据波动较大,最大991,最小967,波动有24,这还不是波动最大的数据。即使设置ADC采样数据平均,效果也没有任何改善。

1.jpg

参考代码:
  1. /**
  2. * \file
  3. *
  4. * \brief SAM ADC Quick Start
  5. *
  6. * Copyright (C) 2013-2014 Atmel Corporation. All rights reserved.
  7. *
  8. * \asf_license_start
  9. *
  10. * \page License
  11. *
  12. * Redistribution and use in source and binary forms, with or without
  13. * modification, are permitted provided that the following conditions are met:
  14. *
  15. * 1. Redistributions of source code must retain the above copyright notice,
  16. *    this list of conditions and the following disclaimer.
  17. *
  18. * 2. Redistributions in binary form must reproduce the above copyright notice,
  19. *    this list of conditions and the following disclaimer in the documentation
  20. *    and/or other materials provided with the distribution.
  21. *
  22. * 3. The name of Atmel may not be used to endorse or promote products derived
  23. *    from this software without specific prior written permission.
  24. *
  25. * 4. This software may only be redistributed and used in connection with an
  26. *    Atmel microcontroller product.
  27. *
  28. * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
  29. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  30. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  31. * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR
  32. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  33. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  34. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  35. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  36. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  37. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  38. * POSSIBILITY OF SUCH DAMAGE.
  39. *
  40. * \asf_license_stop
  41. *
  42. */
  43. /**
  44. * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
  45. */
  46. #include <asf.h>
  47. #include <stdio.h>

  48. char str[50];

  49. void configure_adc(void);

  50. //! [module_inst]
  51. struct adc_module adc_instance;
  52. //! [module_inst]

  53. //! [setup]
  54. void configure_adc(void)
  55. {
  56. //! [setup_config]
  57.         struct adc_config config_adc;
  58. //! [setup_config]
  59. //! [setup_config_defaults]
  60.         adc_get_config_defaults(&config_adc);
  61. //! [setup_config_defaults]

  62. //! [setup_set_config]
  63.         adc_init(&adc_instance, ADC, &config_adc);
  64. //! [setup_set_config]

  65. //! [setup_enable]
  66.         adc_enable(&adc_instance);
  67. //! [setup_enable]
  68. }
  69. //! [setup]

  70. void configure_usart(void);

  71. //! [module_inst]
  72. struct usart_module usart_instance;
  73. //! [module_inst]

  74. //! [setup]
  75. void configure_usart(void)
  76. {
  77.         //! [setup_config]
  78.         struct usart_config config_usart;
  79.         //! [setup_config]
  80.         //! [setup_config_defaults]
  81.         usart_get_config_defaults(&config_usart);
  82.         //! [setup_config_defaults]

  83.         //! [setup_change_config]
  84.         config_usart.baudrate    = 9600;
  85.         config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
  86.         config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
  87.         config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
  88.         config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
  89.         config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
  90.         //! [setup_change_config]

  91.         //! [setup_set_config]
  92.         while (usart_init(&usart_instance,
  93.         EDBG_CDC_MODULE, &config_usart) != STATUS_OK) {
  94.         }
  95.         //! [setup_set_config]

  96.         //! [setup_enable]
  97.         usart_enable(&usart_instance);
  98.         //! [setup_enable]
  99. }
  100. //! [setup]

  101. int main(void)
  102. {
  103.         system_init();

  104. //! [setup_init]
  105.         delay_init();
  106.         configure_adc();
  107.         configure_usart();
  108. //! [setup_init]

  109. //! [main]


  110. //! [get_res]
  111.         uint16_t result;

  112.         while(1)
  113.         {
  114.                 //! [start_conv]
  115.                 adc_start_conversion(&adc_instance);
  116.                 //! [start_conv]
  117.                 do {
  118.                         /* Wait for conversion to be done and read out result */
  119.                 } while (adc_read(&adc_instance, &result) == STATUS_BUSY);
  120.                
  121.                 sprintf(str, "%d\r\n", result);
  122.                 usart_write_buffer_wait(&usart_instance, str, sizeof(str));
  123.                
  124.                 delay_ms(500);
  125.        
  126. //! [get_res]
  127.         }
  128. //! [inf_loop]
  129.         while (1) {
  130.                 /* Infinite loop */
  131.         }
  132. //! [inf_loop]
  133. //! [main]
  134. }


回复评论 (13)

波动挺大的
点赞  2015-3-2 00:34
确实够大呀,回去试试
点赞  2015-3-2 09:09
帮忙测一下内部温度检测通道吧,我的转换结果始终为0。

我的内部电压转换正常。

点赞  2015-3-2 10:12
你的电源供电不稳吧!
点赞  2015-3-2 14:38
测过的,可以测出来,但是效果也不好,误差很大。
点赞  2015-3-2 14:42
引用: yangshoot 发表于 2015-3-2 14:38
你的电源供电不稳吧!

USB供电,很稳定。测试内部VCCIO的电压,基本是不波动。


点赞  2015-3-2 14:49
引用: dcexpert 发表于 2015-3-2 06:42
测过的,可以测出来,但是效果也不好,误差很大。


我的怎么测不出来呢?除了和测内部VCCIO电压相同设置外,不同的地方就是改了转换通道。还有其他什么特殊的地方要设置吗?


点赞  2015-3-2 17:04
引用: yang_alex 发表于 2015-3-2 17:04
我的怎么测不出来呢?除了和测内部VCCIO电压相同设置外,不同的地方就是改了转换通道。还有其他什么特殊的地方要设置吗?


没有了,你把程序发上来看看。

点赞  2015-3-2 21:24
引用: dcexpert 发表于 2015-3-2 13:24 没有了,你把程序发上来看看。
就是atmel Studio中的例子程序,只是修改了转换通道 adc_demo.JPG
  1. void configure_adc(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.gain_factor = ADC_GAIN_FACTOR_DIV2;
  11. config_adc.clock_prescaler = ADC_CLOCK_PRESCALER_DIV8;
  12. config_adc.reference = ADC_REFERENCE_INTVCC1;
  13. config_adc.positive_input = ADC_POSITIVE_INPUT_PIN6;
  14. config_adc.resolution = ADC_RESOLUTION_12BIT;
  15. //! [setup_modify_conf]
  16. //! [setup_set_config]
  17. adc_init(&adc_instance, ADC, &config_adc);
  18. //! [setup_set_config]
  19. //! [setup_enable]
  20. adc_enable(&adc_instance);
  21. //! [setup_enable]
  22. }
本帖最后由 yang_alex 于 2015-3-3 10:54 编辑
点赞  2015-3-3 18:53
这段代码没有什么问题,不知道是不是其它部分设置或者初始化部分问题。

还有一种可能就是芯片本身的问题。
点赞  2015-3-3 20:55
感觉ADC模块想做好,还是比较困难的
So TM what......?
点赞  2015-3-4 11:49
good
点赞  2015-7-8 14:42
good
点赞  2015-7-8 14:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复