1.背景
前幾天找出個(gè)步進(jìn)電機(jī),用L298N驅(qū)動(dòng)測(cè)試了一下,具體見上篇文章簡(jiǎn)單的步進(jìn)電機(jī)驅(qū)動(dòng)調(diào)試。但是L298N無法實(shí)現(xiàn)細(xì)分控制,在低速轉(zhuǎn)動(dòng)時(shí),聲音比較大,且振動(dòng)厲害,因此想著嘗試一下細(xì)分控制效果。于是花十二塊大洋某寶購(gòu)買了一塊T“MC2209步進(jìn)電機(jī)超靜音驅(qū)動(dòng)模塊”來測(cè)試一下。
2.硬件及連接
2.1硬件
2.2接口連接
TMC2009模塊的接口連接如下:
3.原理介紹
3.1 TMC2209模塊介紹
TMC2209是TRIAMINIC推出的一款步進(jìn)電機(jī)驅(qū)動(dòng)模塊。驅(qū)動(dòng)模塊靜音且高精度,可以實(shí)現(xiàn)高達(dá)1/256步細(xì)分控制,實(shí)現(xiàn)更平滑靜音的步進(jìn)電機(jī)控制。模塊內(nèi)嵌12.5 MHz的內(nèi)部振蕩器,簡(jiǎn)單串行數(shù)據(jù)傳輸?shù)?a href="http://www.zgszdi.cn/tags/uart/" target="_blank">UART。性價(jià)比較高的步進(jìn)電機(jī)驅(qū)動(dòng)模塊。
3.2 TMC2209規(guī)格
工作電壓:5.5 – 38V
最大內(nèi)部時(shí)鐘頻率:12.5 MHz
每相最大電流:2 A
峰值輸出電流:2.8A
邏輯工作電壓:3/5V
3.3 TMC2209針腳定義
3.4 微步細(xì)分配置
1)硬件細(xì)分配置
TMC2209模塊提供了硬件微步配置,通過MS1和MS2可以實(shí)現(xiàn)1/8、1/16、1/32、1/64的細(xì)分控制,具體如下:
2)軟件細(xì)分配置
如果想實(shí)現(xiàn)更高的細(xì)分控制,則需要通過USART口進(jìn)行配置,具體如下:
(測(cè)試中,測(cè)試完完善進(jìn)來)
4.程序代碼
4.1 TMC2209初始化
//硬件微步設(shè)置
void micro_step_set(rt_uint8_t step)
{
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;
}
}
static int tmc2209_init(void)
{
rt_pin_mode(EN_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(MS1_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(MS2_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(STEP_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(DIR_PIN, PIN_MODE_OUTPUT);
rt_pin_write(EN_PIN, PIN_LOW);
micro_step_set(MICRO_STEP);
hwtimer_init();
return 0;
}
INIT_APP_EXPORT(tmc2209_init);
4.2 PWM設(shè)置
這里采用了PWM(ART-Pi默認(rèn)的PWM5通道1)來輸出脈沖信號(hào)控制步進(jìn)電機(jī)的轉(zhuǎn)動(dòng)速度,下面是使用函數(shù):
int pwm_set(rt_uint16_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;
/ 設(shè)置PWM周期和脈沖寬度默認(rèn)值 /
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/ 使能設(shè)備 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
return 0;
}
4.3 定時(shí)器配置
這里采用硬件定時(shí)器(ART-Pi默認(rèn)TIM13,PS:settings雖然可以直接配置,但是cubemx默認(rèn)沒配置TIM13,所以直接使用還是不行,需要cubemx配置后才能使用)來控制PWM輸出指定的脈沖數(shù)量,通過計(jì)算步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的角度所需要的脈沖個(gè)數(shù),以及轉(zhuǎn)動(dòng)速度計(jì)算的脈沖時(shí)間,計(jì)算出定時(shí)器的計(jì)時(shí)時(shí)間,超時(shí)后停止PWM輸出,并禁止TMC2209(不禁止的話電機(jī)會(huì)發(fā)熱)。
#define HWTIMER_DEV_NAME "timer13" /* 定時(shí)器名稱 /
/ 定時(shí)器超時(shí)回調(diào)函數(shù) /
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; / 定時(shí)器模式 /
rt_uint32_t freq = 1000000; / 計(jì)數(shù)頻率 /
/ 查找定時(shí)器設(shè)備 /
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;
}
/ 以讀寫方式打開設(shè)備 /
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;
}
/ 設(shè)置超時(shí)回調(diào)函數(shù) /
rt_device_set_rx_indicate(hw_dev, timeout_cb);
/ 設(shè)置計(jì)數(shù)頻率(若未設(shè)置該項(xiàng),默認(rèn)為1Mhz 或 支持的最小計(jì)數(shù)頻率) /
rt_device_control(hw_dev, HWTIMER_CTRL_FREQ_SET, &freq);
/ 設(shè)置模式為周期性定時(shí)器(若未設(shè)置,默認(rèn)是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 :%dn", 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 failedn");
return RT_ERROR;
}
return RT_EOK;
}
4.4 步進(jìn)電機(jī)控制
這里采用了兩種方式來輸出脈沖及數(shù)量,一種是通過延時(shí)和翻轉(zhuǎn)DIR管腳電平實(shí)現(xiàn),一種是通過定時(shí)器和PWM來實(shí)現(xiàn)。
/*
dir:電機(jī)轉(zhuǎn)動(dòng)方向,0 正轉(zhuǎn);1 反轉(zhuǎn)
speed:電機(jī)轉(zhuǎn)動(dòng)速度:0-300r/min,注意不同的電機(jī)最高轉(zhuǎn)速不一樣
angle:電機(jī)轉(zhuǎn)動(dòng)角度:°
/
void turn_control(rt_uint8_t dir, rt_uint16_t speed, float_t angle)
{
rt_uint32_t pulse_num = 0;//脈沖數(shù)量
rt_uint16_t delay_time = 0;
rt_uint16_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("%dn", pulse_num);
//rt_kprintf("%dn", delay_time);
//rt_kprintf("%dn", pulse_fre);
//rt_kprintf("%dn", timeout_value.usec);
rt_pin_write(EN_PIN, PIN_LOW);
//設(shè)置電機(jī)轉(zhuǎn)動(dòng)方向
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);//設(shè)置PWM頻率并輸出
hwtimer_start(timeout_value);//設(shè)置定時(shí)時(shí)間并啟動(dòng)定時(shí)器
/ 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控制臺(tái)
這里把電機(jī)控制加入MSH指令,可以通過控制臺(tái)來手動(dòng)實(shí)現(xiàn)電機(jī)任意控制測(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.總結(jié)
電機(jī)的轉(zhuǎn)動(dòng)確實(shí)非常安靜,完全聽不到聲音,在低速控制時(shí)轉(zhuǎn)動(dòng)也比較平滑,完全感受不到振動(dòng)。性價(jià)比不錯(cuò),有需要做步進(jìn)電機(jī)控制的小伙伴可以參考使用。
-
振蕩器
+關(guān)注
關(guān)注
28文章
3847瀏覽量
139361 -
步進(jìn)電機(jī)
+關(guān)注
關(guān)注
151文章
3120瀏覽量
147841 -
L298N驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
2瀏覽量
773 -
TMC2209
+關(guān)注
關(guān)注
1文章
5瀏覽量
6017 -
ART-Pi
+關(guān)注
關(guān)注
0文章
23瀏覽量
1314
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論