drv8833 马达控制

本文基于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。
在这里插入图片描述

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值