Ny på arduino.
Postat: 4 mars 2022, 19:58:39
Hejsan.
Sitter och experimenterar med en arduino som i framtiden skall styra en ACC i en bil.
Sitter just nu och kliar mig i huvudet gällande en exempel kod. (Inklistrad nedan.)
https://el.st/stegmotor.html
Jag är med på hur själva tilldelningen av pinnar fungerar och att man läser av en potentiometer i detta fallet på en analog ingång.
Men om man skulle vilja justera stegningen så den går dubbelt så fort. (Använder orginal spjällmotorer från en bil som jag lyckats köra med min Arduino. men det går ganska sakta.)
Jag tror detta ligger under "void setupInterrupt(int potValue)" men jag förstår inte hur det fungerar och vad de olika delarna gör
#define HALFSTEP 1
#define FULLSTEP 2
int stepMode = FULLSTEP;
int POT = 1; // Potentiometer (fart)
int IN1 = 8; // Blå - 28BYJ48 pin 1
int IN2 = 9; // Rosa - 28BYJ48 pin 2
int IN3 = 10; // Gul - 28BYJ48 pin 3
int IN4 = 11; // Orange - 28BYJ48 pin 4
int halfStep[8] = {
B01000,
B01100,
B00100,
B00110,
B00010,
B00011,
B00001,
B01001};
int fullStep[4] = {
B01000,
B00100,
B00010,
B00001};
int phase = 0;
int rotate = 1;
int potValue;
int lastPotValue;
void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
potValue = analogRead(POT);
setupInterrupt(potValue);
}
void setupInterrupt(int potValue)
{
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 16000 - abs(potValue-512)*30;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A);
sei();
}
ISR(TIMER1_COMPA_vect)
{
setOutput(phase);
phase += rotate;
if(stepMode == HALFSTEP)
{
phase%=8;
if(phase<0)
phase = 7;
}
if(stepMode == FULLSTEP)
{
phase%=4;
if(phase<0)
phase = 3;
}
potValue = analogRead(POT);
if(abs(potValue - lastPotValue) > 3)
{
Serial.println(potValue);
if(potValue>512)
rotate = 1;
else
rotate = -1;
lastPotValue = potValue;
setupInterrupt(potValue);
}
}
void setOutput(int out)
{
if(stepMode == HALFSTEP)
{
digitalWrite(IN1, bitRead(halfStep[out], 0));
digitalWrite(IN2, bitRead(halfStep[out], 1));
digitalWrite(IN3, bitRead(halfStep[out], 2));
digitalWrite(IN4, bitRead(halfStep[out], 3));
}
if(stepMode == FULLSTEP)
{
digitalWrite(IN1, bitRead(fullStep[out], 0));
digitalWrite(IN2, bitRead(fullStep[out], 1));
digitalWrite(IN3, bitRead(fullStep[out], 2));
digitalWrite(IN4, bitRead(fullStep[out], 3));
}
}
void loop()
{
}
Sitter och experimenterar med en arduino som i framtiden skall styra en ACC i en bil.
Sitter just nu och kliar mig i huvudet gällande en exempel kod. (Inklistrad nedan.)
https://el.st/stegmotor.html
Jag är med på hur själva tilldelningen av pinnar fungerar och att man läser av en potentiometer i detta fallet på en analog ingång.
Men om man skulle vilja justera stegningen så den går dubbelt så fort. (Använder orginal spjällmotorer från en bil som jag lyckats köra med min Arduino. men det går ganska sakta.)
Jag tror detta ligger under "void setupInterrupt(int potValue)" men jag förstår inte hur det fungerar och vad de olika delarna gör
#define HALFSTEP 1
#define FULLSTEP 2
int stepMode = FULLSTEP;
int POT = 1; // Potentiometer (fart)
int IN1 = 8; // Blå - 28BYJ48 pin 1
int IN2 = 9; // Rosa - 28BYJ48 pin 2
int IN3 = 10; // Gul - 28BYJ48 pin 3
int IN4 = 11; // Orange - 28BYJ48 pin 4
int halfStep[8] = {
B01000,
B01100,
B00100,
B00110,
B00010,
B00011,
B00001,
B01001};
int fullStep[4] = {
B01000,
B00100,
B00010,
B00001};
int phase = 0;
int rotate = 1;
int potValue;
int lastPotValue;
void setup()
{
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
potValue = analogRead(POT);
setupInterrupt(potValue);
}
void setupInterrupt(int potValue)
{
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 16000 - abs(potValue-512)*30;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A);
sei();
}
ISR(TIMER1_COMPA_vect)
{
setOutput(phase);
phase += rotate;
if(stepMode == HALFSTEP)
{
phase%=8;
if(phase<0)
phase = 7;
}
if(stepMode == FULLSTEP)
{
phase%=4;
if(phase<0)
phase = 3;
}
potValue = analogRead(POT);
if(abs(potValue - lastPotValue) > 3)
{
Serial.println(potValue);
if(potValue>512)
rotate = 1;
else
rotate = -1;
lastPotValue = potValue;
setupInterrupt(potValue);
}
}
void setOutput(int out)
{
if(stepMode == HALFSTEP)
{
digitalWrite(IN1, bitRead(halfStep[out], 0));
digitalWrite(IN2, bitRead(halfStep[out], 1));
digitalWrite(IN3, bitRead(halfStep[out], 2));
digitalWrite(IN4, bitRead(halfStep[out], 3));
}
if(stepMode == FULLSTEP)
{
digitalWrite(IN1, bitRead(fullStep[out], 0));
digitalWrite(IN2, bitRead(fullStep[out], 1));
digitalWrite(IN3, bitRead(fullStep[out], 2));
digitalWrite(IN4, bitRead(fullStep[out], 3));
}
}
void loop()
{
}