FOC控制中使用定时器触发ADC采样的一些问题

背景:

FOC控制中电流采样需要用到STM32的ADC,使用低侧电流采样需要在半桥的上桥臂关闭下桥臂打开时进行电流采样,之前使用的方法是在定时器更新中断中判断计数器计数方向来软件触发ad采样,数据采集的实时性可能不太行。这几天参考了论坛里的不少帖子,尝试使用定时器的通道四输出的TRGO触发ADC采样,碰到了一些问题。解决方式是自己瞎摸索的,不一定正确,仅供参考。


问题描述

参考一些帖子和视频的设置,设置如下文字和图片描述
Presclar :预分配系数,为了不损失定时器的分辨率,一般都设为0,但是做实验就调大些,方便逻辑分析仪捕捉。
Counter Mode :这里一定要选择中心对齐模式,至于是123无所谓,只会影响到捕获比较中断。
Counter Period :装载值。

在这里插入图片描述
其中通道1,2,3为PWM模式1,即CNT大于CCR时为低电平,反之高电平,通过逻辑分析仪就能知道高电平的中点为计数值0处。

通道4设置为PWM模式2,即CNT大于CCR时为高电平,反之低电平,用于触发ADC采样。

设置Trigger Out EventOC4REF,如果一切顺利会在通道1,2,3的两个高电平中间进行采样。但是不出意外应该是出意外了,不然就不会有这篇笔记了QAQ。
在这里插入图片描述
ADC的设置如下

分别使用ADC1和ADC2采集两相电流,配置为注入组,触发源为Timer 1 Trigger Out Event.因为规则组有几项,包括母线电压和温度传感器,担心数据错位所以没有开启连续采样(划重点。
在这里插入图片描述
参照帖子foc配置篇——ADC注入组使用定时器触发采样的配置,在main函数之前,清除ADC的一些标志位,开启时基,开启注入组采样,使能注入组转换完成中断,开启PWM通道。

  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_ADCEx_InjectedStart_IT(&hadc1);
  __HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);
  HAL_TIM_Base_Start_IT(&htim1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
  __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);

在注入组转换完成回调函数里翻转GPIO的状态,方便逻辑分析仪采集。
在这里插入图片描述
然而,并没有像预想的那样进入回调函数(理论上应该在红色箭头处出现IO的翻转)。


原因分析:

调试时发现,将断点打在回调函数处,第一次执行时可以进入,将ADC输入接到3.3v数据为4090,一切正常,但是之后就卡死了,思考会不会是因为函数HAL_ADCEx_InjectedStart_IT(&hadc1)只是开启了一次ADC注入组转换就停止了。但是由于规则组有母线电压和温度传感器,担心数据错位不能开启连续采样,规则组只能使用扫描+DMA传输的方式。


解决方案:

在定时器的更新中断里调用HAL_ADCEx_InjectedStart_IT(&hadc1),在下一次的采样时刻之前再次打开注入组转换
在这里插入图片描述
使用逻辑分析仪测量波形,发现回调函数的GPIO翻转出现了,如下图,由于设置了RCR的值为1,也就是在蓝色箭头处发生定时器的更新事件,也就是上图的回调函数部分,在蓝色箭头处打开注入组转换,由于设置了TIM1->CCR4 = 980,而ARR = 1000,因此OC4REF触发注入组转换会出现在下图红色箭头处,也就是接近在计数器的上溢点,就能做到连续转换了。
在这里插入图片描述

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值