电机FOC控制(三)STM32 CUBEMX 配置ADC采样

这篇具有很好参考价值的文章主要介绍了电机FOC控制(三)STM32 CUBEMX 配置ADC采样。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



前言

本文在电机FOC控制(二)STM32 CUBEMX 配置三相PWM互补输出基础上,继续讲述如何STM32 CUBEMX 配置ADC寄存器,使TIMER1 PWM互补输出CC4触发ADC注入采样的过程。


一、设置STM32G431 ADC时钟树

打开Clock Configuration界面,将ADC设置为42.5MHz。

foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机

二、设置STM32G431 ADC1和ADC2采样通道。

设定ADC1通道7和通道8为单端输入:
foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
设定ADC2通道6和通道7为单端输入:
foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机

三、设置STM32G431 ADC采样基本属性:规则采样与注入采样。

foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
ADCs_Commmon_Setting
Mode:选择独立模式,本工程只需要单个ADC采样,不需要多个ADC联合使用。
ADC_Setting:
Clock Prescaler:是ADC工作频率,选择Asynchronous clock mode divided by 1(1分频)。
Resolution :ADC分辨率,配置为12位分辨率。
Data Alignment:数据对齐方式,配置为左对齐。
Gain Compensation:由于STMG431内置放大器,由于没有使用,配置放大器增益为0,不需要放大器增益补偿。
Scan Conversion Mode:规则采样使用连续扫描转换。配置为ENABLE。
End Of Conversion Selection:结束转换选择,配置为End Of Single Conversion。
Low Power Auto Wait:低功耗自动等待,配置为Disable。
Continuous Conversion Mode:连续转换模式,不使能相当于单次转换模式,使能的话,相当于连续转换模式,配置为Disable。
Discontinuous Conversion Mode:规则组转换序列的不连续方式,启动转换,转换结束后,等待启动信号,配置为Disabled。
*** Continuous Conversion Mode与Discontinuous Conversion Mode不能同时使能,两者不能共存。
DMA Continuous Requests:DMA连续请求模式,采集完数据后,是否自动关闭ADC1和DMA。配置为Disabled。
Overrun behaviour:如果数据没有读取,新的ADC转换结果是否覆盖原来的结果,配置为Overrun data preserved 保留原来的数据。

ADC规则采样设定:
foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
ADC Regular ConversionMode:
Enable Regular Conversion:启用常规转换模式,配置为Enable。
Enable Regular Oversampling:是否使用过采样模式 ,配置为:Diasble。
Number Of Conversion:此为规则组通道数量,配置为2个。
External Trigger Conversion Source:规则组通道采样的触发源,配置为软件触发。
External Trigger Conversion Edge:规则组通道采样的触发源的触发方式,由于采用软件触发,配置为:None。
Rank 1 :配置规则组通道的采样顺序和各通道的采样时间。
Channel:选择Channel 2做为第一通道。
Sample Time:配置为47.5周期。
Offset Number:配置为No offset。不设定偏置。
Rank 2 :配置规则组通道的采样顺序和各通道的采样时间。
Channel:选择Channel 8做为第一通道。
Sample Time:配置为47.5周期。
Offset Number:配置为No offset。不设定偏置。

ADC注入采样设定
foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
ADC Injected ConversionMode

Enable Injected Conversions:是否使能注入转换。注入通道只有在规则通道存在时才会出现。
Number Of Conversion:ADC转换的注入通道数,配置为2
External Trigger Source:配置为Timer1触发事件
External Trigger Conversion Edge:配置为上升沿触发。
Enable Injected Oversampling:配置为关闭状态。
Injected Conversion Mode:配置为无。
Injected Queue:配置为关闭状态。
Rank 1:通道1。
Channel : 设定为Channel 1,配置成1通道。
Sampling Time:设定采样周期为6.5个周期。
Offset Number:设定为没有偏置。
Rank 2:通道2。
Channel : 设定为Channel 7,配置成7通道。
Sampling Time:设定采样周期为6.5个周期。
Offset Number:设定为没有偏置。

ADC2设定:
foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
Rank 1:通道1。
Channel : 设定为Channel 1,配置成1通道。
Sampling Time:设定采样周期为6.5个周期。
Rank 2:通道2。
Channel : 设定为Channel 7,配置成7通道。
Sampling Time:设定采样周期为6.5个周期。

四、设置STM32G431 ADC中断源。

允许ADC1和ADC2全局中断,设定ADC1和ADC2中断优先级。

foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机

foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
到此ADC基本配置完毕。

五、代码修改。

使用STM32 LL库

在main.c文件修改:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  
  /* Initialize interrupts */
  MX_NVIC_Init();
  
  /* USER CODE BEGIN 2 */
  LL_TIM_EnableIT_CC4(TIM1);
  LL_TIM_EnableCounter(TIM1);
  
  /* Enable PWM channel */
  LL_TIM_CC_EnableChannel(TIM1, TIMxCCER_MASK_CH123);
//	LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_OC4REF);
  LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH4);
  /* Main PWM Output Enable */
  TIM1->BDTR |= LL_TIM_OSSI_ENABLE;
  LL_TIM_EnableAllOutputs(TIM1);

  /* - Exit from deep-power-down mode */
  LL_ADC_DisableDeepPowerDown(ADC1);
  /* Enable ADC internal voltage regulator */
  LL_ADC_EnableInternalRegulator(ADC1);
  
  LL_ADC_ClearFlag_JEOC(ADC1);
  LL_ADC_EnableIT_JEOC(ADC1);

  LL_ADC_StartCalibration(ADC1, LL_ADC_SINGLE_ENDED);
	
  while (1U == LL_ADC_IsCalibrationOnGoing(ADC1))
  {
    /* Nothing to do */
  }
	
  LL_ADC_Enable(ADC1);
	
  /* Clear JSQR from CubeMX setting to avoid not wanting conversion*/
  LL_ADC_INJ_StartConversion(ADC1);
  /* TODO: check if not already done by MX */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    LED_RUN();
  }
  /* USER CODE END 3 */
}

在stm32g4xx_it.c文件修改:
使用GPIOB的PIN12引脚做为波形输出引脚。

void ADC1_2_IRQHandler(void)
{
  /* USER CODE BEGIN ADC1_2_IRQn 0 */
  //触发后为低电平
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_RESET );
	
//	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
	
//	ADC_Value = HAL_ADC_GetValue(&hadc1);   //获取AD值
  /* USER CODE END ADC1_2_IRQn 0 */
  HAL_ADC_IRQHandler(&hadc1);
  HAL_ADC_IRQHandler(&hadc2);
  /* USER CODE BEGIN ADC1_2_IRQn 1 */

  /* USER CODE END ADC1_2_IRQn 1 */
}

修改HAL_TIM_IRQHandler函数,使CC4触发时,GPIOB的PIN12为高电平。

void TIM1_CC_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_CC_IRQn 0 */

  /* USER CODE END TIM1_CC_IRQn 0 */
  HAL_TIM_IRQHandler(&htim1);
  /* USER CODE BEGIN TIM1_CC_IRQn 1 */

  /* USER CODE END TIM1_CC_IRQn 1 */
}
/* Capture compare 4 event */
  if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET)
  {
    if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) != RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4);
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
      /* Input capture event */
      if ((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U)
      {
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
        htim->IC_CaptureCallback(htim);
#else
        HAL_TIM_IC_CaptureCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
      }
      /* Output compare event */
      else
      {
	  //使GPIOB PIN12高电平
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12,GPIO_PIN_SET );
				//HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
        htim->OC_DelayElapsedCallback(htim);
        htim->PWM_PulseFinishedCallback(htim);
#else
        HAL_TIM_OC_DelayElapsedCallback(htim);
        HAL_TIM_PWM_PulseFinishedCallback(htim);
#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */
      }
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
    }
  }

六、示波器查看波形。

foc控制配置分频和adc采样时刻,电机FOC控制,stm32,嵌入式硬件,单片机
可以看到CC4触发ADC采样开始至ADC采样结束的波形。

总结

通过以上实验,成功使STM32G431通过高级定时器TIMER1的CC4触发了ADC注入采样,并捕获了CC4触发ADC采样开始至ADC采样结束的波形。文章来源地址https://www.toymoban.com/news/detail-855961.html

到了这里,关于电机FOC控制(三)STM32 CUBEMX 配置ADC采样的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • foc配置篇——ADC注入组使用定时器触发采样的配置

    foc驱动板都会用到电流采样,本篇就针对三电阻低测采样来讲一讲如何配置ADC。 在此之前,或许大家使用ADC都是建立一个大数组,然后DMA无脑开着将数据搬到数组里,等到要用到时候就取出来做一个均值滤波。 ​ 这种方法用在foc电流采样上行不行呢?答案是看情况,如果你

    2024年02月01日
    浏览(18)
  • stm32 FOC 电机介绍

    今年开始学习foc控制无刷电机,这几天把所学整理一下,记录一下知识内容。 前言: 为什么要学习FOC? 1.电机控制是自动化控制领域重要一环。 2.目前直流无刷电机应用越来越广泛,如无人机、机械臂、云台、仿生机器人等等。 需要什么基础? 1.C语言,指针,结构体,编程规

    2024年01月21日
    浏览(24)
  • [FOC-Simulink]使用Simulink代码生成工具基于STM32开发板对永磁同步电机进行开环控制

    代码链接:【免费】使用Simulink代码生成工具对永磁同步电机进行开环控制资源-CSDN文库 本文介绍使用Simulink代码生成功能在STM32开发板平台上运行永磁同步电机。 硬件基础: Nucleo-G431RB开发板 X-NUCLEO-IHM07M1驱动扩展板 57BLDC-24V-210W时代超群直流电机 软件基础: MATLAB 2022b 安装

    2024年02月13日
    浏览(22)
  • STM32 FOC电机PID学习笔记

    在系统上存在外部干扰的情况下反馈是最好的选择否则使用前馈网络。为扭矩、通量和速度实施的调节器实际上是比例(P Proportional )、积分(I Integral)、微分 (D Derivative ) 调节器。 STM32中实际提供了3种,但是实际上我们常用的电机反馈调节使用的是PI反馈控制就够了。 PID的

    2024年02月06日
    浏览(18)
  • STM32CubeMX配置ADC采样(轮询、中断、DMA)

    STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习 先选择所使用的MCU,这里我使用的是STM32F407ZGT系

    2024年02月03日
    浏览(20)
  • STM32实现FOC直流无刷BLDC电机-外围电路

    永磁同步电机和无刷直流电机(BLCD)具有更高效、运行更安静、扭矩波动小、响应速度快、更可靠等优点,正用于越来越多的应用,替代直流有刷电机。尽管结构不同,但所有三相永磁电机(BLDC、PMSM或PMAC)都是由脉冲宽度调制(PWM)的三相桥(三个半桥)驱动,以便采用频

    2024年01月16日
    浏览(26)
  • STM32G4 Simulink FOC开发实战--第八章:MCU内部OPAMP-电流采样

    https://www.bilibili.com/video/BV1nh4y1v72T/?spm_id_from=333.999.0.0 增益具体计算方法请参考附录一:带偏置的差分运放参数设计 R58,R59作用是为了输入的正向端和负向端输入阻抗匹配; R52,R53为分压电阻,作用是将输入正向端电压正向偏置1.65V; R56与R59形成负反馈增益,运放整体增益计算

    2024年04月23日
    浏览(20)
  • 【STM32】定时器1触发ADC多(规则)通道采样+DMA(CUBEMX配置)

    在用单片机做电源控制时不得不提ADC采集,离散系统是有固定的执行周期的,所以我们采样也是要固定时间去采样。然后就是我希望pwm波(定时器1产出)的频率与采样频率一致。 我下面演示的是G431CBU6,当然其他芯片也大差不差了。 说一下大致流程,TIM1触发ADC采样,然后

    2024年02月01日
    浏览(24)
  • 野火STM32电机系列(六)Cubemx配置ADC规则和注入通道

    前文已经配置了GPIO、编码器 本节讲解CubeMXADC规则和注入通道 本文adc注入通道采用定时器触发,因此在上文定时器配置的基础上进行 常规信号(温度等)使用带DMA的常规通道连续采样 注入采样由定时器触发,采集电机三相电流,并进入adc中断执行10khz的控制程序 ADC硬件接口

    2024年02月08日
    浏览(20)
  • STM32G4 Simulink FOC开发实战--第四章:ST MCSDK快速启动电机

    HALL有感启动电机基于STMCSDK: https://www.bilibili.com/video/BV1W14y1k7Ct/?spm_id_from=333.999.0.0vd_source=eb375996b1aae493d63fe367f98b306c 无感启动电机基于STMCSDK: https://www.bilibili.com/video/BV1QG41197AH/?spm_id_from=333.999.0.0vd_source=eb375996b1aae493d63fe367f98b306c 电位器控制电机转速基于STMCSDK: https://www.bilibili

    2024年02月22日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包