Pages: [1]   Go Down
Author Topic: Accelerazione motore passo passo  (Read 670 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve amici forumisti, vi ringrazio innanzitutto per l'aiuto che mi avete già dato nell'altro mio topic con i vostri preziosi suggermenti.

Adesso avrei un altro problema più di natura "Software" stavolta...

Vi spiego brevemente quello che dovrei realizzare.
Il mio obiettivo è quello di costruire un Dip-coater, cioè uno strumento che permette di immergere meccanicamente dei campioni in una soluzione per depositarvi sopra un film sottile.
A tale scopo mi sono servito come vi dicevo di un motorino passo passo recuperato da un vecchio lettore CD, per avere già pronta la slitta che fa scorrere il tutto e non avere quindi problemi meccanici.

I parametri che mi occorre potere settare sono la velocità iniziale di estrazione e la decelerazione in risalita che serve ad ottenere spessori del film uniformi e tali parametri devo poterli visualizzare su un display LCD in mm/s ed in mm/s^2.

Il programma che ho elaborato è il seguente e funziona tutto alla perfezione:

#include <LiquidCrystal.h>

#define SCENDI 2  
#define   SALI 3

LiquidCrystal lcd(12, 13, 7, 6, 5, 4);

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int speedPinPot = 0;
int decelPinPot = 1;
int i = 0;
int down = 0;
int up = 0;
int stop = 0;
int downDelayTime = 2;  
double upDelayTime;
double decelFactor;

void setup() {      
  pinMode(SCENDI, INPUT);  
  pinMode(SALI, INPUT);
  pinMode(motorPin1, OUTPUT);  
  pinMode(motorPin2, OUTPUT);  
  pinMode(motorPin3, OUTPUT);  
  pinMode(motorPin4, OUTPUT);
  pinMode(speedPinPot, INPUT);
  pinMode(decelPinPot, INPUT);
  lcd.begin(20, 2);
  lcd.print("Vel.iniz.");
  lcd.setCursor(16, 0);
  lcd.print("mm/s");
  lcd.setCursor(0, 1);
  lcd.print("Deceler.");
  lcd.setCursor(15, 1);
  lcd.print("mm/s");
}  

void loop() {  
  int speedReadPin = analogRead(speedPinPot);
  upDelayTime = (map(speedReadPin, 0, 1024, 10000, 150000)/1000.);
  double velocita = (1000./upDelayTime)*0.226;
  int decelReadPin = analogRead(decelPinPot);
  decelFactor = (map(decelReadPin, 0, 1024, 0, 1000)/1000.);
  double decelerazione = (?);
  lcd.setCursor(10, 0);
  if (velocita < 10)
    lcd.print(" ");
  lcd.print(velocita);
  lcd.setCursor(10, 1);
  lcd.print(decelerazione);
  down = digitalRead(SCENDI);    
  up = digitalRead(SALI);
    if (down == HIGH)
      scendi();        
    if (up == HIGH)  
      sali();    
}  

void scendi() {  
  if(!stop) {
  digitalWrite(motorPin1, LOW);  
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);  
  digitalWrite(motorPin4, LOW);  
  delay(downDelayTime);  
  digitalWrite(motorPin1, LOW);  
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);  
  digitalWrite(motorPin4, HIGH);  
  delay(downDelayTime);  
  digitalWrite(motorPin1, HIGH);  
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);  
  digitalWrite(motorPin4, HIGH);  
  delay(downDelayTime);  
  digitalWrite(motorPin1, HIGH);  
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);  
  digitalWrite(motorPin4, LOW);  
  delay(downDelayTime);
  i++;
  if (i > 40)
    stop = 1;
    }
}  

void sali() {  
  stop = 0;
  int j = i;
  while(i>0){
  digitalWrite(motorPin1, HIGH);  
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);  
  digitalWrite(motorPin4, LOW);  
  delay(upDelayTime + decelFactor*(j-i));
  digitalWrite(motorPin1, HIGH);  
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);  
  digitalWrite(motorPin4, HIGH);  
  delay(upDelayTime + decelFactor*((j-i)-1));  
  digitalWrite(motorPin1, LOW);  
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);  
  digitalWrite(motorPin4, HIGH);  
  delay(upDelayTime + decelFactor*((j-i)-2));  
  digitalWrite(motorPin1, LOW);  
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);  
  digitalWrite(motorPin4, LOW);  
  delay(upDelayTime + decelFactor*((j-i)-3));  
  i--;
  }
}

Il problema che non riesco a risolvere è effettuare in qualche modo una conversone tra il tempo di ritardo crescente che ho imposto tra un passo ed il successivo del motorino ela decelerazione espressa in mm/s^2 da visulaizzare sul display, dove per ora visualizzo semplicemente la variabile che ho chiamato decelFactor...
inoltre avrei la necesità che questa accelerazione fosse costante mentre per come ho realizzato il programma io temo che questa non sia costante...
C'è qualcuno che potrebbe darmi una mano per favore?
GRAZIE
« Last Edit: December 03, 2012, 10:36:11 am by leandro78 » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
potresti editare il tuo messaggio e includere il codice tra i tag [code ]?
Li trovi premendo il simbolo # sopra le faccine.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1505
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Secondo me avresti bisogno di calcolare il tempo totale di risalita.

La Velocità è Spazio percorso diviso Tempo, mentre l'Accelerazione è variazione di Velocità diviso Tempo.

Se l'Accelerazione deve essere costante durante la risalita, una volta calcolato il Tempo totale di risalita, il calcolo della accelerazione è Velocità Risalita Finale meno Velocità Risalita Iniziale il tutto diviso Tempo Risalita: poiché la velocità iniziale è 0, il tutto si riduce a dividere la Velocità Finale per il Tempo di Risalita.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7194
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per conoscere lo spazio percorso devi conoscere lo spostamento compiuto dalla slitta in un giro completo del motore.
Poi lo dividi per i passi.
Se conosci il tempo di esecuzione di un passo potrai risalire alla velocità istantanea.
Prova quindi prima a muovere la slitta a velocità costante visualizzando il dato sul LCD.
In seguito potrai variare il valore della velocità calcolandoti quindi l'accelerazione.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: