> 技术文档 > ARM-定时器-高级定时器

ARM-定时器-高级定时器


需求

点亮2个灯,采用互补pwm的方式

定时器

通道

引脚

AF

极性

LED序号

T0

ch0

PE8

AF1

ON

LED1

PE9

AF1

OP

LED2

将PE8短接至PD8,PE9短接至PD9,实现互补LED效果。

高级定时器通道互补输出

开发流程

  1. 添加Timer依赖
  2. 初始化PWM
  3. 配置通道的P极和N极
  4. PWM占空比控制

通道配置

void timer_channel_config(uint32_t timer_periph, uint16_t channel) { /* TIMER 通道输出配置 */ timer_oc_parameter_struct ocpara; /* initialize TIMER channel output parameter struct */ timer_channel_output_struct_para_init(&ocpara); ocpara.outputstate = TIMER_CCX_ENABLE; // OP Enable ocpara.outputnstate = TIMER_CCXN_ENABLE; // ON Enable ocpara.ocpolarity = TIMER_OC_POLARITY_HIGH; // OP Polarity ocpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; // ON Polarity /* 配置输出参数 configure TIMER channel output function */ timer_channel_output_config(timer_periph, channel, &ocpara); /* 配置通道输出输出比较模式 configure TIMER channel output compare mode */ timer_channel_output_mode_config(timer_periph, channel, TIMER_OC_MODE_PWM0);}
  • ocnpolarity:N极性电平
  • ocpolarity:P极性电平

打开互补保护电路

// break 只针对高级定时器TIMER0 & TIMER7,打开互补保护电路/* TIMER通道互补保护电路 */timer_break_parameter_struct breakpara;/* 初始化TIMER break参数结构体 */timer_break_struct_para_init(&breakpara);/* break输入的极性 HIGH */breakpara.breakpolarity = TIMER_BREAK_POLARITY_HIGH;/* 输出自动的启用 */breakpara.outputautostate = TIMER_OUTAUTO_ENABLE;/* break输入的启用*/breakpara.breakstate = TIMER_BREAK_ENABLE;/* 配置TIMER0 break */timer_break_config(TIMER0, &breakpara);/* 启用TIMER0 break */timer_break_enable(TIMER0);

完整代码

#include \"gd32f4xx.h\"#include \"systick.h\"#include #include \"main.h\"#include \"USART0.h\"void USART0_on_recv(uint8_t* data, uint32_t len) { printf(\"g_rx_buffer: %s g_rx_cnt:%d \\n\", data, len);}static void GPIO_config() { rcu_periph_clock_enable(RCU_GPIOC); gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6); gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); gpio_bit_reset(GPIOC, GPIO_PIN_6); // rcu_periph_clock_enable(RCU_GPIOD);// gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_8 | GPIO_PIN_9);}void timer_gpio_config(uint32_t gpio_rcu, uint32_t gpio_port, uint32_t gpio_pin, uint32_t gpio_af) { rcu_periph_clock_enable(gpio_rcu); /* 设置gpio模式 */ gpio_mode_set(gpio_port, GPIO_MODE_AF, GPIO_PUPD_NONE, gpio_pin); gpio_output_options_set(gpio_port, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, gpio_pin); gpio_af_set(gpio_port, gpio_af, gpio_pin);}void timer_init_config(rcu_periph_enum rcu_periph, uint32_t timer_periph, uint16_t t_prescaler, uint32_t t_period) { rcu_periph_clock_enable(rcu_periph); timer_deinit(timer_periph); /*初始化参数 */ timer_parameter_struct initpara; /* initialize TIMER init parameter struct */ timer_struct_para_init(&initpara); /* 根据需要配置值 分频系数 (可以实现更低的timer频率) */ initpara.prescaler = t_prescaler - 1; /* 1个周期的计数(period Max: 65535) Freq > 3662 */ initpara.period= t_period - 1; /* initialize TIMER counter */ timer_init(timer_periph, &initpara); /* enable a TIMER */ timer_enable(timer_periph);}void timer_channel_config(uint32_t timer_periph, uint16_t channel) { /* TIMER 通道输出配置 */ timer_oc_parameter_struct ocpara; /* initialize TIMER channel output parameter struct */ timer_channel_output_struct_para_init(&ocpara); ocpara.outputstate = TIMER_CCX_ENABLE; // OP Enable ocpara.outputnstate = TIMER_CCXN_ENABLE; // ON Enable ocpara.ocpolarity = TIMER_OC_POLARITY_HIGH; // OP Polarity ocpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; // ON Polarity /* 配置输出参数 configure TIMER channel output function */ timer_channel_output_config(timer_periph, channel, &ocpara); /* 配置通道输出输出比较模式 configure TIMER channel output compare mode */ timer_channel_output_mode_config(timer_periph, channel, TIMER_OC_MODE_PWM0);}// PWM#definePRESCALER1#defineFREQ 10000#define PERIOD(SystemCoreClock / FREQ)// LED1 TM0CH1 PE9 OP// LED2 TM0CH0 PE8 ONstatic void Timer_config() { // 定时器 // GPIO ---------------------------------------- timer_gpio_config(RCU_GPIOE, GPIOE, GPIO_PIN_9, GPIO_AF_1); timer_gpio_config(RCU_GPIOE, GPIOE, GPIO_PIN_8, GPIO_AF_1); // TIMER---------------------------------------- /* 升级频率*/ rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); timer_init_config(RCU_TIMER0, TIMER0, PRESCALER, PERIOD); // 与通道无关 // TIMER channel------------------------------- timer_channel_config(TIMER0, TIMER_CH_0); // Break -------------------------------------------------- // break 只针对高级定时器TIMER0 & TIMER7,打开互补保护电路 /* TIMER通道互补保护电路 */ timer_break_parameter_struct breakpara; /* 初始化TIMER break参数结构体 */ timer_break_struct_para_init(&breakpara); /* break输入的极性 HIGH */ breakpara.breakpolarity = TIMER_BREAK_POLARITY_HIGH; /* 输出自动的启用 */ breakpara.outputautostate = TIMER_OUTAUTO_ENABLE; /* break输入的启用*/ breakpara.breakstate = TIMER_BREAK_ENABLE; /* 配置TIMER0 break */ timer_break_config(TIMER0, &breakpara); /* 启用TIMER0 break */ timer_break_enable(TIMER0);}/********************************************************** * @brief 更新pwm占空比 * @param timer_periph 定时器 * @param channel 通道 * @param duty 占空比[0, 100] * @return **********************************************************/void PWM_update(uint32_t timer_periph, uint16_t channel, float duty) { // 0-100 if(duty > 100) duty = 100; else if(duty = 100) { dir = -1; } else if (duty <= 0) { dir = 1; } duty += dir; printf(\"duty: %.2f \\n\", duty); delay_1ms(10); }}

关于break事件

break事件在ARM32的高级定时器中是一种安全机制,用于在检测到某种异常情况或故障时,立即中止定时器输出信号,特别是用于PWM(脉宽调制)信号的控制。这种机制的主要作用是防止电路或设备因错误或过载而损坏。以下是break事件的具体作用和意义:

break事件的作用

  1. 检测异常情况
    • break事件通常与外部的安全监测电路相结合,用于检测诸如电机过流、过压、短路、温度过高等故障信号。检测到异常信号后,触发break事件。
  1. 立即停止输出
    • break事件触发时,定时器的输出(通常是PWM信号)会立即被中断或停止,从而关闭控制的功率器件(如MOSFET、IGBT),避免系统出现更大的损坏。
  1. 安全保护
    • break事件用于保护电机、功率驱动器等设备。在高功率应用中,电机驱动器或功率逆变器通常依赖定时器输出的PWM信号进行控制,一旦发生故障,立即中止PWM输出可以防止设备过载或损坏。
  1. 保持输出状态
    • break事件发生后,可以配置定时器的输出状态为高阻(关闭输出)、强制为低电平或高电平,防止控制设备(如电机、变压器等)继续工作,确保设备安全。

break事件的意义

  1. 防止硬件损坏
    • 在电机控制或功率电子系统中,电流过大或短路等问题可能会对电路造成严重损坏。break事件通过迅速关闭输出信号,避免电机或驱动器因过热、过流等原因烧毁。
  1. 增强系统稳定性和安全性
    • 通过使用break事件,系统可以在遇到故障时自动采取措施,保证系统的稳定性和安全性。这特别重要,尤其在自动化设备中,避免操作人员介入来处理这些危险情况。
  1. 实现安全停机
    • 当发生断路(break)时,系统通过输出信号自动恢复或进入保护模式,从而让设备安全停机,避免更大的安全隐患。

使用场景

  • 电机控制:在电机驱动应用中,break事件会在检测到过流或短路时停止电机运行,避免损坏电机或驱动电路。
  • 电源管理:在功率变换应用中,break事件用于监控电源故障情况,如过压或过流,保护功率器件免于损坏。

触发条件

  • break事件的触发可以通过内部定时器逻辑或外部信号线来控制。例如,当检测到外部的break输入信号(如过流检测信号)时,定时器会立即停止输出。

总结

break事件是定时器的一种重要安全机制,用于在出现系统异常(如过流、过压、短路等)时,迅速停止PWM或其他输出信号,避免设备损坏。它提供了自动化和高效的保护,尤其适合需要高可靠性和高安全性的功率电子和电机控制应用。