STM32
直播中

golabs

8年用户 903经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表
私信 关注
[问答]

STM8L151 ADC采用DMA多通道连续采集遇到通道数据滚动怎么解决?

STM8L151 ADC 采用DMA  8通道连续采集,通过ST_LINK仿真发现:通道数据滚动问题,比如第一通道的数据本应该在数组0通道,一会儿整组偏移到数组3通道,一会又偏移到4通道,而且是所有数据同时偏移。网上搜了一下,有很多人遇到过,但是都不说解决方法。折腾了一天无解,只能在这里求救了。ADC初始化程序如下:
void ADC_DMA_Config(void)                                                         //ADC初始化,ADC连续转换模式
{

        // Enable ADC clock  
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);                       //开启ADC时钟
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);                       //DMA时钟

  DMA_DeInit(DMA1_Channel0);                                                    //初始化DMA为默认值
  ADC_DeInit(ADC1);                                                             //初始化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_192Cycles);//配置ADC为慢速通道,采样时间周期为192
  //ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels,ADC_SamplingTime_24Cycles);//配置ADC为,快速通道,采样时间周期为9

  ADC_Cmd(ADC1, ENABLE);                                                         //启用ADC

  //ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);                            //内部参考电压

  ADC_ChannelCmd(ADC1, ADC_Channel_15, ENABLE);                                  //ADC通道15使能  Vbat 总电池电压
  ADC_ChannelCmd(ADC1, ADC_Channel_16, ENABLE);                                  //ADC通道16使能  TS5  MOS温度检测
  ADC_ChannelCmd(ADC1, ADC_Channel_17, ENABLE);                                  //ADC通道17使能  TS4  电池温度检测4
  ADC_ChannelCmd(ADC1, ADC_Channel_18, ENABLE);                                  //ADC通道18使能  TS3  电池温度检测3
  ADC_ChannelCmd(ADC1, ADC_Channel_19, ENABLE);                                  //ADC通道19使能  TS2  电池温度检测2
  ADC_ChannelCmd(ADC1, ADC_Channel_20, ENABLE);                                  //ADC通道20使能  TS1  电池温度检测1
  ADC_ChannelCmd(ADC1, ADC_Channel_21, ENABLE);                                  //ADC通道21使能  Ic   充电电流检测
  ADC_ChannelCmd(ADC1, ADC_Channel_22, ENABLE);                                  //ADC通道22使能  Id   放电电流检测

  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);               //重新映射DMA通道的具体外围(ADC或TIM4)

  DMA_Init(DMA1_Channel0,                                                      //通道0
          (uint32_t) ADC_Value,                                                //缓冲区地址
          (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 channel0  
  DMA_Cmd(DMA1_Channel0, ENABLE);                                               //启用DMA使能通道0

  DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, ENABLE);//使能传输完成中断
  //DMA_ITConfig(DMA1_Channel0,DMA_ITx_TC, DISABLE);                              //是否开启DMA中断   
//  DMA_ITConfig(DMA1_Channel0,DMA_ITx_HT, DISABLE);

  DMA_GlobalCmd(ENABLE);                                                        //启用或禁用全部DMA

  ADC_DMACmd(ADC1,ENABLE);                                                      //启用ADC 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转换
}





回帖(1)

王军

2024-4-30 14:31:35
你用多通道连续扫描方案,建议所有通道采样速度相同。 
举报

更多回帖

发帖
×
20
完善资料,
赚取积分