• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Skalowanie "czasu"
#1
Witam,chciałbym się dowiedzieć czy można skalować czas - "millis" po przez funkcje map i czy to jest w ogóle porwany tok myślenia. Chce uzyskać drobną regulację czasu załączania/wyłączania cewki zaworu w przedziale 0 - 400ms gdzie regulacja tego czasu odbywała by się przez potencjometr np. :

Kod:
zadanyCzas = analogRead(POT1);
zadanyCzas = map(zadanyCzas, 0,1023,0,400);   //czas w [ms]

i dalej :
Kod:
roznicaCzasu = aktualnyCzas - zapamietanyCzas;

if(roznicaCzasu >= zadanyCzas)  // coś tam się dzieje...

Wszystkie czasy są typu unsigned long.
Ogólnie to wgrałem na kontroler programik i w zasadzie po dłuższych obserwacjach uważam że to nie działa prawidłowo - jakaś zwłoka jest czasowa ale jakby dało się wyczuć że nie ma takiej powtarzalności tego załączania/wyłączania. Zwiększałem zakres przeskalowania np od 0 - 2000 i tez idzie odczuć że nie działa to tak jak bym chciał. I tu moje pytanie czy jest to prawidłowo ułożony warunek jeśli chodzi o "sterowanie czasem" i czy można to zrobić w jakiś lepszy sposób.

Kod programu(jest to prosty sterownik spawarki): 
Kod:
//DODAĆ JESZCZE BIBLIOTEKĘ NA WYŚWIETLACZ  I2C
//dopisać wyswietlanie trybu pracy i predkosci posuwu

#include <Bounce2.h>



#define LED 7                         // PD7-dioda sygnalizująca pracę IC
#define KONTROL 4                    // PD4-sprawdzanie stanu wysokiego niskiego GND
#define HAND 8                      //PB0-przycisk rączka
#define POT A1                     //ADC1-potencjometr regulujący posuw
#define POSUW 9                   //OC1A-sygnał pwm na silnik podajnika    
#define TRYB 2                   //PD2-przełacznik trybu pracy z 2T na 4T
#define TRIAK 10                //PB2-triak załączający transformator
#define POT1 A2                //ADC2-potencjometr regulujący CZAS wyprzedzenia otwarcia cewki zaworu
#define HAMULEC 14            //PC0-hamulec silnika posuwu - podanie 24V
#define ZAWOR 3              //PD3- cewka zaworu gazu

#define PREDKOSC_POSOWU     //prędkość podajnika drutu przeliczona 0-100%

Bounce przycisk_raczki = Bounce();
Bounce przelacznik_trybu_pracy = Bounce();

unsigned long aktualnyCzas =0;
unsigned long zapamietanyCzas =0;
unsigned long zadanyCzas;
unsigned long roznicaCzasu =0;

bool stan = false;

void setup() {

TCCR1B = TCCR1B & B11111000 | B00000001;

pinMode(LED,OUTPUT);
pinMode(HAND,INPUT_PULLUP);
pinMode(POT,INPUT);
pinMode(POSUW,OUTPUT);
pinMode(TRYB,INPUT_PULLUP);
pinMode(KONTROL,INPUT_PULLUP);
pinMode(TRIAK,OUTPUT);
pinMode(POT1,INPUT);        
pinMode(HAMULEC,OUTPUT);
pinMode(ZAWOR,OUTPUT);

  przycisk_raczki.attach(HAND);
  przycisk_raczki.interval(25);

  przelacznik_trybu_pracy.attach(TRYB);
  przelacznik_trybu_pracy.interval(30);

  digitalWrite(HAMULEC,HIGH);
  digitalWrite(ZAWOR,LOW);
  delay(40);

}

void loop() {
 
aktualnyCzas = millis();
int praca;

roznicaCzasu = aktualnyCzas - zapamietanyCzas;

//sprawdzanie stanu przycisków:
przycisk_raczki.update();
int przycisk = przycisk_raczki.read();

przelacznik_trybu_pracy.update();
int przelacznik = przelacznik_trybu_pracy.read();


//sprawdzenie czy IC "żyje" - jeśli na pinie KONTROL jest GND zapal diodę:
  if(digitalRead(KONTROL)== LOW)  {
  digitalWrite(LED,HIGH);
}
else
  digitalWrite(LED,LOW);
 


//przypisanie zmiennej "pwm" do wartosci odczytu z potencjometru
int pwm = analogRead(POT);
pwm = map(pwm,0,1023, 0,255);

//przypisanie zmiennej "zadanyCzas" do odczytu potencjometru POT1
zadanyCzas = analogRead(POT1);
zadanyCzas = map(zadanyCzas, 0,1023,0,400);   //czas w [ms]

//TRYB PRACY 2T:
if ((przycisk == LOW) && (przelacznik == HIGH) ) {
praca = 1;
} else {
praca = -1;
}


//TRYB PRACY 4T:
if(stan == true) {
  praca =1;
}
  if(przelacznik == HIGH) {
  stan = false;
  }

if ((przycisk_raczki.fell()) && (przelacznik == LOW)) {
stan=!stan;

 
//WARUNKI DLA ZMIENNEJ PRACA:

  if(praca > 0) {             //praca = 1;
  digitalWrite(ZAWOR,HIGH);
  //if(aktualnyCzas - zapamietanyCzas >= zadanyCzas) {
  if(roznicaCzasu >= zadanyCzas) {
  zapamietanyCzas = aktualnyCzas;
  digitalWrite(HAMULEC,LOW);
  digitalWrite(TRIAK,HIGH);
  analogWrite(POSUW,pwm);
  
  }


  else if(praca < 0) {            //praca = -1;
  digitalWrite(HAMULEC,HIGH); 
  analogWrite(POSUW,0);
  digitalWrite(TRIAK,LOW);
  //if(aktualnyCzas - zapamietanyCzas >= zadanyCzas){
  if(roznicaCzasu >= zadanyCzas) {
  zapamietanyCzas = aktualnyCzas;
  digitalWrite(ZAWOR,LOW);

   }
  }
 
}
Pozdrawiam.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości