29-03-2021, 15:47
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. :
i dalej :
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):
Pozdrawiam.
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);
}
}
}