赞
踩
本文基于mst358芯片的调试drv8833马达控制。
电路:
马达座子接了12V步进电机(X1项目是5V的步进电机),马达驱动IC——DRV8833PWPR,对软件来说,需要控制的是NSTEEP、AIN-1、AIN-2、BIN-1、BIN-2引脚,它们的功能是:
NSTEEP:拉低则芯片睡眠;
软件:
驱动代码:https://download.csdn.net/download/suwen8100/18209003
代码比较简单,本文只是挑选部分代码解释。其中提供了./sys/light_machine_motor/panel_focus_forward和./sys/light_machine_motor/panel_focus_reverse,来控制马达的正转或翻转。move_motor()函数对四个IN引脚控制,一开始调试时没搞明白输入和输出的逻辑关系,只是依赖逻辑分析仪来判断输出电平的高低,后面在代码中对4个引脚的16总控制进行测试(下文有说明)。供应商给的马达控制时序如下(-表示低电平,空白表示高电平):
相关代码参考light_machine_motor.c move_motor()函数。
调试过程遇到的问题:
1、应该先了解清楚控制IN引脚后OUT的输出是怎样的。
一开始调试时没搞明白输入和输出的逻辑关系,只是依赖逻辑分析仪来判断输出电平的高低,后面在代码中对4个引脚的16总控制进行测试,代码和结论如下:
static ssize_t _focus_operate_step_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int temp; temp = simple_strtol(buf, NULL, 0); //for test if( (0 <= temp) && (temp < 16) ) { gpio_direction_output(g_motor_data.ai1, temp & 0x8); gpio_direction_output(g_motor_data.ai2, temp & 0x4); gpio_direction_output(g_motor_data.bi1, temp & 0x2); gpio_direction_output(g_motor_data.bi2, temp & 0x1); } else if(temp == 16) { gpio_direction_output(g_motor_data.sleep, 1); } else if(temp == 17) { gpio_direction_output(g_motor_data.sleep, 0); } return count; }
需要注意的是,这个结论是不接马达的时候测试的OUT引脚电平,实际上接上马达后,OUT处于Z状态时引脚电平是高的,这样才有AOUT1和AOUT2都为高的时候。总结测试的结论是:|
和DRV8833规格书说的不一样的是(不清楚原因),IN引脚为低时输出是低电平的,为高时输出是高阻态的。另外,控制AIN实际控制BOUT,而控制BIN实际控制AOUT。
2、这个马达时序需要8个Step,每个Step之间需要一点点延时,延时越大马达力矩越大。
如下代码:
每个Step处理mdelay延时,还有其他代码,这些代码运行都需要时间,但执行MOTOR_DGB打印信息时,会增加几毫米的运行时间,这就严重影响马达扭矩了。另外这段代码运行时可能被抢占,导致实际某些时刻Step运行时间远超motor_delay毫秒。
后面调试总体感觉是,只要大部分时间按照mdelay就可以了,即使有个别超过mdelay,也不太影响马达运转。
3、马达设置Stop模式时还持续发热
马达不使用时,应该设置为Stop模式,这样马达不会持续有大电流经过、发热而影响马达使用。X1 的马达Stop模式是把4个引脚拉低,但是在X1 Proj无论是拉高还是拉低,都会导致马达持续发热。最终的解决办法是控制NSTEEP引脚,来“启动”和“关闭”马达。
Uboot的TFTP烧录和固件升级时也要把NSTEEP拉低,所以需要再uboot中把NSTEEP引脚默认拉低。
4、马达驱动力不够
现象:马达拿出来,是可以正转和翻转的,但是放到光机里面,转一点点就不动了,手动给它一点点力就可以继续转,怀疑是扭矩不够,但是修改每个Step之间的时间差没有效果。
解决方法是把下面的5V改为10V。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。