收藏官网首页
查看: 10087|回复: 2

GoKIT2 ADC DMA 采集模拟值,总是有问题,大神帮忙看下

4

主题

13

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
跳转到指定楼层
楼主
发表于 2017-1-6 15:52:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
采集PA0-PA5上的模拟值,各端口均无电压时,就显示除了PA0,1-5均有电压,能正常测量PA0电压

程序如下:


  1. #include "adc/ADC2.h"
  2. #include <stdio.h>
  3. /*定义数组变量ADC_ConvertedValue[2],
  4. __IO uint16_t ADC_ConvertedValue[7];
  5. void ADC1_conf(void)
  6. {
  7.         ADC1_GPIO_Config();
  8.         ADC1_Mode_Config();
  9.        
  10. }

  11. static void ADC1_GPIO_Config(void)
  12. {
  13. GPIO_InitTypeDef GPIO_InitStructure;
  14. /* Enable DMA clock */
  15. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  16. /* Enable ADC1 and GPIOC clock */
  17. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA,ENABLE);
  18.        
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  20.        
  21. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  22. GPIO_Init(GPIOA, &GPIO_InitStructure);
  23. }
  24. /* 函数名:ADC1_Mode_Config
  25. * 描述 :配置ADC1的工作模式为MDA模式
  26. * 输入 : 无
  27. * 输出 :无
  28. * 调用 :内部调用
  29. */
  30. static void ADC1_Mode_Config(void)
  31. {
  32. DMA_InitTypeDef DMA_InitStructure;
  33. ADC_InitTypeDef ADC_InitStructure;
  34. /* DMA channel1 configuration */
  35. DMA_DeInit(DMA1_Channel1);
  36. /*定义DMA外设基地址,即为存放转换结果的寄存器*/
  37. //DMA_InitStructure.DMA_PeripheralBaseAddr =ADC1_DR_Address; /*定义内存基地址*/
  38.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设ADC基地址
  39. DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&ADC_ConvertedValue;
  40. /*定义AD外设作为数据传输的来源*/
  41. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  42.        
  43.         DMA_InitStructure.DMA_BufferSize = 6;
  44.        
  45. /*设定寄存器地址固定*/
  46. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  47.        

  48.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  49.        
  50. /*设定外设数据宽度*/       
  51. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  52. /*设定内存的的宽度*/
  53. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  54. /*设定DMA工作再循环缓存模式*/
  55. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  56. /*设定DMA选定的通道软件优先级*/
  57. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  58. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  59. DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  60. /* Enable DMA channel1 */
  61. DMA_Cmd(DMA1_Channel1, ENABLE);
  62. /*设置ADC工作在独立模式*/
  63. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

  64. /*规定AD转换工作在扫描模式,即对多个通道采样*/
  65.         ADC_InitStructure.ADC_ScanConvMode = ENABLE ;

  66. /*设定AD转化在连续模式*/
  67. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  68. /*不使用外部促发转换*/
  69. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  70. /*采集的数据在寄存器中以右对齐的方式存放*/
  71. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

  72. /*设定要转换的AD通道数目*/
  73.         ADC_InitStructure.ADC_NbrOfChannel = 6;

  74. ADC_Init(ADC1, &ADC_InitStructure);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

  75. /*配置ADC时钟,为PCLK2的8分频,即9MHz*/
  76. RCC_ADCCLKConfig(RCC_PCLK2_Div8);

  77. /*配置ADC1的通道11为55.5个采样周期 */
  78. ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
  79. ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
  80. ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
  81. ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);
  82. ADC_RegularChannelConfig(ADC1, ADC_Channel_4 ,5, ADC_SampleTime_55Cycles5);
  83. ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5);

  84. /* Enable ADC1 DMA */
  85. ADC_DMACmd(ADC1, ENABLE);
  86. /* Enable ADC1 */
  87. ADC_Cmd(ADC1, ENABLE);
  88. /*复位校准寄存器 */
  89. ADC_ResetCalibration(ADC1);
  90. /*等待校准寄存器复位完成 */
  91. while(ADC_GetResetCalibrationStatus(ADC1));
  92. /* ADC校准 */
  93. ADC_StartCalibration(ADC1);
  94. /* 等待校准完成*/
  95. while(ADC_GetCalibrationStatus(ADC1));
  96. /* 由于没有采用外部触发,所以使用软件触发ADC转换 */
  97. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  98. }

  99. u16 GetVdy(u16 advalue)
  100. {
  101. //return (u16)( ADCConvertedValue * 330 / 4096*1000);
  102.         return (u16)(ADC_ConvertedValue[advalue]);
  103. }


  104. void G_shuchu(void)
  105. {
  106.         printf(" ADC_ConvertedValue [0]:%d\r\n", ADC_ConvertedValue[0]);
  107.         printf(" ADC_ConvertedValue [1]:%d\r\n", ADC_ConvertedValue[1]);
  108.         printf(" ADC_ConvertedValue [2]:%d\r\n", ADC_ConvertedValue[2]);
  109.         printf(" ADC_ConvertedValue [3]:%d\r\n", ADC_ConvertedValue[3]);
  110.         printf(" ADC_ConvertedValue [4]:%d\r\n", ADC_ConvertedValue[4]);
  111.         printf(" ADC_ConvertedValue [5]:%d\r\n", ADC_ConvertedValue[5]);
  112.        
  113.         printf(" ADC_GetConversionValue:%d\r\n", ADC_GetConversionValue(ADC1));

  114.         //printf(" ADC_ConvertedValue [3]:%d\r\n", ADC_ConvertedValue[3]);
  115. }
复制代码


4

主题

13

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
沙发
 楼主| 发表于 2017-1-8 16:28:57 | 只看该作者
问题基本找到,谢谢yCat的帖子,http://club.gizwits.com/forum.ph ... 2&highlight=stm

5

主题

21

帖子

183

积分

注册会员

Rank: 2

积分
183
板凳
发表于 2017-5-19 18:22:18 | 只看该作者
楼主怎么解决的啊,没看懂
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

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