Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ART-Pi
步进电机
Art-Pi +TMC2209步进电机细分控制
发布于 2023-12-09 12:00:07 浏览:1758
订阅该版
[tocm] # 1.背景 前几天找出个步进电机,用L298N驱动测试了一下,具体见上篇文章[简单的步进电机驱动调试](https://club.rt-thread.org/ask/article/f8d36833ab3fc6c5.html "简单的步进电机驱动调试")。但是L298N无法实现细分控制,在低速转动时,声音比较大,且振动厉害,因此想着尝试一下细分控制效果。于是花十二块大洋某宝购买了一块T“MC2209步进电机超静音驱动模块”来测试一下。 # 2.硬件及连接 ## 2.1硬件 ART-Pi、TMC2209模块、DC12V电源。 ## 2.2接口连接 TMC2009模块的接口连接如下: | TMC2209 | ART-Pi | TMC2209 | others | | :------------: | :------------: | :------------: | :------------: | | EN | PH13 | VM | 12V+ | | MS1 | PH14 | GND | 12V- | | MS2 | PH15 | M1B | motor_A- | | PDN | PA9/PA10 | M1A | motor_A+ | | USART | / | M2A | motor_B+ | | CLK | / | M2B | motor_B- | | STEP | PH10 | VIO | 3.3V | | DIR | PH11 | GND | GND | # 3.原理介绍 ## 3.1 TMC2209模块介绍 TMC2209是TRIAMINIC推出的一款步进电机驱动模块。驱动模块静音且高精度,可以实现高达1/256步细分控制,实现更平滑静音的步进电机控制。模块内嵌12.5 MHz的内部振荡器,简单串行数据传输的UART。性价比较高的步进电机驱动模块。 ## 3.2 TMC2209规格 - 工作电压:5.5 – 38V - 最大内部时钟频率:12.5 MHz - 每相最大电流:2 A - 峰值输出电流:2.8A - 逻辑工作电压:3/5V ## 3.3 TMC2209针脚定义 ![1.png](https://oss-club.rt-thread.org/uploads/20231209/64640736c37e348f36a0c2794956a4a6.png.webp) ## 3.4 微步细分配置 1)硬件细分配置 TMC2209模块提供了硬件微步配置,通过MS1和MS2可以实现1/8、1/16、1/32、1/64的细分控制,具体如下: ![2.png](https://oss-club.rt-thread.org/uploads/20231209/cefb935126109e9d1f29069b97889189.png.webp) 2)软件细分配置 如果想实现更高的细分控制,则需要通过UART口进行配置,具体如下: a)首先说一下硬件接口,当使用UART接口时,MS1和MS2作为地址配置,可以同时挂载4个tmc2209(地址分别为:0~3),就用一个时可以悬空,因为内部已下拉; b) 我这个TMC2209模块的PDN_UART应该是“PDN”引脚,“USART”引脚是悬空的,电路板上预留的0欧电阻可以分别接向两个引脚,实际一个没焊(被误导了,我说怎测都不行呢); c) DIR和STEP可以通过UART来控制,也可以通过IO控制,我这里仅用UART来实现微步设置,其他没测; d)这里用art-pi的USART1,PA9和PA10接PDN管脚,PA9串联1K电阻; ![3.png](https://oss-club.rt-thread.org/uploads/20231215/ef0efc86d3b1ef9399242a4c428f4263.png.webp) e)报文格式,参照芯片手册: ![1.png](https://oss-club.rt-thread.org/uploads/20231215/2f7d8649c31f31f7661f6ed93b89eb86.png.webp) CRC校验码,可以直接使用手册里的代码即可 ![2.png](https://oss-club.rt-thread.org/uploads/20231215/2053df21622136edcf3302feca7a98b9.png.webp) 剩下的就是寄存器的数据配置了,这里用到了GENERAL CONFIGURATION REGISTER(0x00)使能内部细分配置,CHOPCON(0x6C)进行微步设置。 # 4.程序代码 ## 4.1 TMC2209初始化 ```c //微步设置 void micro_step_set(rt_uint8_t step) { #ifdef USING_UART rt_uint8_t chopconf[4] = {0}; switch (step) { case 256: chopconf[3] = 0x10; break; case 128: chopconf[3] = 0x11; break; case 64: chopconf[3] = 0x12; break; case 32: chopconf[3] = 0x13; break; case 16: chopconf[3] = 0x14; break; case 8: chopconf[3] = 0x15; break; case 4: chopconf[3] = 0x16; break; case 2: chopconf[3] = 0x17; break; case 0: chopconf[3] = 0x18; break; default: break; } chopconf[2] = 0x01; chopconf[1] = 0x00; chopconf[0] = 0x53; tmc2209_uart_send(0x00, 0x6c, chopconf); #else switch (step) { case 8: rt_pin_write(MS1_PIN, PIN_LOW); rt_pin_write(MS2_PIN, PIN_LOW); break; case 16: rt_pin_write(MS1_PIN, PIN_HIGH); rt_pin_write(MS2_PIN, PIN_HIGH); break; case 32: rt_pin_write(MS1_PIN, PIN_HIGH); rt_pin_write(MS2_PIN, PIN_LOW); break; case 64: rt_pin_write(MS1_PIN, PIN_LOW); rt_pin_write(MS2_PIN, PIN_HIGH); break; default: break; } #endif } static int tmc2209_init(void) { rt_thread_t tid; rt_pin_mode(EN_PIN, PIN_MODE_OUTPUT); rt_pin_write(EN_PIN, PIN_LOW); #ifdef USING_UART rt_uint8_t general_conf[4] = {0x00}; if (my_uart_open("uart1", BAUD_RATE_115200) == RT_EOK) { tid = rt_thread_create("uart1_rx", uart1_rx_thread_entry, RT_NULL, 1024, 6, 10); if (tid != RT_NULL) rt_thread_startup(tid); } //open uart1 general_conf[3] = 0x00; general_conf[2] = 0x00; general_conf[1] = 0x00; general_conf[0] = 0x81; tmc2209_uart_send(0x00, 0x00, general_conf); rt_thread_mdelay(500); #else rt_pin_mode(MS1_PIN, PIN_MODE_OUTPUT); rt_pin_mode(MS2_PIN, PIN_MODE_OUTPUT); #endif rt_pin_mode(STEP_PIN, PIN_MODE_OUTPUT); rt_pin_mode(DIR_PIN, PIN_MODE_OUTPUT); micro_step_set(MICRO_STEP); rt_pin_write(EN_PIN, PIN_HIGH); hwtimer_init(); return 0; } INIT_APP_EXPORT(tmc2209_init); ``` ## 4.2 PWM设置 这里采用了PWM(ART-Pi默认的PWM5通道1)来输出脉冲信号控制步进电机的转动速度,下面是使用函数: ```c int pwm_set(rt_uint32_t fre, rt_uint8_t duty_cycle) { rt_uint32_t period = 0; rt_uint32_t pulse = 0; pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); if (pwm_dev == RT_NULL) { rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME); return RT_ERROR; } period = 1000000000 / fre; pulse = period * duty_cycle / 100; /* 设置PWM周期和脉冲宽度默认值 */ rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); /* 使能设备 */ rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); return 0; } ``` ## 4.3 定时器配置 这里采用硬件定时器(ART-Pi默认TIM13,PS:settings虽然可以直接配置,但是cubemx默认没配置TIM13,所以直接使用还是不行,需要cubemx配置后才能使用)来控制PWM输出指定的脉冲数量,通过计算步进电机转动的角度所需要的脉冲个数,以及转动速度计算的脉冲时间,计算出定时器的计时时间,超时后停止PWM输出,并禁止TMC2209(不禁止的话电机会发热)。 ```c #define HWTIMER_DEV_NAME "timer13" /* 定时器名称 */ /* 定时器超时回调函数 */ static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size) { rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL);//停止PWM输出 rt_pin_write(EN_PIN, PIN_HIGH);//禁止TMC2209 return 0; } int hwtimer_init(void) { rt_err_t ret = RT_EOK; rt_hwtimer_mode_t mode; /* 定时器模式 */ rt_uint32_t freq = 1000000; /* 计数频率 */ /* 查找定时器设备 */ hw_dev = rt_device_find(HWTIMER_DEV_NAME); if (hw_dev == RT_NULL) { rt_kprintf("hwtimer sample run failed! can't find %s device!\n", HWTIMER_DEV_NAME); return RT_ERROR; } /* 以读写方式打开设备 */ ret = rt_device_open(hw_dev, RT_DEVICE_OFLAG_RDWR); if (ret != RT_EOK) { rt_kprintf("open %s device failed!\n", HWTIMER_DEV_NAME); return ret; } /* 设置超时回调函数 */ rt_device_set_rx_indicate(hw_dev, timeout_cb); /* 设置计数频率(若未设置该项,默认为1Mhz 或 支持的最小计数频率) */ rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq); /* 设置模式为周期性定时器(若未设置,默认是HWTIMER_MODE_ONESHOT)*/ mode = HWTIMER_MODE_ONESHOT; ret = rt_device_control(hw_dev, HWTIMER_CTRL_MODE_SET, &mode); if (ret != RT_EOK) { rt_kprintf("set mode failed! ret is :%d\n", ret); return ret; } return ret; } int hwtimer_start(rt_hwtimerval_t timeout) { if (rt_device_write(hw_dev, 0, &timeout, sizeof(timeout)) != sizeof(timeout)) { rt_kprintf("set timeout value failed\n"); return RT_ERROR; } return RT_EOK; } ``` ## 4.4 步进电机控制 这里采用了两种方式来输出脉冲及数量,一种是通过延时和翻转DIR管脚电平实现,一种是通过定时器和PWM来实现。 ```c /* dir:电机转动方向,0 正转;1 反转 speed:电机转动速度:0-300r/min,注意不同的电机最高转速不一样 angle:电机转动角度:° */ void turn_control(rt_uint8_t dir, rt_uint16_t speed, float_t angle) { rt_uint32_t pulse_num = 0;//脉冲数量 rt_uint16_t delay_time = 0; rt_uint32_t pulse_fre = 0;//脉冲频率 rt_hwtimerval_t timeout_value; float_t temp = 0.0; temp = (angle / (360.0 / 200.0 / MICRO_STEP)); float_t t = 1000000 / ((360.0 / (360.0 / 200.0 / MICRO_STEP)) / 60.0 * speed); pulse_num = temp; delay_time = t / 2; pulse_fre = 1000000 / t; timeout_value.sec = 0; timeout_value.usec = t * pulse_num; //rt_kprintf("%d\n", pulse_num); //rt_kprintf("%d\n", delay_time); //rt_kprintf("%d\n", pulse_fre); //rt_kprintf("%d\n", timeout_value.usec); rt_pin_write(EN_PIN, PIN_LOW); //设置电机转动方向 if(dir == 0) rt_pin_write(DIR_PIN, PIN_HIGH); if(dir == 1) rt_pin_write(DIR_PIN, PIN_LOW); pwm_set(pulse_fre, 50);//设置PWM频率并输出 hwtimer_start(timeout_value);//设置定时时间并启动定时器 /* for (int i = 0; i < pulse_num; ++i) { rt_pin_write(STEP_PIN, PIN_LOW); //rt_thread_mdelay(speed); rt_hw_us_delay(delay_time); rt_pin_write(STEP_PIN, PIN_HIGH); //rt_thread_mdelay(speed); rt_hw_us_delay(delay_time); } rt_pin_write(EN_PIN, PIN_HIGH);*/ } ``` ## 4.5 MSH控制台 这里把电机控制加入MSH指令,可以通过控制台来手动实现电机任意控制测试: ```c static void step_motor_turn(int argc, char**argv) { if (argc < 3) { rt_kprintf("Please input'step_motor_turn direction speed angle'\n"); return; } if (!rt_strcmp(argv[1], "forward")) { turn_control(0, atof(argv[2]), atof(argv[3])); } else if (!rt_strcmp(argv[1], "reverse")) { turn_control(1, atoi(argv[2]), atof(argv[3])); } else { rt_kprintf("Please input'step_motor_turn direction speed angle'\n"); } } MSH_CMD_EXPORT(step_motor_turn, step_motor_turn ); ``` # 5.总结 电机的转动确实非常安静,完全听不到声音,在低速控制时转动也比较平滑,完全感受不到振动。性价比不错,有需要做步进电机控制的小伙伴可以参考使用。 附上TMC2209的源码文件(更新UART后的源码) [tmc2209.c](https://club.rt-thread.org/file_download/aa5599ad6474f144)
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
小小李sunny
这家伙很懒,什么也没写!
文章
4
回答
1440
被采纳
289
关注TA
发私信
相关文章
1
RT-Thread Studio 编译ART-Pi 的SDK报错 求助!-
2
ART-Pi 在 Studio 中使用TouchGFX Library 编译报错
3
RT-Thread Studio 更新错误
4
基于ART-Pi开发板创建的工程,RT-Thread Settings打不开
5
在 ART-Pi 平台使用 openocd 直接烧录到外部 spi flash?
6
ART-Pi工程用mdk5打开后提示文件找不到
7
ART-PI demo是否能够增加demo流程框图或者详细设计文档
8
ART-Pi 的ST_Link无法识别
9
请把ART-Pi仓库放到gitee上一份。
10
仅有ART-Pi开发包时,RTT Studio无法创建ART-Pi工程
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
freemodbus
PWM
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
5
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
3
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
5
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部