请教,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个
复制代码

请问是不是外部触发的程序有所遗漏导致数据不正常?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
W872529868
1楼-- · 2019-12-18 15:17
负西弱 发表于 2018-10-6 22:50
比较的时候是上升沿的时候才能触发ADC~~这个上升沿是什么的上升沿?

PWM输出的上升沿,但具体在哪里触发需要写程序实测,一开始我想当然地以为产生比较后就可以触发ADC,但结果不是。
1a2b3c
2楼-- · 2019-12-18 16:54
 精彩回答 2  元偷偷看……
W872529868
3楼-- · 2019-12-18 20:03
1a2b3c 发表于 2018-10-7 13:27
相当于你之前的情况本来该下降沿触发,结果因为你说的那个原因,所退后了一阵子,因为是上升沿? ...

可以这样理解。原本触发ADC的PWM程序里面是设置成PWM模式1的,但是实测结果只能用PWM模式2。
1a2b3c
4楼-- · 2019-12-18 23:51
W872529868 发表于 2018-10-7 15:03
可以这样理解。原本触发ADC的PWM程序里面是设置成PWM模式1的,但是实测结果只能用PWM模式2。 ...

那么间接的原因是因为ADC切换、建立稳定采样电压需要时间?所以上升沿的话白白消耗了中间低电平的时间,本来这个时间正好用于ADC建立?
mmswza
5楼-- · 2019-12-19 05:05
支持下楼主,自己解决了贴出来分享。
rifjft
6楼-- · 2019-12-19 09:09
这个应该是最基础的,ST官方竟然没有详细资料介绍?不会这么坑吧

一周热门 更多>