suntongxue 发表于 2024-12-4 22:15

【L99H92直流电机驱动评估板】STM32G474 PWM生成

<div class='showpostmsg'><p >&nbsp; L99H92直流电机驱动评估板配套的驱动板为:NUCLEO-G474RE,主控为STM32G474是一款高性能、低功耗的32位微控制器,集成了浮点运算单元(FPU)、数字信号处理(DSP)指令和内存保护单元(MPU)。STM32G474微控制器凭借其强大的性能、丰富的功能和灵活的配置选项,在电机控制、电源管理、工业传感器和消费类电子产品等领域有着广泛的应用前景。</p>

<h3>一、核心性能</h3>

<ul>
        <li><strong>CPU架构</strong>:基于Arm Cortex-M4 32位RISC内核,集成了浮点运算单元(FPU)、数字信号处理(DSP)指令和内存保护单元(MPU),提供强大的数据处理能力。</li>
        <li><strong>工作频率</strong>:最高可达170MHz,执行性能优异,DMIPS(Dhrystone MIPS)为213。</li>
</ul>

<h3>二、存储器配置</h3>

<ul>
        <li><strong>Flash存储器</strong>:提供多种容量的Flash存储器选项,如512KB或1MB,支持ECC(错误检测和纠正),具有读保护、写保护、安全存储区域和专有代码禁止读取保护(PCROP)等特性。</li>
        <li><strong>SRAM</strong>:内置128KB SRAM,部分型号可能提供不同容量的SRAM,如256KB。此外,还有指令和数据总线上的高速SRAM(CCM SRAM)用于执行加速。</li>
</ul>

<h3>三、外设和接口</h3>

<ul>
        <li><strong>高精度定时器</strong>:集成高分辨率和复杂波形生成器(HRTIM),具有184ps的分辨率,适用于精确的时间控制和波形生成。</li>
        <li><strong>模拟外设</strong>:多达5个12位ADC(模数转换器),转换速率可达4MSPS,支持硬件过采样和高达16位的分辨率。同时,还有7个12位DAC(数模转换器)通道,提供灵活的模拟信号输出。</li>
        <li><strong>通信接口</strong>:包括多个USART/UART、I2C、SPI等通信接口,支持灵活的数据速率和多种通信协议。此外,还集成有 FDCAN 控制器、SAI(串行音频接口)、USB 2.0 全速接口等高级通信接口。</li>
</ul>

<h3>四、节能和电源管理</h3>

<ul>
        <li><strong>低功耗模式</strong>:支持睡眠、停止、待机和关闭等多种低功耗模式,有助于延长设备的电池寿命。</li>
        <li><strong>电源管理</strong>:提供上电/下电复位(POR/PDR/BOR)、可编程电压检测器(PVD)等电源管理功能,确保设备的稳定运行。</li>
</ul>

<h3>五、安全特性</h3>

<ul>
        <li><strong>硬件加密</strong>:集成真随机数生成器(RNG)和CRC计算单元,提供硬件级别的加密和校验功能。</li>
        <li><strong>存储保护</strong>:通过内存保护单元(MPU)和专有代码禁止读取保护(PCROP)等特性,保护代码和数据的安全。</li>
</ul>

<h3>六、开发和调试支持</h3>

<ul>
        <li><strong>开发环境</strong>:支持STM32CubeMX工具进行图形化配置和代码生成,简化开发过程。</li>
        <li><span style="font-size:16px;"><strong>调试接口</strong>:提供串行线调试(SWD)和JTAG调试接口,方便进行代码调试和性能分析。</span></li>
</ul>

<p ><strong><span style="font-size:16px;">&nbsp;&nbsp;STM32CubeMX 配置&nbsp;TIM1产生1Khz,占空比为50%的方波,输出引脚PC0</span></strong></p>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>

<p>核心代码:</p>

<pre>
<code>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(&amp;htim1) != HAL_OK)
{
    Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&amp;htim1, &amp;sClockSourceConfig) != HAL_OK)
{
    Error_Handler();
}
if (HAL_TIM_PWM_Init(&amp;htim1) != HAL_OK)
{
    Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&amp;htim1, &amp;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(&amp;htim1, &amp;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(&amp;htim1, &amp;sBreakDeadTimeConfig) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN TIM1_Init 2 */

/* USER CODE END TIM1_Init 2 */
HAL_TIM_MspPostInit(&amp;htim1);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

if(tim_baseHandle-&gt;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-&gt;Instance==TIM1)
{
/* USER CODE BEGIN TIM1_MspPostInit 0 */

/* USER CODE END TIM1_MspPostInit 0 */

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**TIM1 GPIO Configuration
    PC0   ------&gt; 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, &amp;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-&gt;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 */
}
}
</code></pre>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;83bc6ed661d2868f5c8c7f41436bdafa</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2024-12-5 07:31

<p>STM32G474 生成&nbsp;PWM波应该是很轻松容易的,关键是想控制什么</p>

sx-liumy1234 发表于 2024-12-5 09:32

收集的资料很全面,值得学习学习,收藏了,谢谢提供资料

jobszheng5 发表于 2024-12-5 12:59

<p>G4 是不是主要为电机驱动而生啊</p>
页: [1]
查看完整版本: 【L99H92直流电机驱动评估板】STM32G474 PWM生成