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

Контроллеры, драйверы, датчики, управляющие устройства.
AAN
Мастер
Сообщения: 305
Зарегистрирован: 14 апр 2015, 10:28
Репутация: 38
Настоящее имя: Антон
Откуда: Томск
Контактная информация:

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

Сообщение AAN »

Выкладываю код студенческой работы для МК pypoard lite 1.0 со стандартным экраном который:
-выдаёт на драйвер ШД импульсы dir с частотой, установленной и отображаемой на сенсорном экране.
- при увеличении уставки скорости ШД частоту импульсов наращивает плавно.
Pyboardlite10 управление ШД1.jpg (2887 просмотров) <a class='original' href='./download/file.php?id=166597&sid=64a570b1e4a62d83da96cb270d51374c&mode=view' target=_blank>Загрузить оригинал (835.53 КБ)</a>
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 и перезагрузить его.
Зерноед
Кандидат
Сообщения: 96
Зарегистрирован: 01 апр 2019, 15:02
Репутация: 29
Настоящее имя: Александр
Откуда: Курск
Контактная информация:

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

Сообщение Зерноед »

Удобная и полезная штуковина :good:
AAN
Мастер
Сообщения: 305
Зарегистрирован: 14 апр 2015, 10:28
Репутация: 38
Настоящее имя: Антон
Откуда: Томск
Контактная информация:

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

Сообщение AAN »

Это - всего-лишь демонстрация того, что может быстро сделать студент со способностями ниже средних, то есть где-то на уровне обычного пользователя - не профессионального программиста. Барьер вхождения в программирование МК сегодня низок, как никогда!
На той же pyboard с экраном (но уже с оптической развязкой) мы сделали управление 4-мя сервошаговыми моторами, 5кнопок, релейные входы-выходы (датчики, сигнализация), связь с по Modbas (поверх RS-485) с ПК и блоком аналогового ввода. Короче, систему управления станком. Но то решение я выкладывать не буду :silent:
Ответить

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