[STM32] 求助!STM32F103的ADC+DMA采样得到的数据都是0,求大神

[复制链接]
2986|7
 楼主| 小小pursue 发表于 2017-8-20 15:21 | 显示全部楼层 |阅读模式
部分电路结构图如下:

使用了NX3L4051模块对ADC采样通道进行选择,所以程序里也有体现。

目前就是读数一直是0,感觉自己的配置什么的也好像没有问题,检查了好多遍。

但是还是有疑问,我的程序好像没有判断什么时候DMA可以开始传输数据以及ADC什么时候采样好,还请各位大神给出建议,如果能够找到我的问题,那简直太感谢了。

先谢谢各位能够抽空看看我的程序了,非常感谢!
主程序如下:
  1. /**
  2. #include "stm32f10x.h"
  3. #include "led.h"
  4. #include "usart.h"
  5. #include "adc.h"

  6. uint8_t curr_state=0;
  7. uint8_t counter=0;
  8. uint8_t head;
  9. uint8_t dataADC[25];   
  10. extern __IO uint16_t ADC_ConvertedValue;
  11. void Delay(__IO u32 nCount);

  12. int main(void)
  13. {
  14.     /* USART1 config 115200 8-N-1 */
  15.          
  16.         USART1_Config();
  17.     ADC1_Init();
  18.          
  19.         while(1)
  20.         {
  21.                 switch(curr_state){
  22.                 case 0:
  23.                 head = 0x2A;
  24.                 dataADC[counter]=0x2A;
  25.                 counter++;
  26.                 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
  27.                 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
  28.                 GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
  29.                 GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET);           
  30.                 Delay(2000);
  31.                 dataADC[counter]= ADC_ConvertedValue;                    
  32.                  
  33.                 //dataADC[counter]=(uint8_t)(ADC_ConvertedValue & 0xFF);        
  34.                 dataADC[counter+1]=(uint8_t)((ADC_ConvertedValue >>8 )& 0xFF);
  35.                 counter+=2;//2
  36.                 Delay(20);
  37.                 curr_state=1;                       
  38.                 break;
  39.                  
  40.                 case 1:
  41.                 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
  42.                 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
  43.                 GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
  44.                 GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET);
  45.                 Delay(2000);
  46.                 dataADC[counter]=(uint8_t)(ADC_ConvertedValue & 0xFF);                                    
  47.                 dataADC[counter+1]=(uint8_t)((ADC_ConvertedValue >>8 )& 0xFF);
  48.                 counter+=2;//4
  49.                 Delay(20);
  50.                 curr_state=2;   
  51.                  
  52.                  
  53.                 case 2:
  54.                 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
  55.                 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
  56.                 GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET);
  57.                 GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_SET);
  58.                 Delay(2000);
  59.                 dataADC[counter]=(uint8_t)(ADC_ConvertedValue & 0xFF);                                    
  60.                 dataADC[counter+1]=(uint8_t)((ADC_ConvertedValue >>8 )& 0xFF);
  61.                 counter+=2;//6
  62.                 Delay(20);
  63.                 curr_state=3;   
  64.                  
  65.                 case 3:
  66.                 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
  67.                 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
  68.                 GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
  69.                 GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET);
  70.                 Delay(2000);
  71.                 dataADC[counter]=(uint8_t)(ADC_ConvertedValue & 0xFF);                                    
  72.                 dataADC[counter+1]=(uint8_t)((ADC_ConvertedValue >>8 )& 0xFF);
  73.                 counter+=2;//8
  74.                 Delay(20);
  75.                 curr_state=4;
  76.                  
  77.                 case 4:
  78.                 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET);
  79.                 GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
  80.                 GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET);
  81.                 GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_SET);
  82.                 Delay(2000);
  83.                 dataADC[counter]=(uint8_t)(ADC_ConvertedValue & 0xFF);                                    
  84.                 dataADC[counter+1]=(uint8_t)((ADC_ConvertedValue >>8 )& 0xFF);
  85.                 counter+=2;//10
  86.                 Delay(20);
  87.                 curr_state=5;
  88.                  
  89.                 case 5:
  90.                     counter=0;
  91.                     dataADC[1] = ADC_GetConversionValue(ADC1);
  92.                     //dataADC[2] = Get_Adc(1);  
  93.                     UART1_Send_Array(dataADC,11);
  94.                     Delay(2000);
  95.                  // printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue[0]);
  96.                     curr_state=0;
  97.                     break;
  98.                  default:
  99.                     break;
  100.             }
  101.          
  102.         }
  103. }


  104. void Delay(__IO uint32_t nCount)     
  105. {
  106.     for(; nCount != 0; nCount--);
  107. }



ADC配置程序如下:
  1. #include "adc.h"
  2. #include "usart.h"

  3. #define ADC1_DR_Address    ((u32)0x40012400+0x4c)

  4. __IO uint16_t ADC_ConvertedValue;

  5. */    **ADC1 GPIO Configuration   
  6.     PA2     ------> ADC1_IN2
  7.     PB1     ------> ADC1_IN9
  8.   */
  9. static void ADC1_GPIO_Config(void)
  10. {
  11.     GPIO_InitTypeDef GPIO_InitStructure;
  12.      
  13.     /* Enable DMA clock */
  14.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  15.      
  16.     /* Enable ADC1 and GPIOA and GPIOB clock */
  17.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);
  18.      
  19.     /*Configure GPIO pins : PC14 PC15 */
  20.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
  21.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  22.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  23.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  24.      
  25.     /* Configure PA.03|4|5  as analog output */
  26.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  28.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  29.     GPIO_Init(GPIOA, &GPIO_InitStructure);               
  30.      
  31.     /* Configure PB.00  as analog output */
  32.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  34.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  35.     GPIO_Init(GPIOB, &GPIO_InitStructure);               
  36.      
  37.     /* Configure PA.02  as analog input */
  38.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  39.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  40.     GPIO_Init(GPIOA, &GPIO_InitStructure);               
  41.      
  42.     /* Configure PB.01  as analog input */
  43.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  44.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  45.     GPIO_Init(GPIOB, &GPIO_InitStructure);   
  46. }


  47. static void ADC1_Mode_Config(void)
  48. {
  49.     DMA_InitTypeDef DMA_InitStructure;
  50.     ADC_InitTypeDef ADC_InitStructure;
  51.      
  52.     /* DMA channel1 configuration */
  53.     DMA_DeInit(DMA1_Channel1);
  54.      
  55.     DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;               
  56.     DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;   
  57.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  58.     DMA_InitStructure.DMA_BufferSize = Numberofchannel;
  59.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;   
  60.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 
  61.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   
  62.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  63.     DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;                                   
  64.     DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
  65.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  66.     DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  67.      
  68.     /* Enable DMA channel1 */
  69.     DMA_Cmd(DMA1_Channel1, ENABLE);
  70.      
  71.     /* ADC1 configuration */   
  72.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;           
  73.     ADC_InitStructure.ADC_ScanConvMode = ENABLE ;                     
  74.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;           
  75.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   
  76.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   
  77.     ADC_InitStructure.ADC_NbrOfChannel = Numberofchannel;                    
  78.     ADC_Init(ADC1, &ADC_InitStructure);
  79.      
  80.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);

  81.     ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_1Cycles5);
  82.     ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 2, ADC_SampleTime_1Cycles5);
  83.      
  84.     /* Enable ADC1 DMA */
  85.     ADC_DMACmd(ADC1, ENABLE);
  86.      
  87.     /* Enable ADC1 */
  88.     ADC_Cmd(ADC1, ENABLE);
  89.      
  90.     ADC_ResetCalibration(ADC1);
  91.     while(ADC_GetResetCalibrationStatus(ADC1));
  92.      
  93.     /* ADCУ׼ */
  94.     ADC_StartCalibration(ADC1);
  95.     /* µÈ´ýУ׼Íê³É*/
  96.     while(ADC_GetCalibrationStatus(ADC1));
  97.     /* ÓÉÓÚûÓвÉÓÃÍⲿ´¥·¢£¬ËùÒÔʹÓÃÈí¼þ´¥·¢ADCת»» */
  98.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  99. }
  100. void ADC1_Init(void)
  101. {
  102.     ADC1_GPIO_Config();
  103.     ADC1_Mode_Config();
  104. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 小小pursue 发表于 2017-8-20 20:59 | 显示全部楼层
顶起来,希望有人可以帮忙看一下,万分感谢。
feelhyq 发表于 2017-8-21 09:54 | 显示全部楼层
第61行 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; 这里应该是一个数组的地址然后强转U32,而你这个ADC_ConvertedValue 从第11行来看,定义的一个变量,然后转成U32,很有问题的。可以这样使用

定义一个数组ADC_ConvertedValue[100】,然后
第61行  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
第63行 DMA_InitStructure.DMA_BufferSize =100;



feelhyq 发表于 2017-8-21 09:54 | 显示全部楼层
小小pursue 发表于 2017-8-20 20:59
顶起来,希望有人可以帮忙看一下,万分感谢。

另外 ,量一下 ADC   2个管脚的电压是不是为0,如果是的话,很可能程序本身没有问题。
gujiamao12345 发表于 2017-8-21 09:59 | 显示全部楼层
ADC的连续模式打开看看!
 楼主| 小小pursue 发表于 2017-8-21 17:06 | 显示全部楼层
最后解决了。问题出在每次改变通道我使用的是NX3L4051芯片对其进行选择,尝试了一下在每次选择之后都重新ENABLE 一下ADC,就可以获取ADC的值了。感谢回复我的大神们。
 楼主| 小小pursue 发表于 2017-8-22 09:43 | 显示全部楼层
feelhyq 发表于 2017-8-21 09:54
第61行 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; 这里应该是一个数组的地址然后 ...

太感谢了,您看了我的代码!我最后能够实现功能了,但是DMA的功能却一直没有调试出来。数组的这个问题我也考虑过了,但是尝试了多种修改好像不是这个问题(因为之前参考别人的代码这样写应该是对的)。之后我会再来看看DMA传输到底哪里出了问题,谢谢您的解答。
 楼主| 小小pursue 发表于 2017-8-22 09:44 | 显示全部楼层
gujiamao12345 发表于 2017-8-21 09:59
ADC的连续模式打开看看!

嗯嗯,ADC部分我后来解决了。应该不是模式的问题。。。现在剩下DMA传输的问题没有解决。。。非常感谢您的回答。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部