ARM-定时器-高级定时器
需求
点亮2个灯,采用互补pwm的方式
引脚
AF
极性
LED序号
T0
ch0
PE8
AF1
ON
LED1
PE9
AF1
OP
LED2
将PE8短接至PD8,PE9短接至PD9,实现互补LED效果。
高级定时器通道互补输出
开发流程
- 添加Timer依赖
- 初始化PWM
- 配置通道的P极和N极
- 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
事件的作用
- 检测异常情况:
-
break
事件通常与外部的安全监测电路相结合,用于检测诸如电机过流、过压、短路、温度过高等故障信号。检测到异常信号后,触发break
事件。
- 立即停止输出:
-
- 当
break
事件触发时,定时器的输出(通常是PWM信号)会立即被中断或停止,从而关闭控制的功率器件(如MOSFET、IGBT),避免系统出现更大的损坏。
- 当
- 安全保护:
-
break
事件用于保护电机、功率驱动器等设备。在高功率应用中,电机驱动器或功率逆变器通常依赖定时器输出的PWM信号进行控制,一旦发生故障,立即中止PWM输出可以防止设备过载或损坏。
- 保持输出状态:
-
break
事件发生后,可以配置定时器的输出状态为高阻(关闭输出)、强制为低电平或高电平,防止控制设备(如电机、变压器等)继续工作,确保设备安全。
break
事件的意义
- 防止硬件损坏:
-
- 在电机控制或功率电子系统中,电流过大或短路等问题可能会对电路造成严重损坏。
break
事件通过迅速关闭输出信号,避免电机或驱动器因过热、过流等原因烧毁。
- 在电机控制或功率电子系统中,电流过大或短路等问题可能会对电路造成严重损坏。
- 增强系统稳定性和安全性:
-
- 通过使用
break
事件,系统可以在遇到故障时自动采取措施,保证系统的稳定性和安全性。这特别重要,尤其在自动化设备中,避免操作人员介入来处理这些危险情况。
- 通过使用
- 实现安全停机:
-
- 当发生断路(
break
)时,系统通过输出信号自动恢复或进入保护模式,从而让设备安全停机,避免更大的安全隐患。
- 当发生断路(
使用场景
- 电机控制:在电机驱动应用中,
break
事件会在检测到过流或短路时停止电机运行,避免损坏电机或驱动电路。 - 电源管理:在功率变换应用中,
break
事件用于监控电源故障情况,如过压或过流,保护功率器件免于损坏。
触发条件
break
事件的触发可以通过内部定时器逻辑或外部信号线来控制。例如,当检测到外部的break
输入信号(如过流检测信号)时,定时器会立即停止输出。
总结
break
事件是定时器的一种重要安全机制,用于在出现系统异常(如过流、过压、短路等)时,迅速停止PWM或其他输出信号,避免设备损坏。它提供了自动化和高效的保护,尤其适合需要高可靠性和高安全性的功率电子和电机控制应用。