1. 目的
STM32G474 系列芯片功能强大,提供了高解析的 Timer ( HRTIM, High-resolution timer ),可灵活产生 PWM 用于各种数位电源拓朴控制,或是各种马达应用控制。
当然电源与马达相关的应用控制,有时会发生过电压或过电流的情况,这时候保护的机制就不可少。STM32G474 除了高解析的 HRTIM,内部 HRTIM 也连结了 DAC、Comparator 模组,当遇到过电压或是过电流的情况时,内部的比较器能即时产生触发信号,连结 HRTIM来即时的关闭 PWM输出信号,做到过电压与过电流保护。
本篇博文会用到 STM32G474内部的 HRTIM ( 高解析 Timer 模组 ) 来输出 PWM,另外也会用到DAC 与比较器模组模组来与 HRTIM 作连动设定。由于功能复杂,这边会让使用者了解怎么使用 ST 的 CubeMX 来设定这些相关模组与注意事项。
功能说明 :
这边会设定三个 Channel HRTIM 的PWM ( HRTIM1_CHA1,HRTIM1_CHB1 ) 输出,再用一支 MCU Pin ( COMP1_INP ) 设定成比较器,输入外部电压,当外部电压顶到内部 DAC设定保护的电压值时,会即时的关闭 HRTIM 的 PWM 输出。
编译软体工具 :
a. STM32CubeIDE 1.8.0 ( 软体编译工具软体 )
b. STM32CubeMX 6.7.0 (图形界面设定 & 产生程式软体)
硬体工具 :
a. NUCLEO-G474RE ( STM32G474 开发版 )
2. CubeMX设定说明 ( DAC1 )
这边要设定 STMM32G4内部 DAC 功能。CubeMX 里面,设定 DAC1,作为比较器的比较电压。
2.1 OUT1 mode : Connected to external pin and to chip-peripherals
( 设定连接外部脚与芯片内部周边,可观察 DAC 输出与连接到内部比较器)
2.2 Mode selected : Normal Mode
2.3 设定完成后,可以看到右边芯片已设定好脚位 DAC1_OUT1 (PA4),可用示波器量测此 pin 脚观察 DAC 输出变化。
3. CubeMX设定说明 ( COMP1 )
这边要设定 STM32G474 内部比较器功能。CubeMX 里面,设定比较器 COMP1,当比较器COMP1 有事件发生时 ( 例如 OVP,OCP ),比较结果的信号输出到 HRTIM 模组。
3.1 勾选 Input [+] ,设定输入的 DAC 来源为刚刚设定的 DAC1 OUT1
3.2 Trigger Mode : 设定为 Rising Edge Event ( 当外部电压顶到 DAC 电压时,输出上升沿事件 )
3.3 设定完成后,可以看到右边芯片已设定好脚位 DAC1_OUT1 ( PA4 ),外部输入电压由此脚位输入,这边会用可变电阻分压来做输入电压的改变。
4. CubeMX设定说明 ( HRTIM1 )
这边要设定 STM32G474 的 HRTIIM ( High-resolution timer ) PWM输出功能,在 CubeMX 里除了设定 PWM输出,并且设定比较器触发信号发生时,及时关闭 PWM。
4.1 在HRTIM1 设定 Timer A 的PWM TA1、Timer B TB1 输出 PWM。
4.2 设定 HRTIM Timer A PWM 输出参数重点 ( 1 )
Prescaler Ratio : HRTIM Clock Multiplied by 32 ( 设定除频 170M/32 )
Period : 54400 ( 设定 PWM 频率 = 100KHz )
Up Down Mode : Timer counter is operating in up-counting mode ( 上数模式 )
Mode : The timer operates in continuous (free-running) mode ( 连续模式 )
4.3 设定 HRTIM Timer A PWM 输出参数重点 ( 2 )
Preload Enable : 设定Preload enable ( 启动预载写入 )
Repetition Update: 设定 Update on repetition enabled ( 启动更新事件 )
4.4 设定 HRTIM Timer A PWM 输出参数重点 ( 3 )
Number of Faults to enable : 1 ( 设定一个 fault 讯号 )
1st Fault Source : Fault 4 enabled ( 设定 fault 4 为来源讯号 )
( 这边要注意 fault 的来源设定 )
4.5 设定 HRTIM Timer A PWM 输出参数重点 ( 4 )
设定 Timer A Compare Unit 1,这边要启动设定 Timer A 的 compare 的点,整个 Timer 周期 Period 为 54400 ( 100KHz ),compare 1 value 设定 27200,表示 PWM duty 为 50%。
4.6 设定 HRTIM Timer A PWM 输出参数重点 ( 5 )
Polarity : Output is active HIGH ( 设定 PWM 输出动作为高准位 )
Set Source Selection : 1 ( 一个set来源 )
1st Set Source : Timer period event forces the out to its active state ( 设定 PWM 当 Timer A 的 period 起始为 high )
Reset Source Selection : 1 ( 一个reset来源 )
1st Reset Source : Timer compare 1 event forces the output to its inactive state ( 设定PWM 当 count 数到 compare 1 时为 Low )
Idle Mode : The output is not affected by the burst mode operation ( 设定当在 Idle mode 的时候不受 burst mode 影响 )
Idle Level : Output at inactive level when in IDLE state ( 设定在 Idle mode 的时候,PWM输出为 Low 信号 )
Fault Level : Output at inactive level when in FAULT state ( 设定当发生 Fault 的情况时,PWM 输出为 Low信号 )
4.7 设定 HRTIM Timer A PWM 输出参数重点 ( 6 )
( 这边注意 fault 与 Event 的来源 )
External Event 4
Event Configuration : Enable External Event 4 ( 启动 外部 Event 4 )
Source : External Event Source 2 – COMP1 ( Event 4 来源为 比较器 1 )
Event Polarity : External event is active high ( 事件发生时为 high 信号 )
Event Sensitivity : External event is active on Rising edge ( 比较器信号为上升沿触发 )
Event Fast Mode : External Event is re-synchronized by the HRTIM logic before acting on output ( 外部信号会在输出之前重新同步 )
4.8 设定Timer B PWM 输出
Timer B 的设定内容与 Timer A 一样。验证 Fault 发生时,可以关闭 Timer A 与 Timer B。
4.9 完成 CubeMX设定后,点选 GENERATE CODE 产生初始代码成
-> 点选 Open Project 就可以开启 CubeIDE 进入程式编辑界面
5. EVM 硬体设定
5.1 MCU Pin 脚规划如下 ( 范例 )
HRTIM1_CHA1 (PA8) : PWM输出,Timer A 的 Ch1
HRTIM1_CHB1 (PA10) : PWM输出,Timer B 的 Ch1
COMP1_INP (PA1) : 外部电压输入,这边用可变电阻调整外部电压 (0~3V)
DAC1_OUT1(PA4) : DAC 信号输出,可以观察设定输出DAC 电压,同时输出到内部比较器1
5.2 开发板 NUCLEO-G474RE 讯号接线图
这边要注意,在 CubeMX 设定好的 HRTIM、DAC、Comparator模组,但是这些模组还尚未启动,在 CubeIDE 编辑程式下就要用程式代码来启动这些模组功能。
6.1 在程式中的 Main() 里面,在初始化程式后请加上设定 DAC 与启动DAC 程式
//设定 DAC 输出电压参数与资料对其方式:
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 1241);
//DAC_ALIGN_12B_R : DAC 的 Data 为 12bit 靠右对其
参数 1241 : DAC 输出电压为1V
计算公式如下:
//启动 DAC1 的 Channel1:
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);
6.2 在程式中的 Main() 里面,在初始化程式后请加上启动 Comparator 1 程式
// 启动 Comparator 1
HAL_COMP_Start(&hcomp1);
6.3 在程式中的 Main() 里面,在初始化程式后请加上启动 HRTIM1 & Output 程式
//启动 HRTIM1 的 TimerA & TimerB
HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_A);
HAL_HRTIM_WaveformCountStart(&hhrtim1, HRTIM_TIMERID_TIMER_B);
//启动 TimerA 的 TA1 & TimerB 的 TB1 输出
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1 + HRTIM_OUTPUT_TB1 );
7. 验证 HRTIM Fault 功能
完成硬体接线与程式后,烧录程式到开发板的主芯片 STM32G474 验证 HRTIM 功能,验证结果如下。
7.1 未发生 Fault 时,HRTIM 的 PWM 皆正常输出。
Ch1 : TimerA 的 TA1 输出 PWM
Ch2 : TimerB 的 TB1 输出 PWM
Ch3 : 可变电阻输入电压进入 MCU 比较器脚位
Ch4 : DAC 输出电压值为 1V
7.2 透过外部可变电阻,把输入电压调整超过 1V,当超过 1V 时,内部比较器会触发 Fault,关闭 PWM 讯号输出。在电源或马达的应用上可以做到,如下图。
Ch1 : TimerA 的 TA1 输出 PWM ( PWM 已停止动作 )
Ch2 : TimerB 的 TB1 输出 PWM ( PWM 已停止动作 )
Ch3 : 可变电阻输入电压进入 MCU 比较器脚位,输入电压超过 1V
Ch4 : DAC 输出电压值为 1V
7.3 当发生 Fault 关闭 HRTIM PWM,输入电压回复到正常状态( 1V 以下 )时,如果想要回复 HRTIM PWM 启动状态,就可以在程式中在下启动 HRTIM PWM 程式指令如下:
// 重新启动 HRTIM TimerA TA1 & HRTIM TimerB TB1 输出
HAL_HRTIM_WaveformOutputStart(&hhrtim1, HRTIM_OUTPUT_TA1 + HRTIM_OUTPUT_TB1 )。
评论
ybbbbb
8 个月前