PWM servosignál (RC) a krokový motor
Napsal: 21 led 2019, 00:06
Řešil jste někdo řízení (směr a otáčky) malého krokového motoru klasickým servosignálem PWM (50Hz, impulzy o šířce 1,0-2,0ms)?
České fórum pro všechny nadšence do Arduina a dalších technologií.
https://forum.hwkitchen.cz/
Dik za odkaz, koukam ze jsem dosel skoro k tomu samemu, jen jsem nevedel ze jdou prirazovat preruseni v programu; ja mam preruseni na CHANGES a pak testuju jestli je 0 nebo 1... Tohle si hned vyzkousim, to pak bude uplne super
Kód: Vybrat vše
// impulzy pro step driver @ Arduino nano
// rizeni otaceni veze tanku RC impulzy PWM
namespace {
byte pin_krok = 12; // pin STEP
byte pin_smer = 11; // pin DIR
byte inp_PWM = 2; // pin PWM in
int hystereze = 40;
int neutral_uS = 1500;
long int pauza_mS;
int cislo;
byte smer;
long int inp_uS = 1500;
long int new_uS;
long int aktual_uS;
int min_mS = 2;
int max_mS = 400;
// long int aktual_poz = 0;
long int ne_h_uS;
long int neah_uS;
long int max_min_mS;
}
void setup() {
pinMode(pin_krok, OUTPUT); // signál STEP
pinMode(pin_smer, OUTPUT); // signál DIR
pinMode(inp_PWM, INPUT_PULLUP);
pinMode(10, OUTPUT);
digitalWrite(10, HIGH);
// aktual_poz = 0;
// Serial.begin(115200);
ne_h_uS = neutral_uS - hystereze;
neah_uS = neutral_uS + hystereze;
max_min_mS = max_mS + min_mS;
delay(500);
attachInterrupt(0, ctipuls, CHANGE);
}
void loop() {
if (inp_uS < ne_h_uS){
cislo = map(inp_uS, ne_h_uS, 892, min_mS, max_mS);
smer = 0;
}
if (inp_uS > neah_uS){
cislo = map(inp_uS, neah_uS, 2076, min_mS, max_mS);
smer = 1;
}
pauza_mS = max(min_mS, max_min_mS - cislo);
if (inp_uS > neah_uS or inp_uS < ne_h_uS) krok();
// tisk();
delay(pauza_mS);
}
void krok() {
digitalWrite(pin_smer, smer);
digitalWrite(pin_krok, HIGH);
delayMicroseconds(8);
digitalWrite(pin_krok, LOW);
// if (smer == 1) aktual_poz--;
// if (smer == 0) aktual_poz++;
}
void ctipuls() {
if (digitalRead(inp_PWM) == HIGH) {
new_uS = micros();
}
else if (digitalRead(inp_PWM) == LOW) {
aktual_uS = micros();
new_uS = aktual_uS - new_uS;
}
if (new_uS > 900 and new_uS < 2100) inp_uS = new_uS - 12; // osetreni delky
}
void tisk() {
Serial.print(inp_uS);
Serial.print(" ");
Serial.println(pauza_mS);
}