Mr.Lin · 2022年04月13日

【GD32F310开发板试用】PWM+TMC5160驱动步进电机

一、摘要

本次使用高级定时器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寄存器值即可实现步进电机加减速。

推荐阅读
关注数
10708
内容数
187
中国高性能通用微控制器领域的领跑者兆易创新GD系列芯片技术专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息