打印
[STM8]

求助STM8L15x ADC 多通道连续转换模式问题

[复制链接]
8406|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dipingzhu|  楼主 | 2015-7-24 12:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dipingzhu 于 2015-7-24 12:13 编辑

我用PA4和内部参考电压,作为ADC的二个通道,每个通道用单通道模式测试转换都是正确的,但是ADC和DMA参数改成多通道模式时结果不正确,为乱码。代码如下:
void ADC_Icc_Init(void)                                                        //ADC初始化,ADC连续转换模式
{
  /* Enable ADC clock */
  
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);                       //开启ADC时钟

  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);                       //DMA时钟
  
  DMA_DeInit(DMA1_Channel1);                                                    //初始化DMA
  
  /* de-initialize ADC */
  
  ADC_DeInit(ADC1);                                                             //初始化ADC

  /*  ADC configured as follow:
  - NbrOfChannel = 1 - ADC_Channel_2
  - Mode = Single ConversionMode(ContinuousConvMode disabled)
  - Resolution = 12Bit
  - Prescaler = /1
  - sampling time 159 */
  
  ADC_VrefintCmd(ENABLE);                                                       //启用内部参考电压
   
  delay_10us(3);                                                                //延时

  ADC_DMACmd(ADC1,ENABLE);                                                      //启用ADC DMA请求
  
  /* Enable ADC1 */
  
  ADC_Cmd(ADC1, ENABLE);                                                 //启用ADC
  
  ADC_Init(ADC1, ADC_ConversionMode_Continuous,ADC_Resolution_12Bit, ADC_Prescaler_1);//初始化ADC1为,连续转换模式,12位AD转换,ADC时钟预分频为1

  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels,ADC_SamplingTime_9Cycles);//配置ADC为慢速通道,采样时间周期为9
  
  ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels,ADC_SamplingTime_9Cycles);//配置ADC为,快速通道,采样时间周期为9
  
  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);                            //内部参考电压
  
  ADC_ChannelCmd(ADC1, ADC_Channel_2, ENABLE);                                  //ADC通道2使能
  
//  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);               //重新映射DMA通道的具体外围(ADC或TIM4)

  DMA_Init(DMA1_Channel0,              //通道0
          (uint32_t)&ADC_ConvertedValue,//缓冲区地址
          (uint16_t)ADC1_DR_Address,    //ADC数据寄存器地址
          DMA_BUF_SIZE,                 //缓冲区大小
          DMA_DIR_PeripheralToMemory,   //外设到内存
          DMA_Mode_Circular,            //循环转换
          DMA_MemoryIncMode_Inc,        //内存地址自增
          DMA_Priority_High,            //优先级为高
          DMA_MemoryDataSize_HalfWord); //内存数据是半字位宽 16位
  
//  DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//
  
  /* Enable DMA1 channel1 */
  
  DMA_Cmd(DMA1_Channel1, ENABLE);                                               //启用DMA使能通道

  DMA_SetCurrDataCounter(DMA1_Channel0,DMA_BUF_SIZE);//
  
  DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, DISABLE);//是否开启DMA中断
   
//  DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);
   
  DMA_GlobalCmd(ENABLE);//启用或禁用全部DMA
  
  /* a short time of delay is required after enable ADC */
  
  delay_10us(3);                                                                //延时
  
  ADC_ITConfig(ADC1, ADC_IT_EOC,DISABLE);                                        //开启ADC中断
  
//  ADC_ClearFlag(ADC1, ADC_FLAG_EOC);                                            //清除EOC标志,即:清除转换完成标志
  
  ADC_SoftwareStartConv(ADC1);                                                  //开始ADC转换
  
}

这是读取通道转换后的值,代码如下
for(i=0;i<2;i++)
      
    {
      
      /* wait until end-of-covertion */
      
      while( ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0 );
      
      ADC_ConvertedValue=ADC_GetConversionValue(ADC1);                       //读取两个通道的转换结果
      
      SendByte(USART1,ADC_ConvertedValue>>8);
      
      SendByte(USART1,ADC_ConvertedValue);
      
    }

沙发
598330983| | 2015-7-24 12:21 | 只看该作者
多通道从来没有用过。

使用特权

评论回复
板凳
songchenping| | 2015-7-24 13:10 | 只看该作者
最头疼看代码了。你可以先将想法或者思路说一下,看是否合适。直接看代码。别人都不知道你怎么连线的。

使用特权

评论回复
地板
dipingzhu|  楼主 | 2015-7-24 13:35 | 只看该作者
代码已经标注的很清楚了

使用特权

评论回复
5
643757107| | 2015-7-24 15:10 | 只看该作者
void ADC_Icc_Init(void)                                                        //ADC初始化,ADC连续转换模式
这些函数都是楼主自己写的吗

使用特权

评论回复
6
dipingzhu|  楼主 | 2015-7-24 15:39 | 只看该作者
643757107 发表于 2015-7-24 15:10
void ADC_Icc_Init(void)                                                        //ADC初始化,ADC连续转 ...

对,这个函数是字节写的,里边是ADC转换时候的相关配置

使用特权

评论回复
7
dipingzhu|  楼主 | 2015-7-24 15:40 | 只看该作者
songchenping 发表于 2015-7-24 13:10
最头疼看代码了。你可以先将想法或者思路说一下,看是否合适。直接看代码。别人都不知道你怎么连线的。 ...

代码已经标注的很清楚了

使用特权

评论回复
8
songchenping| | 2015-7-24 15:52 | 只看该作者
个人建议先把单次采集调通了之后再把DMA加进去。

使用特权

评论回复
9
dipingzhu|  楼主 | 2015-7-24 15:53 | 只看该作者
songchenping 发表于 2015-7-24 15:52
个人建议先把单次采集调通了之后再把DMA加进去。

单次转化都没有问题,很正常,但是加入DMA之后就不正常了

使用特权

评论回复
10
dipingzhu|  楼主 | 2015-7-24 16:32 | 只看该作者
问题已解决,感谢各位亲们!问题是不需要再使用ADC_GetConversionValue(ADCx);直接用数组或变量转化即可。

使用特权

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

本版积分规则

6

主题

45

帖子

1

粉丝