树莓派:直流电机正反转(pigpio)

在使用RPi.GPIO 库里的PWM功能时候,出现了一个问题,电机的啸叫声特别明显,低频(200以下)也是,高频(20K)更是,后来用示波器检测它的输出端,发现将占空比设置为0的时候,它还是会产生一个PWM信号。电机正反转时候,转速断断续续。

 

后来,查到了一个比较靠谱的库 pigpio, 可以用pip下载。这个库的PWM非常稳定。用示波器检测,比较平稳。

 

将一端口设置成PWM,四步走:

  1. 生成一个 pi()实例
  2. 设置端口模式 set_mode()
  3. 设置端口PWM的频率 set_PWM_frequency()
  4. 设置PWM占空比的范围 set_PWM_range()

修改端口的占空比

set_PWM_dutycycle()

 

import pigpio


pi = pigpio.pi() # 创建实例
pi.set_mode(17,pigpio.OUTPUT) # 设置17端口
pi.set_PWM_frequency(17,127)  # 修改17端口的PWM频率
pi.set_PWM_range(17,100)      # 设置PWM占空比的切分


pi.set_mode(27,pigpio.OUTPUT)  # 设置27端口
pi.set_PWM_frequency(27,127)
pi.set_PWM_range(27,100)

def forward(pwm):       # 向前
    # pi.write(17,1)      # 两个电机输入1,制动
    # pi.write(27,1)
    pi.set_PWM_dutycycle(17,pwm)
    pi.set_PWM_dutycycle(27, 0)


def backword(pwm):      # 向后
    # pi.write(17,1)      # 两个电机输入1,制动
    # pi.write(27,1)
    pi.set_PWM_dutycycle(17,0)
    pi.set_PWM_dutycycle(27, pwm)


def stop():             # 停止
    pi.write(17,1)      # 两个电机输入1,制动
    pi.write(27,1)
    pass

def main():
    flag = int(input("请输入前/后/停(1,0,其它):"))

    if(flag==1):
        pwm = int(input("请输入占空比:"))
        forward(pwm)
    elif(flag==0):
        pwm = int(input("请输入占空比:"))
        backword(pwm)
    else:
        stop()

if __name__ == '__main__':
    while 1:

        main()

 

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
步进电机是一种精密的电机,可以通过控制其相序来实现旋转。树莓派可以通过GPIO引脚来控制步进电机的正反转。 步进电机有两种控制方式:单相和双相。单相控制方式比较简单,但是转速慢,精度较低。双相控制方式精度高,但是比较复杂。 以下是树莓派控制步进电机正反转的代码示例: ```python import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # 设置引脚编号方式为BCM # 设置步进电机的引脚 StepPins = [17, 18, 27, 22] # 设置引脚为输出模式 for pin in StepPins: GPIO.setup(pin, GPIO.OUT) # 定义正转函数 def forward(delay, steps): for i in range(steps): for pin in range(4): GPIO.output(StepPins[pin], Seq[step][pin]) time.sleep(delay) # 定义反转函数 def backward(delay, steps): for i in range(steps): for pin in range(4): GPIO.output(StepPins[pin], Seq[7-step][pin]) time.sleep(delay) # 定义步进电机的相序 Seq = [[1, 0, 0, 1], [1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1]] # 设置步进电机正反转的步数 steps = len(Seq) delay = 0.01 # 正转 for step in range(steps): forward(delay, 1) # 反转 for step in range(steps): backward(delay, 1) GPIO.cleanup() # 清除GPIO资源 ``` 在上述代码中,我们先定义了步进电机的引脚和相序,然后定义了正转和反转的函数。在正转和反转函数中,我们通过循环控制步进电机的相序,从而实现正反转。最后,我们调用正转和反转函数,控制步进电机的运动。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值