抓狂的ADC,问题到底在哪里?

[复制链接]
 楼主| mei326 发表于 2013-7-5 10:51 | 显示全部楼层 |阅读模式
ADC, DMA, DM, ST, ni
本帖最后由 mei326 于 2013-7-5 10:53 编辑

       通过DMA读取ADC的转换结果,不过这转换值着实不解~大伙帮忙看看问题到底出在哪里!!

  1. #define ADC1_DR_Address    ((uint32_t)0x4001244C)  //ADC1 DR¼Ä´æÆ÷»ùµØÖ·
  2. ADC_InitTypeDef ADC_InitStructure;      //ADC³õʼ»¯½á¹¹ÌåÉùÃ÷
  3. DMA_InitTypeDef DMA_InitStructure;      //DMA³õʼ»¯½á¹¹ÌåÉùÃ÷
  4. // ×¢£ºADCΪ12λģÊýת»»Æ÷£¬Ö»ÓÐADCConvertedValueµÄµÍ12λÓÐЧ
  5. __IO uint16_t ADCConvertedValue;
  6. /**
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Configures the different GPIO ports.
  8.   * @param  None
  9.   * @retval None//
  10.   */
  11. void ADC_GPIO_Configuration(void)
  12. {
  13.   GPIO_InitTypeDef GPIO_InitStructure;

  14.   /* Configure PB.00 (ADC Channel0) as analog input -------------------------*/
  15.   /*PB0 ×÷ΪģÄâͨµÀ0ÊäÈëÒý½Å  */                       
  16.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  18.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  19. }
  20. /**
  21.   * @}
  22.   */
  23. void STM_EVAL_ADCConfig(void)
  24. {
  25.   /* Enable DMA1 clock */
  26.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  27.   /* DMA1 channel1 configuration ----------------------------------------------*/
  28.   DMA_DeInit(DMA1_Channel1);
  29.   DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                            //DMA¶ÔÓ¦µÄÍâÉè»ùµØÖ·
  30.   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;           //ÄÚ´æ´æ´¢»ùµØÖ·
  31.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                                //DMAµÄת»»Ä£Ê½ÎªSRCģʽ£¬ÓÉÍâÉè°áÒÆµ½ÄÚ´æ
  32.   DMA_InitStructure.DMA_BufferSize = 1;                                                                                   //DMA»º´æ´óС£¬1¸ö,µ¥Î»ÎªDMA_MemoryDataSize
  33.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                        //½ÓÊÕÒ»´ÎÊý¾Ýºó£¬É豸µØÖ·½ûÖ¹ºóÒÆ
  34.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;                                        //¹Ø±Õ½ÓÊÕÒ»´ÎÊý¾Ýºó£¬Ä¿±êÄÚ´æµØÖ·ºóÒÆ
  35.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//¶¨ÒåÍâÉèÊý¾Ý¿í¶ÈΪ16λ
  36.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                  //DMA°áÊý¾Ý³ß´ç£¬HalfWord¾ÍÊÇΪ16λ
  37.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                   //ת»»Ä£Ê½£¬Ñ­»·»º´æÄ£Ê½¡£
  38.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                //DMAÓÅÏȼ¶¸ß
  39.   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                                  //M2Mģʽ½ûÓÃ
  40.   DMA_Init(DMA1_Channel1, &DMA_InitStructure);         
  41.   
  42.   /* Enable DMA1 channel1 */
  43.   DMA_Cmd(DMA1_Channel1, ENABLE);

  44.   /* Enable ADC1 and GPIOC clock */
  45.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);
  46.   
  47.   /* ADC1 configuration ------------------------------------------------------*/
  48.   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //¶ÀÁ¢µÄת»»Ä£Ê½
  49.   ADC_InitStructure.ADC_ScanConvMode = ENABLE;                  //¿ªÆôɨÃèģʽ
  50.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;   //¿ªÆôÁ¬Ðø×ª»»Ä£Ê½
  51.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //ADCÍⲿ¿ª¹Ø£¬¹Ø±Õ״̬
  52.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //¶ÔÆë·½Ê½,ADCΪ12λÖУ¬ÓÒ¶ÔÆë·½Ê½
  53.   ADC_InitStructure.ADC_NbrOfChannel = 1;         //¿ªÆôͨµÀÊý£¬1¸ö
  54.   ADC_Init(ADC1, &ADC_InitStructure);

  55.   /* ADC1 regular channel10 configuration ADCͨµÀ×飬 µÚ10¸öͨµÀ ²ÉÑù˳Ðò1£¬×ª»»Ê±¼ä */
  56.   ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);

  57.   /* Enable ADC1 DMA */
  58.   ADC_DMACmd(ADC1, ENABLE);          //ADCÃüÁʹÄÜ
  59.   /* Enable ADC1 */
  60.   ADC_Cmd(ADC1, ENABLE);  //¿ªÆôADC1
  61.   
  62.   /* Enable ADC1 reset calibaration register */   
  63.   ADC_ResetCalibration(ADC1);          //ÖØÐÂУ׼
  64.   /* Check the end of ADC1 reset calibration register */
  65.   while(ADC_GetResetCalibrationStatus(ADC1));  //µÈ´ýÖØÐÂУ׼Íê³É
  66.   /* Start ADC1 calibaration */
  67.   ADC_StartCalibration(ADC1);                //¿ªÊ¼Ð£×¼
  68.   /* Check the end of ADC1 calibration */
  69.   while(ADC_GetCalibrationStatus(ADC1));           //µÈ´ýУ׼Íê³É
  70.   /* Start ADC1 Software Conversion */
  71.   ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //Á¬Ðø×ª»»¿ªÊ¼£¬ADCͨ¹ýDMA·½Ê½²»¶ÏµÄ¸üÐÂRAMÇø¡£
  72. }
  73. /**
  74.   * @}
  75.   */

  76. uint16_t GetAdc_Value(void)
  77. {
  78.         return ADCConvertedValue;
  79. }
[ 3.png 2.png QQ图片20130705103839.jpg

 楼主| mei326 发表于 2013-7-5 10:55 | 显示全部楼层
电机转动的时候,结果只居然为0x553~奇了,最大也就0x3FF才对呀!而且我实测电压为0.95V,这样计算出来的结果也是0x127才对呀!
ticomi 发表于 2013-7-5 12:01 | 显示全部楼层
一般这种问题都是ADC和DMA的配置问题,建议你再仔细检查下各项设置问题,逐项检查,最好参考参考手册来检查配置。

我遇到几个类似问题,最后都是配置设置时不注意导致的。

IJK 发表于 2013-7-5 13:59 | 显示全部楼层
STM32 ADC 用DMA时据说容易错位,LZ不妨查一下
yzzly 发表于 2013-7-5 16:41 | 显示全部楼层
4楼,不要人云亦云,本人用STM32F103做10KV保护,10个通道的交流信号,每周期采样32点数据,转换结果都是用DMA读取,怎么就没见“错位”?
trumpxp 发表于 2013-7-5 18:41 | 显示全部楼层
不是很了解这个问题   楼主   帮你顶一个    再看看别人的意见    顶起来   很不错
hxb20122012 发表于 2013-7-5 20:16 | 显示全部楼层
会错位的,我遇到过。
hxb20122012 发表于 2013-7-5 20:16 | 显示全部楼层
LZ,留下联系方式,发个给你。
hxb20122012 发表于 2013-7-5 20:17 | 显示全部楼层
我只是说有这种情况出现。
hxb20122012 发表于 2013-7-5 20:19 | 显示全部楼层
而且这个问题是绝对存在的。
江枫渔火 发表于 2013-7-5 22:39 | 显示全部楼层
估计是没用对~数字电路不像是这么容易出问题
HORSE7812 发表于 2013-7-6 10:53 | 显示全部楼层
帮顶
hkcj 发表于 2013-7-6 16:18 | 显示全部楼层
帮楼主顶一个   这一块   真的不是很了解   楼主  没帮上你的忙   对不住
ahpuhts 发表于 2013-8-4 14:23 | 显示全部楼层
不懂啊,学习;额
hkcj 发表于 2013-8-4 19:01 | 显示全部楼层
问题解决了吗  楼主   应该解决了吧   顶一个  
醉卧红尘 发表于 2013-8-20 22:49 | 显示全部楼层
我遇到的问题有ADC采集回来的AD值不稳定,不断地在几十之间跳变。该如何解决?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:与其等待机会,不如主动出击...

117

主题

763

帖子

2

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