一、摘要
本次使用高级定时器TIMER0。
注:STM32的定时器是从编号1开始的,GD的定时器编号是从0开始的。
高级定时器(TIMER0)是四通道定时器,可以产生 PWM 信号控制直流电机。高级定时器含有一个 16 位无符号计数器。高级定时器是可编程的,可以被用来计数,其外部事件可以驱动其他定时器高级定时器包含了一个死区时间插入模块,非常适合电机控制。定时器和定时器之间是相互独立,但是他们可以被同步在一起形成一个更大的定时器,这些定时器的计数器一致地增加。
* 计数器宽度: 16位;
* 时钟源可选:内部时钟,内部触发,外部输入,外部触发;
* 多种计数模式:向上计数,向下计数和中央计数;
* 可编程的预分频器: 16位,运行时可以被改变;
* 每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式;
* 自动重装载功能;~~~~
二、开发环境
* Keil-MDK 5.34
* Windows10
* 固件库-GD32F3x0\_Firmware\_Library\_V2.2.0
三、原理概述
1、PWM部分
使用比较输出功能,使用ARR和CCRx的预装载功能,在产生比较中断(CCRx)时改变下一周期的ARR和CCRx寄存器的值,达到控制电机速度的目的。
2、电机曲线部分
电机使用S曲线进行调控,加速点数、加速平滑度、超始速度、最大运行速度均可通过参数设置。
四、定时器配置主要代码
timer_deinit(TIMER0);
timer_initpara.prescaler = PWM_PRSC;
timer_initpara.alignedmode = TIMER_COUNTER_CENTER_DOWN;
timer_initpara.period = HALF_PWM_PERIOD; /* 配置周期 */
timer_initpara.clockdivision = TIMER_CKDIV_DIV2; /* 分频 */
timer_initpara.repetitioncounter = 1; /* 重复计数器, 影响更新事件的频率 */
timer_init(TIMER0, &timer_initpara);
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
timer_channel_output_config(TIMER0, TIMER_CH_0,&timer_ocintpara);
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
timer_channel_output_config(TIMER0, TIMER_CH_0,&timer_ocintpara);
/* channel1~3 */
timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, HALF_PWM_PERIOD/2);
timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM1);
timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_ENABLE); /* 预装载使能 */
timer_counter_value_config(TIMER0, 0);
timer_update_source_config(TIMER0, TIMER_UPDATE_SRC_REGULAR);
timer_single_pulse_mode_config(TIMER0, TIMER_SP_MODE_REPETITIVE);
timer_primary_output_config(TIMER0,ENABLE);
timer_auto_reload_shadow_enable(TIMER0);
timer_enable(TIMER0);
五、电机S曲线公式
Fcurrent = Fmin + (Fmax - Fmin)/(1 + EXP(-Flexible*(i-num)/num))
将曲线使用代码实现,每次CCRx中断根据曲线结果改变下一次的AAR和CCRx寄存器值即可实现步进电机加减速。