Zdravim,
potrebuju v Arduinu zkracovat impulzy.
Na vstup mi prijde impulz, napr. 10ms ja ho potrebuju zkratit o vzdy stejnou hodnotu - napr. 20% a nastavit na vystup.
Takze vstup bude zapnuty 10ms a vystup bude zapnuty 8ms. Problem je, ze delka vstupu se meni, klidne tam muze byt treba 100ms a ja pak musim nastavit 80ms na vystup.
Arduino neumi (aspon tedy nevim jak) vice vlaken.
Kdyz pouziju nasledujici typ kodu:
int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
Tak zapnu vystup a na stanovenou dobu zastavim cely program a pak teprve pokracuji, coz je nepripustne.
Napadlo me udelat nejaky casovac napr 1 mikrosekunda a vzdy ho zvetsovat o 1. U prodlouzeni pulzu si myslim, ze by problem nebyl. Jak ale vyresim zkraceni?
Zatim jsem napsal:
const byte in = 7; // namapovani pinu na I/O procesoru
const byte out = 8;
unsigned long minuly;
unsigned long casovacIn = 0;
unsigned long casovacOut = 0;
boolean inStav = 0;
byte konstanta = 20; // 20%
void setup() {
pinMode(in, INPUT); // nataveni funkce pinu
pinMode(out, OUTPUT);
}
void loop() {
if (in == HIGH) {
inStav = true;
casovacIn++;
} else {
minuly = casovacIn;
inStav = false;
casovacIn = 0;
}
if (inStav && (minuly*konstanta/10) < casovacOut) {
casovacOut++;
digitalWrite(out, HIGH);
} else {
casovacOut = 0;
digitalWrite(out, LOW);
}
delayMicroseconds(1);
}
Je to dobry postup? Jak byste to resili vy?
Dekuji za pomoc!