发新帖我要提问
12
返回列表
打印
[STM32F0]

STM32F030 AD采样怎么每个通道是MCU供电电压值呢?

[复制链接]
楼主: pmw_56
手机看帖
扫描二维码
随时随地手机跟帖
21
pmw_56 发表于 2015-6-5 17:17
这样在主程序中读取,并显示行不行?实际上我现在用你的给那个代码试了,没有显示,也就是说没有DMA转换 ...

我 读取ADC结果部分 代码:

for(i=0;i<10;i++)                // ¶ÔÖ¸¶¨ADCÊäÈëͨµÀÁ¬Ðø¶ÁÈ¡10´ÎADC½á¹û

   {

     /* Test DMA1 TC flag */
        while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET )
        {};
   
/* Clear DMA TC flag */
DMA_ClearFlag(DMA1_FLAG_TC1);
   
adc_buf=ADC_ConvertedValue[channel];

delay(1000);     
   
   }

使用特权

评论回复
22
行云_流水| | 2015-6-5 17:28 | 只看该作者
pmw_56 发表于 2015-6-5 17:24
非常感谢你这位热心的朋友!我搞这个AD采样几天了,一直没有解决

我 读ADC结果部分 的 代码:
for(i=0;i<10;i++)                // ¶ÔÖ¸¶¨ADCÊäÈëͨµÀÁ¬Ðø¶ÁÈ¡10´ÎADC½á¹û

   {

     /* Test DMA1 TC flag */
        while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET )
        {};
   
/* Clear DMA TC flag */
DMA_ClearFlag(DMA1_FLAG_TC1);
   
adc_buf=ADC_ConvertedValue[channel];

delay(1000);     
   
   }

使用特权

评论回复
23
pmw_56|  楼主 | 2015-6-5 17:35 | 只看该作者
行云_流水 发表于 2015-6-5 17:25
我 读取ADC结果部分 代码:

for(i=0;i

我现在用的是你给的代码,没有显示。   DMA1_FLAG_TC1  这个标志位一直是0

使用特权

评论回复
24
行云_流水| | 2015-6-5 17:45 | 只看该作者
pmw_56 发表于 2015-6-5 17:35
我现在用的是你给的代码,没有显示。   DMA1_FLAG_TC1  这个标志位一直是0

你 程序其他地方 有没有问题 啊

你实验一下 你之前的 程序,把程序其他 部分 全部 屏蔽 掉,

只进行 一路ADC采样,转换出来不要 换算,直接 显示ADC数字量,看 结果 如何

我 能 分享给 你的 就是,我 的 GPIO  ADC  DMA是怎么 配置的 ,还有ADC结果是怎么读的 ,至于你 怎么参考怎么整合   还有排错,还 是 主要靠你

使用特权

评论回复
25
行云_流水| | 2015-6-5 17:48 | 只看该作者
pmw_56 发表于 2015-6-5 17:35
我现在用的是你给的代码,没有显示。   DMA1_FLAG_TC1  这个标志位一直是0

在给 你看 一下我 的 行 初始化阿斯 怎么 调用GPIO   ADC   DMA初始化的

void  system_initial(void)

{
//------------------------------
//ϵͳʱÖÓÅäÖã¬ÔÚ½øÈëmain()֮ǰ£¬ÒѾ­ÅäÖ㬼ûÆô¶¯Îļþstartup_stm32f030.s
//------------------------------
GPIO_configure();
  display_clear();       

ADC_configure();
DMA_configure();

USART_configure();       
tim3_configure();
nvic_configure();
       
}

使用特权

评论回复
26
pmw_56|  楼主 | 2015-6-6 16:04 | 只看该作者
行云_流水 发表于 2015-6-5 17:48
在给 你看 一下我 的 行 初始化阿斯 怎么 调用GPIO   ADC   DMA初始化的

void  system_initial(void)

搞定了

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

#define ADC1_DR_Address                0x40012440
__IO uint16_t ADC1ConvData[4];


void ADC1_DMA_Init(void)
{
  ADC_InitTypeDef     ADC_InitStruct;
  DMA_InitTypeDef     DMA_InitStruct;
        GPIO_InitTypeDef    GPIO_InitStruct;
          /* ADC1 DeInit */  
  ADC_DeInit(ADC1);

        /* Enable  GPIOA clock */
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

  /* Configure PA.01  as analog input */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStruct);                                // PC1,输入时不用设置速率


  /* DMA1 Channel1 Config */
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)ADC1ConvData;
  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStruct.DMA_BufferSize =4;
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;
  DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStruct);
  
  /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);
  
//   /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  
  /* Enable ADC_DMA */
//  ADC_DMACmd(ADC1, ENABLE);  
  
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStruct);
  
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStruct);

//   /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */
//   ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
//   ADC_TempSensorCmd(ENABLE);
  
  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
       
  ADC_ChannelConfig(ADC1, ADC_Channel_0  , ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_1  , ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_2  , ADC_SampleTime_55_5Cycles);
        ADC_ChannelConfig(ADC1, ADC_Channel_3  , ADC_SampleTime_55_5Cycles);
       
//   ADC_VrefintCmd(ENABLE);
  
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
       
  ADC_DMACmd(ADC1, ENABLE);
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);
       
}
//=======================================
主循环:
while(1)
        {
                        Free_WWDG();
               
               
                        ADC_ConvertedValueLocal= ADC1ConvData[0];
                        delay(2);
                        Display(0,0,ADC_ConvertedValueLocal);
               
                        ADC_ConvertedValueLocal= ADC1ConvData[1];
                        delay(2);
                        Display(40,0,ADC_ConvertedValueLocal);
               
                        ADC_ConvertedValueLocal= ADC1ConvData[2];
                        delay(2);
                        Display(0,1,ADC_ConvertedValueLocal);
               
                        ADC_ConvertedValueLocal= ADC1ConvData[3];
                        delay(2);
                        Display(40,1,ADC_ConvertedValueLocal);
               

}

使用特权

评论回复
27
pmw_56|  楼主 | 2015-6-6 16:16 | 只看该作者
pmw_56 发表于 2015-6-6 16:04
搞定了

/* Private typedef -----------------------------------------------------------*/

/* Enable ADC_DMA */
  ADC_DMACmd(ADC1, ENABLE);  

ADC DMA 开启一定放在ADC1校准后面,否则通道会混乱了

使用特权

评论回复
28
戈卫东| | 2015-6-7 07:06 | 只看该作者
   /* Enable  GPIOA clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIOA不是在AHB上 是在APB2上

使用特权

评论回复
29
戈卫东| | 2015-6-7 07:07 | 只看该作者
RCC_AHBPeriph_GPIOA这个不会产生编译错误么?

使用特权

评论回复
30
戈卫东| | 2015-6-7 07:15 | 只看该作者
噗。。。。。。我搞错了。。。。。030和103不一样。。。。。。。

使用特权

评论回复
31
pmw_56|  楼主 | 2015-6-8 14:07 | 只看该作者
戈卫东 发表于 2015-6-7 07:15
噗。。。。。。我搞错了。。。。。030和103不一样。。。。。。。

我最后贴出那个代码是调试可以用的

使用特权

评论回复
32
Wayner| | 2015-8-11 21:48 | 只看该作者
戈卫东 发表于 2015-6-7 07:06
/* Enable  GPIOA clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIOA不是在 ...

请问哪个对啊?

使用特权

评论回复
33
Wayner| | 2015-8-24 20:32 | 只看该作者
恭喜LZ搞定了,我试了三个礼拜了还没有好啊

使用特权

评论回复
34
lwsn| | 2015-8-24 20:36 | 只看该作者
3039是ADC采样的数字量,实际对应地电压值需要再转换的

使用特权

评论回复
35
稳稳の幸福| | 2015-8-24 21:09 | 只看该作者
这个没法做吧,我是不会。

使用特权

评论回复
36
捉虫天师| | 2015-8-24 21:20 | 只看该作者
没用过,都是直接采用了内部的参考,然后随便做做

使用特权

评论回复
37
迪卡| | 2015-8-30 21:39 | 只看该作者
GPIO口改为 GPIO_Mode_AN  模式

使用特权

评论回复
38
拉克丝| | 2015-8-30 21:47 | 只看该作者
ADC DMA 开启一定放在ADC1校准后面,否则通道会混乱了,这个学习了

使用特权

评论回复
39
xia00| | 2015-8-30 23:01 | 只看该作者
呵呵,这帖子都过去这长时间了,想必楼主的问题早已经解决了吧。。现在也是遇到了类似的问题了。。进来看看。。

使用特权

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

本版积分规则