问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

FOC控制中使用定时器触发ADC采样的一些问题及解决方案

创作时间:
作者:
@小白创作中心

FOC控制中使用定时器触发ADC采样的一些问题及解决方案

引用
CSDN
1.
https://m.blog.csdn.net/qq_44348981/article/details/139172395

在FOC(磁场定向控制)控制中,精确的电流采样是至关重要的。本文详细描述了在STM32平台上使用定时器触发ADC采样的具体实现方法,包括定时器配置、ADC设置以及遇到的问题和解决方案。对于从事电机控制和嵌入式开发的工程师具有较高的参考价值。

背景

在FOC控制中,电流采样需要使用STM32的ADC。采用低侧电流采样时,需要在半桥的上桥臂关闭、下桥臂打开时进行电流采样。之前使用的方法是在定时器更新中断中判断计数器计数方向来软件触发AD采样,但这种方法的数据采集实时性可能不够理想。最近参考了一些论坛帖子,尝试使用定时器的通道四输出(TRGO)触发ADC采样,遇到了一些问题。以下记录了解决过程,仅供参考。

问题描述

参考了一些帖子和视频的设置,具体配置如下:

  • Prescaler(预分配系数):为了不损失定时器的分辨率,一般都设为0,但在实验中调大一些,方便逻辑分析仪捕捉。
  • Counter Mode(计数模式):这里一定要选择中心对齐模式,具体是123无所谓,只会影响到捕获比较中断。
  • Counter Period(装载值):根据具体需求设置。

其中:

  • 通道1、2、3设置为PWM模式1,即CNT大于CCR时为低电平,反之高电平。通过逻辑分析仪可以知道高电平的中点为计数值0处。
  • 通道4设置为PWM模式2,即CNT大于CCR时为高电平,反之低电平,用于触发ADC采样。

设置Trigger Out Event为OC4REF,理论上应该在通道1、2、3的两个高电平中间进行采样。但是实际情况并非如此。

ADC的设置如下:

  • 使用ADC1和ADC2分别采集两相电流,配置为注入组,触发源为Timer 1 Trigger Out Event。
  • 由于规则组有几项,包括母线电压和温度传感器,担心数据错位所以没有开启连续采样。

在main函数中进行如下初始化:

MX_GPIO_Init();
MX_ADC1_Init();
MX_ADC2_Init();
MX_TIM1_Init();

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的状态,方便逻辑分析仪采集。然而,并没有像预想的那样进入回调函数。

原因分析

调试时发现,将断点打在回调函数处,第一次执行时可以进入,将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触发注入组转换会出现在下图红色箭头处,也就是接近在计数器的上溢点,就能做到连续转换了。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号