打印

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

[复制链接]
4761|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mei326|  楼主 | 2013-7-5 10:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, DM, ST, ni
本帖最后由 mei326 于 2013-7-5 10:53 编辑

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

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

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

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

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

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

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);          //ADCÃüÁʹÄÜ
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);  //¿ªÆôADC1
  
  /* Enable ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);          //ÖØÐÂУ׼
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));  //µÈ´ýÖØÐÂУ׼Íê³É
  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);                //¿ªÊ¼Ð£×¼
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));           //µÈ´ýУ׼Íê³É
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //Á¬Ðøת»»¿ªÊ¼£¬ADCͨ¹ýDMA·½Ê½²»¶ÏµÄ¸üÐÂRAMÇø¡£
}
/**
  * @}
  */

uint16_t GetAdc_Value(void)
{
        return ADCConvertedValue;
}
[

沙发
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不妨查一下

使用特权

评论回复
5
yzzly| | 2013-7-5 16:41 | 只看该作者
4楼,不要人云亦云,本人用STM32F103做10KV保护,10个通道的交流信号,每周期采样32点数据,转换结果都是用DMA读取,怎么就没见“错位”?

使用特权

评论回复
6
trumpxp| | 2013-7-5 18:41 | 只看该作者
不是很了解这个问题   楼主   帮你顶一个    再看看别人的意见    顶起来   很不错

使用特权

评论回复
7
hxb20122012| | 2013-7-5 20:16 | 只看该作者
会错位的,我遇到过。

使用特权

评论回复
8
hxb20122012| | 2013-7-5 20:16 | 只看该作者
LZ,留下联系方式,发个给你。

使用特权

评论回复
9
hxb20122012| | 2013-7-5 20:17 | 只看该作者
我只是说有这种情况出现。

使用特权

评论回复
10
hxb20122012| | 2013-7-5 20:19 | 只看该作者
而且这个问题是绝对存在的。

使用特权

评论回复
11
江枫渔火| | 2013-7-5 22:39 | 只看该作者
估计是没用对~数字电路不像是这么容易出问题

使用特权

评论回复
12
HORSE7812| | 2013-7-6 10:53 | 只看该作者
帮顶

使用特权

评论回复
13
hkcj| | 2013-7-6 16:18 | 只看该作者
帮楼主顶一个   这一块   真的不是很了解   楼主  没帮上你的忙   对不住

使用特权

评论回复
14
ahpuhts| | 2013-8-4 14:23 | 只看该作者
不懂啊,学习;额

使用特权

评论回复
15
hkcj| | 2013-8-4 19:01 | 只看该作者
问题解决了吗  楼主   应该解决了吧   顶一个  

使用特权

评论回复
16
醉卧红尘| | 2013-8-20 22:49 | 只看该作者
我遇到的问题有ADC采集回来的AD值不稳定,不断地在几十之间跳变。该如何解决?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

117

主题

764

帖子

2

粉丝