使用python程序通过传感器反馈读取进行步进电机速度控制

时间:2019-02-28 17:29:44

标签: python sensor stepper

对于一个科学项目,我想控制一个步进驱动的气泵。我的主要目标是相对于压力传感器读数来调节步进速度,以便可以在容器中保持恒定的压力水平。此时,我能够以恒定的速度驱动步进电机,从而在容器中建立压力,并且可以通过MCP3008 ADC和python程序通过树莓派中的Honeywell压力传感器读取容器中的压力水平。 下面是用于步进运行和压力读取的系统和python代码的简要示意图。

我想要的是

第一种情况:当容器中的压力为零时,我要以最高速度运行步进器,以便在压力水平接近所需压力时可以快速达到所需压力。达到最高压力极限时,步进速度应降低并停止。

第二种情况::从容器释放压力时,步进器应自动启动以保持所需的压力,类似于上面的方式。

作为来自传感器的传感器反馈机制,如何做到这一点?有什么办法可以通过python程序做到这一点?任何建议都非常欢迎。 并预先感谢您...

其他信息:

  • 我没有将Easy Driver中的DIRECTION针用作反向旋转 对我来说不是必需的。
  • 我想要的以伏特为单位的压力是3 V 当它低于2.5 V时,我希望缓慢启动步进器 当它下降到2 V时,我要完全运行步进器 速度,以便可以快速保持压力。
  • 我可以通过在STEP引脚ON-OFF中更改睡眠时间来更改步进速度(恒定速度)

Schematic

Python代码

#!/usr/bin/python

import spidev
import time
import os
import RPi.GPIO as GPIO
import _thread

# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz=1000000

#Stepper pin setup
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO_pins = (6, 13)
step = 19

GPIO.setup(step, GPIO.OUT)
GPIO.setup(GPIO_pins, GPIO.OUT)
GPIO.output(GPIO_pins, False)

# Function to read SPI data from MCP3008 chip
# Channel must be an integer 0-7

def ReadChannel(channel):
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data

# Function to convert data to voltage level,
# rounded to specified number of decimal places. 

def ConvertVolts(data,places):
  volts = (data * 3.3) / float(1023)
  volts = round(volts,places)  
  return volts

# Define sensor channels
pressure_channel = 0

# Define delay between readings
delay = 1

def SensorRead():
    while True:
        # Read the pressure sensor data
        pressure_level = ReadChannel(pressure_channel)
        pressure_volts = ConvertVolts(pressure_level,2)

        # Print out results
        print ("--------------------------------------------")
        print("pressure : {} ({}V)".format(pressure_level,pressure_volts))

        # Wait before repeating loop
        time.sleep(delay)

def StepperRun():
     while True:
         # Stepper run
         GPIO.output(step, False)
         time.sleep(.008)
         GPIO.output(step, True)
         time.sleep(.008)
         GPIO.cleanup

_thread.start_new_thread(SensorRead, ())
_thread.start_new_thread(StepperRun, ())

0 个答案:

没有答案