Вариант управления ШД посредством Micropython

Контроллеры, драйверы, датчики, управляющие устройства.

Вариант управления ШД посредством Micropython

Сообщение AAN » 21 июл 2019, 08:19

Выкладываю код студенческой работы для МК pypoard lite 1.0 со стандартным экраном который:
-выдаёт на драйвер ШД импульсы dir с частотой, установленной и отображаемой на сенсорном экране.
- при увеличении уставки скорости ШД частоту импульсов наращивает плавно.
Вариант управления ШД посредством Micropython Pyboardlite10 управление ШД1.jpg


boot.py
Код: Выделить всёРазвернуть
import machine
import pyb
import math
import lcd160cr
from pyb import Pin
from pyb import Timer

pul = Pin('Y1', Pin.OUT)
pul.low()

gz = 0
gzOld = gz
gzNew = gz
factor = 1000
timPul = Timer(3, freq=1)
timProc = Timer(11, freq=1)
timCur = Timer(10, freq=2)
timAc = Timer(9, freq=3)

lcd = lcd160cr.LCD160CR('X')
lcd.set_orient(lcd160cr.PORTRAIT)
touch = False
x = 0
y = 0
chTou = False
keyAc = False

key_factor = False
flash_factor = False
flash = True
key_up = False
key_down = False
key_change = False
change = False
key_change_ok = False
key_change_cancel = False
key_ch = False


main.py
Код: Выделить всёРазвернуть
def serv(t):
if pul.value():
  pul.value(0)
else:
  pul.value(1)

def KeyAc(t):
global keyAc, gzOld, gzNew
if gzOld != gzNew: keyAc = True

def Accel():
global gzOld, gzNew
if gzOld == 0 and gzNew > gzOld:
  timPul.callback(serv)
if gzNew > gzOld:
  dif = math.sqrt(gzNew - gzOld) // 1
  gzOld = gzOld + int(dif)
  timPul.freq(gzOld)
else:
  gzOld = gzNew
  if gzOld == 0:
   timPul.callback(None)
  else:
   timPul.freq(gzOld)

def timFla(t):
global flash_factor, flash
if flash_factor: flash_factor = False
else: flash_factor = True
flash = True

def keyboardHandler(t):
global key_up, key_down, key_factor, key_change, key_change_ok, key_change_cancel, key_ch, gz, factor, chTou, x, y
if chTou:
  if x >= 85 and x <= 125 and y >= 45 and y <= 85: #Квадрат выбора цифры
   key_factor = True
  elif x >= 50 and x <= 80 and y >= 25 and y <= 55: #Квадрат плюса
    key_up = True
  elif x >= 50 and x <= 80 and y >= 75 and y <= 105: #Квадрат минуса
    key_down = True
  elif x >= 60 and x <= 140 and y >= 120 and y <= 160 and key_ch == False: #Квадрат изменения вращения
    key_change = True
    key_ch = True
  elif x >= 60 and x <= 140 and y >= 120 and y <= 160 and key_ch: #Квадрат принятия изменения вращения
    key_change_ok = True
    key_ch = False
  elif x >= 0 and x <= 40 and y >= 120 and y <= 160 and key_ch: #Квадрат отмены изменения вращения
    key_change_cancel = True
    key_ch = False
  chTou = False

def Gz(gz):
lcd.set_pos(0, 60)
txGz = str(int(gz))
while len(txGz) < 4:
  txGz = '0' + txGz
lcd.write(txGz)

def wrGz(gz):
lcd.set_text_color(lcd.rgb(255, 0, 0), lcd.rgb(0, 0, 0))
Gz(gz)

def wrAddGz(gz,add):
lcd.set_text_color(lcd.rgb(255, 255, 0), lcd.rgb(0, 0, 0))
Gz(gz)
if (gz + add) <= 5000:
  return gz + add
else:
  return 5000

def wrDifGz(gz,dif):
lcd.set_text_color(lcd.rgb(255, 255, 0), lcd.rgb(0, 0, 0))
Gz(gz)
if (gz - dif) >= 0:
  return gz - dif
else:
  return 0

def Factor():
global factor
if factor > 100:
  factor = factor // 10
else:
  factor = 1000

def Flash(change):
global flash_factor, flash, gz
if flash_factor and flash and change:
  flash = False
  wrGz(gz)
elif flash_factor == False and flash and change:
  flash = False
  wrFactor()

def wrTouch():
global x, y
check = False
if x >= 50 and x <= 80 and y >= 25 and y <= 55: check = True #Квадрат плюса
elif x >= 50 and x <= 80 and y >= 75 and y <= 105: check = True #Квадрат минуса
if check:
  lcd.set_text_color(lcd.rgb(255, 255, 0), lcd.rgb(0, 0, 0))
  Gz(gz)

def wrFactor():
lcd.set_pos(0, 60)
txGz = str(gz)
while len(txGz) < 4:
  txGz = '0' + txGz
for i in range(len(txGz)):
  lcd.set_text_color(lcd.rgb(255, 0, 0), lcd.rgb(0, 0, 0))
  if (10**(3-i)) == factor:
   lcd.set_text_color(lcd.rgb(255, 255, 0), lcd.rgb(0, 0, 0))
  lcd.write(txGz[i])

def rectCh():
lcd.rect(40, 120, 80, 40) #Квадрат изменения вращения
lcd.set_pos(45, 135)
lcd.write("Change")

def rectChOk():
lcd.rect(40, 120, 80, 40) #Квадрат изменения вращения
lcd.set_pos(45, 135)
lcd.write("  Ok  ")

def rectChCancel():
lcd.rect(0, 120, 40, 40) #Квадрат отмены
lcd.set_pos(3, 135)
lcd.write("Cnl")

def rectChCancelClear():
lcd.set_text_color(lcd.rgb(0, 0, 0), lcd.rgb(0, 0, 0))
lcd.set_pen(lcd.rgb(0, 0, 0), lcd.rgb(0, 0, 0))
lcd.rect(0, 120, 40, 40) #Квадрат отмены
lcd.set_pos(3, 135)
lcd.write("Cnl")
lcd.set_pen(lcd.rgb(255, 0, 0), lcd.rgb(0, 0, 0))

lcd.erase()
lcd.set_text_color(lcd.rgb(255, 0, 0), lcd.rgb(0, 0, 0))
lcd.set_pen(lcd.rgb(255, 0, 0), lcd.rgb(0, 0, 0))
lcd.set_font(1, scale=1, bold=0, trans=0, scroll=0)
lcd.rect(50, 25, 30, 30) #Квадрат плюса
lcd.set_pos(60, 35)
lcd.write('+')
lcd.rect(50, 75, 30, 30) #Квадрат минуса
lcd.set_pos(60, 85)
lcd.write('-')
lcd.rect(85, 45, 40, 40) #Квадрат выбора цифры
lcd.set_pos(100, 60)
lcd.write('>>')
rectCh() #Квадрат изменения вращения

wrGz(gz) #Отрисовка скорости вращения


timProc.callback(keyboardHandler)
timCur.callback(timFla)
timAc.callback(KeyAc)

try:
while True:
  touch = lcd.is_touched()

  if keyAc:
   keyAc = False
   Accel()
   if change == False: wrGz(gzOld)

  if touch:
   x = lcd.get_touch()[1]
   y = lcd.get_touch()[2]
   if change: wrTouch()
   touch = False
   chTou = True

  if key_factor and change:
   key_factor = False
   Factor()

  if key_up and change:
   key_up = False
   gz = wrAddGz(gz,factor)
   wrGz(gz)

  if key_down and change:
   key_down = False
   gz = wrDifGz(gz,factor)
   wrGz(gz)

  Flash(change)

  if key_change:
   change = True
   key_change = False
   rectChOk()
   rectChCancel()

  if key_change_ok:
   key_change_ok = False
   gzNew = gz
   change = False
   rectCh()
   rectChCancelClear()
   wrGz(gz)

  if key_change_cancel:
   key_change_cancel = False
   gz = gzOld
   change = False
   rectCh()
   rectChCancelClear()
   wrGz(gz)

finally:
lcd.erase()
lcd.set_pos(0, 0)
lcd.write('error')

для работы нужно только скопировать файлы через USB в pyboard и перезагрузить его.
AAN
Опытный
 
Сообщения: 151
Зарегистрирован: 14 апр 2015, 10:28
Откуда: Томск
Репутация: 31
Настоящее имя: Антон

Re: Вариант управления ШД посредством Micropython

Сообщение Зерноед » 21 июл 2019, 08:49

Удобная и полезная штуковина :good:
Завтра будет лучше, чем вчера, если зайти на сайт http://www.center-cnc.ru
Аватара пользователя
Зерноед
Кандидат
 
Сообщения: 57
Зарегистрирован: 01 апр 2019, 15:02
Откуда: Курск
Репутация: 23
Настоящее имя: Александр

Re: Вариант управления ШД посредством Micropython

Сообщение AAN » 21 июл 2019, 18:51

Это - всего-лишь демонстрация того, что может быстро сделать студент со способностями ниже средних, то есть где-то на уровне обычного пользователя - не профессионального программиста. Барьер вхождения в программирование МК сегодня низок, как никогда!
На той же pyboard с экраном (но уже с оптической развязкой) мы сделали управление 4-мя сервошаговыми моторами, 5кнопок, релейные входы-выходы (датчики, сигнализация), связь с по Modbas (поверх RS-485) с ПК и блоком аналогового ввода. Короче, систему управления станком. Но то решение я выкладывать не буду :silent:
AAN
Опытный
 
Сообщения: 151
Зарегистрирован: 14 апр 2015, 10:28
Откуда: Томск
Репутация: 31
Настоящее имя: Антон


Вернуться в Электроника

Кто сейчас на конференции

Зарегистрированные пользователи: Bender, Bing [Bot], Google [Bot], khramov_ks, Leo_1943, YaCy [Bot], Yandex [bot]

Reputation System ©'