目录
前言
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显示波形,方便调试使用。可根据实际情况进行合理选择。