请教,STM32定时器触发ADC转换,转换结果不正常。

2019-12-17 21:31发布

程序思路:使用TIM1的CC3事件触发ADC1连续采样5个并用DMA把数据存起来。

具体程序:
省略定时器程序
  1.         ADC_DeInit(ADC1);  //复位ADC1,将外设的全部寄存器重设为缺省值

  2.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //独立模式
  3.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //模数转换工作在通道扫描模式
  4.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //单次转换模式
  5.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;        //选择定时器 1 的 CC1触发事件
  6. //        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                //软件触发
  7.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  8.         ADC_InitStructure.ADC_NbrOfChannel = 5;        //顺序进行规则转换的ADC通道的数目//转换5个
  9.         ADC_Init(ADC1, &ADC_InitStructure);        //初始化ADC1

  10. /*************************************转换5个电流************************************************/
  11.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5);        //电流
  12.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_1Cycles5);        //电流
  13.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 3, ADC_SampleTime_1Cycles5);        //电流
  14.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 4, ADC_SampleTime_1Cycles5);        //电流
  15.         ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 5, ADC_SampleTime_1Cycles5);        //电流
  16.        
  17.        
  18.         ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能ADC1外部触发转换
  19.        
  20.         ADC_DMACmd(ADC1,ENABLE);//使能ADC1 DMA       
  21.        
  22.         ADC_Cmd(ADC1, ENABLE);        //使能ADC1

  23. /*************************校准ADC1****************************************/
  24.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  25.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  26.         ADC_StartCalibration(ADC1);         //开启AD校准
  27.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束       
复制代码


问题:
上面的程序转换出来的5个结果中疑似第一个是正确的其他都是错误的
但是如果改为使用软件触发转换结果是正确的(相同的采样频率,在定时器的更新中断里延时一段时间开启ADC转换,模拟定时器的CCR3事件)

软件触发和定时器触发程序的不同点在于
  1. //        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC3;        //选择定时器 1 的 CC1触发事件
  2.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;                //软件触发
  3. //        ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能ADC1外部触发转换
复制代码

另外:
如果使用定时器触发ADC转换一个那么数据是正确的
  1. ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目//转换1个
复制代码

请问是不是外部触发的程序有所遗漏导致数据不正常?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。