Pomůžete s převodem programu z arduina do attiny45?
Napsal: 07 bře 2020, 15:48
Potřeboval jsem miniaturizovat řízení krokového motoru. Momentálně tam mám arduino nano a řadič pro krokový motor s ULN 2003A (tento...).
Tak nějak jsem si myslel, že dám na jednu desku ATTINY45 a ULN2003A, nahraju do attiny přes ArduinoISP ten samý program a mám vyřešeno...
Bohužel to nefunguje...
Problém č. 1 - úplně jiné časování...
Tam kde mám u Arduina čekaci smyčku Delay(1250) tak u attiny musím pro přibližně stejnou frekvenci pulsů pro motor dát jen Delay(3). Protože jak jsem se dočetl Arduino má výchozí takt 16MHz a attiny jen 1Mhz, tak jsem mu v arduinoIDE před kompilací nastavil interní hodiny na 16Mhz a časy byly ještě delší! V čem je zádrhel?
Problém č. 2 - jiný tvar signálu - přestože program je úplně stejný, tam kde má arduino tvar impulsu střídavě široký a úzký (řízení jedné fáze motoru) tak má attiny více méně impulz 50/50 furt stejný (možná to bude mít stejnou příčinu jako problém č. 1).
Program pro attiny:
Program pro Arduino
Tak nějak jsem si myslel, že dám na jednu desku ATTINY45 a ULN2003A, nahraju do attiny přes ArduinoISP ten samý program a mám vyřešeno...
Bohužel to nefunguje...
Problém č. 1 - úplně jiné časování...
Tam kde mám u Arduina čekaci smyčku Delay(1250) tak u attiny musím pro přibližně stejnou frekvenci pulsů pro motor dát jen Delay(3). Protože jak jsem se dočetl Arduino má výchozí takt 16MHz a attiny jen 1Mhz, tak jsem mu v arduinoIDE před kompilací nastavil interní hodiny na 16Mhz a časy byly ještě delší! V čem je zádrhel?
Problém č. 2 - jiný tvar signálu - přestože program je úplně stejný, tam kde má arduino tvar impulsu střídavě široký a úzký (řízení jedné fáze motoru) tak má attiny více méně impulz 50/50 furt stejný (možná to bude mít stejnou příčinu jako problém č. 1).
Program pro attiny:
Kód: Vybrat vše
// Sketch for Arduino and
// 28BYJ-48, using a ULN2003 interface board to drive the stepper.
// Adapted by Mallinson-electrical
//declare variables for the motor pins
int motor2Pin1 = 2; // Attiny pin 7 to In 1 on the ULN2003
int motor2Pin2 = 1; // Attiny pin 6 to In 2 on the ULN2003
int motor2Pin3 = 0; // Attiny pin 5 to In 3 on the ULN2003
int motor2Pin4 = 4; // Attiny pin 3 to In 4 on the ULN2003
// supply power to + and - from Arduino 5vdc and gnd
int motorSpeed = 3; // set speed of 28BYJ-48 stepper,
//max frequency is 100hz, so max speed is 1250
//(100 steps per second 8 pulses per step so 10000 divided by 8)
// 1250 equates to apx 6 seconds per rev
int count = 0; // count of steps made
int countsperrev = 256; // number of steps per full revolution- actually 509.5 as gear ratio is 63.684:1 apx
int revolutionsCW = 1; // number of revs required clockwise
int revolutionsCCW = 1; // number of revs required counterclockwise
int lookup[8] = {B01001, B00001, B00011, B00010, B00110,B00100,B01100, B01000};
int setTurnsCW = (revolutionsCW * countsperrev);
int setTurnsCCW = (revolutionsCCW * countsperrev);
void setup() {
//declare the motor pins as outputs
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
pinMode(motor2Pin3, OUTPUT);
pinMode(motor2Pin4, OUTPUT);
}
void loop(){
for(count = 0; count < setTurnsCW; count++) {
clockwise2();
}
delay(10);
for(count = 0; count < setTurnsCW; count++) {
anticlockwise2();
}
delay(10);
}
void anticlockwise2()
{
for(int i = 0; i < 8; i++) // 8 pulses
{
setOutput2(i);
delay(motorSpeed);
}
}
void clockwise2()
{
for(int i = 7; i >= 0; i--) // 8 pulses
{
setOutput2(i);
delay(motorSpeed);
}
}
void setOutput2(int out)
{
digitalWrite(motor2Pin1, bitRead(lookup[out], 0));
digitalWrite(motor2Pin2, bitRead(lookup[out], 1));
digitalWrite(motor2Pin3, bitRead(lookup[out], 2));
digitalWrite(motor2Pin4, bitRead(lookup[out], 3));
}
Program pro Arduino
Kód: Vybrat vše
int motor2Pin1 = 5; // Arduino pin 8 to In 1 on the ULN2003
int motor2Pin2 = 6; // Arduino pin 9 to In 2 on the ULN2003
int motor2Pin3 = 7; // Arduino pin 10 to In 3 on the ULN2003
int motor2Pin4 = 8; // Arduino pin 11 to In 4 on the ULN2003
// supply power to + and - from Arduino 5vdc and gnd
int motorSpeed = 1250; // set speed of 28BYJ-48 stepper,
//max frequency is 100hz, so max speed is 1250
//(100 steps per second 8 pulses per step so 10000 divided by 8)
// 1250 equates to apx 6 seconds per rev
int count = 0; // count of steps made
int countsperrev = 510; // number of steps per full revolution- actually 509.5 as gear ratio is 63.684:1 apx
int revolutionsCW = 1; // number of revs required clockwise
int revolutionsCCW = 1; // number of revs required counterclockwise
int lookup[8] = {B01001, B00001, B00011, B00010, B00110,B00100,B01100, B01000};
int setTurnsCW = (revolutionsCW * countsperrev);
int setTurnsCCW = (revolutionsCCW * countsperrev);
void setup() {
//declare the motor pins as outputs
pinMode(motor2Pin1, OUTPUT);
pinMode(motor2Pin2, OUTPUT);
pinMode(motor2Pin3, OUTPUT);
pinMode(motor2Pin4, OUTPUT);
}
void loop(){
for(count = 0; count < setTurnsCW; count++) {
clockwise2();
}
for(count = 0; count < setTurnsCW; count++) {
anticlockwise2();
}
void anticlockwise2()
{
for(int i = 0; i < 8; i++) // 8 pulses
{
setOutput2(i);
delayMicroseconds(motorSpeed);
}
}
void clockwise2()
{
for(int i = 7; i >= 0; i--) // 8 pulses
{
setOutput2(i);
delayMicroseconds(motorSpeed);
}
}
void setOutput2(int out)
{
digitalWrite(motor2Pin1, bitRead(lookup[out], 0));
digitalWrite(motor2Pin2, bitRead(lookup[out], 1));
digitalWrite(motor2Pin3, bitRead(lookup[out], 2));
digitalWrite(motor2Pin4, bitRead(lookup[out], 3));
}