OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7921|回复: 8

定时器1通道4 触发AD采集相关问题

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2015-7-14
在线时间
18 小时
发表于 2016-10-11 09:17:53 | 显示全部楼层 |阅读模式
5金钱
最近在做FOC电机驱动,基于ST电机库2.0。用定时器1 CH4 触发ADC(双ADC同步注入模式)采集。在ADC配置中可以配置ADC触发注入组采集时间为
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4); //TIM1 CH4触发

然而在配置TIM1作为输出源时候,函数TIM_SelectOutputTrigger(),并没有TIM1 CH4作为输出触发源的选项
/**
  * @brief  Selects the TIMx Trigger Output Mode.
  * @param  TIMx: where x can be 1 to 8 to select the TIM peripheral.
  * @param  TIM_TRGOSource: specifies the Trigger Output source.
  *   This paramter can be one of the following values:
  *
  *  - For all TIMx
  *     @arg TIM_TRGOSource_Reset:  The UG bit in the TIM_EGR register is used as the trigger output (TRGO).
  *     @arg TIM_TRGOSource_Enable: The Counter Enable CEN is used as the trigger output (TRGO).
  *     @arg TIM_TRGOSource_Update: The update event is selected as the trigger output (TRGO).
  *
  *  - For all TIMx except TIM6 and TIM7
  *     @arg TIM_TRGOSource_OC1: The trigger output sends a positive pulse when the CC1IF flag
  *                              is to be set, as soon as a capture or compare match occurs (TRGO).
  *     @arg TIM_TRGOSource_OC1Ref: OC1REF signal is used as the trigger output (TRGO).
  *     @arg TIM_TRGOSource_OC2Ref: OC2REF signal is used as the trigger output (TRGO).
  *     @arg TIM_TRGOSource_OC3Ref: OC3REF signal is used as the trigger output (TRGO).
  *     @arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO).
  *
  * @retval None
  */

void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)
{
  /* Check the parameters */
  assert_param(IS_TIM_ALL_PERIPH(TIMx));
  assert_param(IS_TIM_TRGO_SOURCE(TIM_TRGOSource));
  /* Reset the MMS Bits */
  TIMx->CR2 &= CR2_MMS_Mask;
  /* Select the TRGO source */
  TIMx->CR2 |=  TIM_TRGOSource;
}


查看手册说明确实是存在TIM1 CH4触发ADC采集这个功能,但是TIM1中并没有找到相关标志位。。。。

请问各位,这个怎么搞??

最佳答案

查看完整内容[请看2#楼]

路过,顺便回答一下,你说的其实是两码事。 启动前: 那个是在SVPWM_3ShuntInit里,这时还没有启动。这个配置是临时的。而且这个TIM_TRGOSource_Update只在UEV触发后才运行,不能比UEV提前运行。这时采样0电流补偿信号用的是SVPWM_3ShuntCurrentReadingCalibration(); 里面有个函数SVPWM_InjectedConvConfig,规定触发源是ADC_ExternalTrigInjecConv_T1_TRGO。 TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update)和电流采 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2016-9-8
在线时间
29 小时
发表于 2016-10-11 09:17:54 | 显示全部楼层
本帖最后由 weibo78 于 2016-10-23 13:30 编辑

路过,顺便回答一下,你说的其实是两码事。

启动前:
那个是在SVPWM_3ShuntInit里,这时还没有启动。这个配置是临时的。而且这个TIM_TRGOSource_Update只在UEV触发后才运行,不能比UEV提前运行。这时采样0电流补偿信号用的是SVPWM_3ShuntCurrentReadingCalibration(); 里面有个函数SVPWM_InjectedConvConfig,规定触发源是ADC_ExternalTrigInjecConv_T1_TRGO。
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update)和电流采样触发没有关系。

启动时及启动后:
在后来启动过程中,有一个函数是SVPWM_3ShuntAdvCurrentReading,其中就配置了TIM1_CC4为触发源。这个是提前UEV运行的,此时CCR4=CNT。代码和注释如下
void SVPWM_3ShuntAdvCurrentReading(FunctionalState cmd)
{
  if (cmd == ENABLE)
  {
    // Enable ADC trigger sync with CC4
    //等价于:ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4); 因为 ADC_ExternalTrigInjecConv_T1_CC4=((u32)0x00001000)
    ADC1->CR2 |= 0x00001000;  //001: Timer 1 CC4 event,注意在这里配置了触发源CC4, 因为只配置了bit12, 在当前配置下,CC4或(=111)JSWSTART都是可能的,取决于bit14,13,而此时bit14=bit13=0
   
    // Enable UPDATE ISR
    // Clear Update Flag
    TIM_ClearFlag(TIM1, TIM_FLAG_Update);
    TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
  }else
  {
    // Disable UPDATE ISR
    TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE);

    // Sync ADC trigger with Update
    //ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);
    ADC1->CR2 &=0xFFFFEFFF;
   
    // ReEnable EXT. ADC Triggering
    ADC1->CR2 |=0x00008000;   
  }
}
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2015-7-14
在线时间
18 小时
 楼主| 发表于 2016-10-11 17:10:08 | 显示全部楼层
自顶!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-10-12 21:42:04 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2015-7-14
在线时间
18 小时
 楼主| 发表于 2016-10-24 14:38:45 | 显示全部楼层
weibo78 发表于 2016-10-23 13:22
路过,顺便回答一下,你说的其实是两码事。

启动前:

这样说的话,只要配置ADC触发源为TIM1 CH4,就可以触发ADC采集,与TIM_SelectOutputTrigger()配置无关?
回复

使用道具 举报

42

主题

141

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
342
金钱
342
注册时间
2015-5-26
在线时间
49 小时
发表于 2017-3-30 21:04:57 | 显示全部楼层
weibo78 发表于 2016-10-23 13:22
路过,顺便回答一下,你说的其实是两码事。

启动前:

我也简单说两句,忘前辈看到的时候回复一下。foc2.0的svpwm那里,正如您所说,在foc运行之前都是临时配置,您看一下程序,那里有个这样的配置,
ADC_InjectedSequencerLengthConfig(ADC1,2);
  ADC_InjectedSequencerLengthConfig(ADC2,2);
  
  ADC_InjectedChannelConfig(ADC1, PHASE_B_ADC_CHANNEL, 1,
                                                      SAMPLING_TIME_CK);
  ADC_InjectedChannelConfig(ADC1, BUS_VOLT_FDBK_CHANNEL,
                                                   2, SAMPLING_TIME_CK);
这个时候还状态标识还没有run,所以这个时候是靠定时器的UPDATE中断去执行AD采样的,既然电机没有RUN,这个时候的采样有何意义?
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2016-9-8
在线时间
29 小时
发表于 2017-6-11 17:56:06 | 显示全部楼层
林春霞 发表于 2017-3-30 21:04
我也简单说两句,忘前辈看到的时候回复一下。foc2.0的svpwm那里,正如您所说,在foc运行之前都是临时配置 ...

问得好。
注意看SVPWM_3ShuntAdvCurrentReading(FunctionalState cmd)这个函数,里面有一句:
if (cmd == ENABLE)
{…}
Else
{…}
也就是说,如果你调用SVPWM_3ShuntAdvCurrentReading时,使用的参数不是ENABLE,那么这个时候是使用默认的TIM1->TRGO, 也就是UEV触发采样。即:要不要在UEV提前采样,是可以配置的,默认是在运行时才配置ENABLE的用TIM1->CCR4触发。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-7-6
在线时间
2 小时
发表于 2017-7-6 15:11:12 | 显示全部楼层
我也在用他做FOC,用TM1输出6路带死区的PWM,TM1触发AD采集设置一直有问题,请问怎么设置
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-11-27
在线时间
10 小时
发表于 2021-12-1 13:20:22 | 显示全部楼层
@arg TIM_TRGOSource_OC4Ref: OC4REF signal is used as the trigger output (TRGO)
这个就是啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 16:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表