L99H92直流电机驱动评估板配套的驱动板为:NUCLEO-G474RE,主控为STM32G474是一款高性能、低功耗的32位微控制器,集成了浮点运算单元(FPU)、数字信号处理(DSP)指令和内存保护单元(MPU)。STM32G474微控制器凭借其强大的性能、丰富的功能和灵活的配置选项,在电机控制、电源管理、工业传感器和消费类电子产品等领域有着广泛的应用前景。
一、核心性能
- CPU架构:基于Arm Cortex-M4 32位RISC内核,集成了浮点运算单元(FPU)、数字信号处理(DSP)指令和内存保护单元(MPU),提供强大的数据处理能力。
- 工作频率:最高可达170MHz,执行性能优异,DMIPS(Dhrystone MIPS)为213。
二、存储器配置
- Flash存储器:提供多种容量的Flash存储器选项,如512KB或1MB,支持ECC(错误检测和纠正),具有读保护、写保护、安全存储区域和专有代码禁止读取保护(PCROP)等特性。
- SRAM:内置128KB SRAM,部分型号可能提供不同容量的SRAM,如256KB。此外,还有指令和数据总线上的高速SRAM(CCM SRAM)用于执行加速。
三、外设和接口
- 高精度定时器:集成高分辨率和复杂波形生成器(HRTIM),具有184ps的分辨率,适用于精确的时间控制和波形生成。
- 模拟外设:多达5个12位ADC(模数转换器),转换速率可达4MSPS,支持硬件过采样和高达16位的分辨率。同时,还有7个12位DAC(数模转换器)通道,提供灵活的模拟信号输出。
- 通信接口:包括多个USART/UART、I2C、SPI等通信接口,支持灵活的数据速率和多种通信协议。此外,还集成有 FDCAN 控制器、SAI(串行音频接口)、USB 2.0 全速接口等高级通信接口。
四、节能和电源管理
- 低功耗模式:支持睡眠、停止、待机和关闭等多种低功耗模式,有助于延长设备的电池寿命。
- 电源管理:提供上电/下电复位(POR/PDR/BOR)、可编程电压检测器(PVD)等电源管理功能,确保设备的稳定运行。
五、安全特性
- 硬件加密:集成真随机数生成器(RNG)和CRC计算单元,提供硬件级别的加密和校验功能。
- 存储保护:通过内存保护单元(MPU)和专有代码禁止读取保护(PCROP)等特性,保护代码和数据的安全。
六、开发和调试支持
- 开发环境:支持STM32CubeMX工具进行图形化配置和代码生成,简化开发过程。
- 调试接口:提供串行线调试(SWD)和JTAG调试接口,方便进行代码调试和性能分析。
STM32CubeMX 配置 TIM1产生1Khz,占空比为50%的方波,输出引脚PC0
核心代码:
TIM_HandleTypeDef htim1;
/* TIM1 init function */
void MX_TIM1_Init(void)
{
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 169;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 499;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT;
sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
sBreakDeadTimeConfig.Break2Filter = 0;
sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&htim1);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspInit 0 */
/* USER CODE END TIM1_MspInit 0 */
/* TIM1 clock enable */
__HAL_RCC_TIM1_CLK_ENABLE();
/* USER CODE BEGIN TIM1_MspInit 1 */
/* USER CODE END TIM1_MspInit 1 */
}
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(timHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspPostInit 0 */
/* USER CODE END TIM1_MspPostInit 0 */
__HAL_RCC_GPIOC_CLK_ENABLE();
/**TIM1 GPIO Configuration
PC0 ------> TIM1_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* USER CODE BEGIN TIM1_MspPostInit 1 */
/* USER CODE END TIM1_MspPostInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspDeInit 0 */
/* USER CODE END TIM1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM1_CLK_DISABLE();
/* USER CODE BEGIN TIM1_MspDeInit 1 */
/* USER CODE END TIM1_MspDeInit 1 */
}
}
现象