Simulink 自动代码生成电机控制:开发板DAC接口辅助调试的方法

目录

前言

DAC基本原理

PWM模拟DAC

DAC底层代码配置

DAC调试演示

总结


前言

DAC是比较常用的数字转模拟单元,通过给定数字量,输出一个模拟信号,有比较广泛的用途,在这里只讨论DAC作为一个调式手段帮助打印出电机控制里面的一些变量,方便调试使用,针对电机电机控制开发板做一些总结

DAC基本原理

在有DAC模块的MCU会有一个DAC的框图,如下是12位的一个DAC,只需要改变寄存器的值就可以改变DAC的输出电压,比较方便。

 但是开发板的主芯片STM32F401不支持内部的DAC模块,除此之外,很多低成本的MCU也不支持DAC,并且有些芯片UART不支持高波特率和DMA发送。不能通过串口看到更详细的波型特征,这时候用PWM来模拟DAC输出系统的一些波形信息就很有必要了。

PWM模拟DAC

这里使用了TIM3的两个通道作为PWM模拟DAC的通道

硬件接口电路如下, 采用两级的RC滤波器,通过改变PWM的占空比就可以改变输出的模拟电压大小。滤波系数根据输出模拟信号的纹波进行调整即可。分辨率(PWM周期)需要和滤波系数匹配,如分辨率太高,PWM周期小,纹波可就会变大。适当调整参数就可以。

DAC底层代码配置

通过CubeMX配置,周期2100表示频率20K,可显示的变量为0-2100

static void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
  htim3.Init.Period = 2100;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0x200;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */

  /* USER CODE END TIM3_Init 2 */
  HAL_TIM_MspPostInit(&htim3);

}

 周期为2100,因此可以显示的数据范围是0-2100,根据变量的最大值进行合理的放大或者缩小,就可以用示波器显示变量曲线了。如下,电机控制的PWM是0-4200,为了能正常显示整个波形将其除以2。角度是0-2*pi, 这里为了能正常显示乘上334保证其值在0-2100范围内。

	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,(uint16_t)(rtY.Ta)>>1);
	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,(uint16_t)(Hall_Angle*334));

DAC调试演示

20Khz(0-2100) 默认电路参数

可以正常显示角度波形和SVPWM的马鞍波形

10Khz (0-4200)默认电路参数

周期变大后可以表示变量的范围变大,但是默认的滤波电路参数下波形纹波变大了

总结

开发板的串口支持较高的波特率,可以通过上传变量满足调试需求,同时也通过PWM模拟DAC的方式实现了DAC显示波形,方便调试使用。可根据实际情况进行合理选择。

猜你喜欢

转载自blog.csdn.net/weixin_42665184/article/details/130539052