Ik heb ook nog even gekeken naar de andere suggestie van @
Umbrah , die TMC2209 driver is ook een hele mooie. Die biedt naast de 'handmatige' aansturing ook de mogelijkheid om automatisch de snelheid te regelen.
Het 'nadeel' van de handmatige aansturing in de optie die ik noemde, is dat je voor elke stap die de motor zet (max. 1,8°, min. 0,056°) de STP-pin op de motor driver hoog en laag moet brengen. Met eenvoudige Arduino-code ben je dan enigszins beperkt in de maximale snelheid die je kan bereiken, maar vervelender is dat de vertraging tussen stappen inconsistent wordt als je programma ook nog andere zaken moet doen (zoals: controleren in welke modus de motor nu moet worden aangedreven, langzaam, snel, of variabel?), omdat de rest van het programma een extra vertraging in het programma toevoegt.
Nu zijn er meerdere wegen die naar Rome leiden.
Om te beginnen: als de maximale snelheid niet heel hoog is (in de orde van 1 tot enkele omwentelingen per seconde) en je doet verder vrij weinig in de rest van je code, dan is dit waarschijnlijk helemaal geen issue voor jou en kan je met Arduino en delayMicroseconds een voldoende consistente beweging mogelijk maken. Arduino is betrekkelijk traag, zo kost het hoog of laag zetten van 1 digitale uitgang ongeveer 4,5µs en tellen een aantal handelingen all gauw op tot enkele tientallen tot honderden microseconden aan processortijd. Om je een klein voorbeeldje te geven, deze code geeft dit als resultaat op de scope:
code:
1
2
3
4
5
6
7
8
9
| // the setup function runs once when you press reset or power the board
void setup() {
pinMode(3, OUTPUT);
}
void loop() {
digitalWrite(3, HIGH);
digitalWrite(3, LOW);
} |
Je ziet, een signaal met 50/50 verdeeld hoog/laag, en het duurt ongeveer 4,5µs om te wisselen tussen hoog en laag. Hier en daar zit soms een iets langer sprongetje van ongeveer 10µs, die komt eens in de 1ms voor, want dan is de Arduino bezig zijn eigen timer bij te werken (De Arduino houdt zelf het aantal milliseconden sinds deze is opgestart bij, dus eens per 1ms moet de Arduino deze teller bijwerken).
Maar als we iets meer in de code gaan doen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| uint32_t val = 0;
// the setup function runs once when you press reset or power the board
void setup() {
// Stel pin 3 in als uitgang
pinMode(3, OUTPUT);
}
void loop() {
digitalWrite(3, HIGH); // Zet de pin hoog
// Voer wat rekenoperaties uit
val = val + 3;
// Conditionele check
if (val % 10 == 0)
{
val = (val + 4) * 2;
}
digitalWrite(3, LOW); // Zet de pin laag
} |
Dan opeens is de pin voor zo'n 45µs hoog, en dan weer 4,5µs laag. Dus een paar kleine operaties kosten al best veel tijd als we op deze tijdschaal kijken. Maar als je een lage snelheid gebruikt, in de orde van 1 stap zetten per 1ms bijvoorbeeld, dan zal deze extra vertraging die door de rest van de code wordt veroorzaakt min of meer in het niet vallen, en hoef je daar geen rekening mee te houden.
Ga je echter met hogere snelheden werken (meerdere omwentelingen per seconde), dan kan het goed zijn dat je hiermee wel in de knoei komt. Dan zijn er twee opties waar ik nu zo snel aan kan denken waarmee je dit probleem omzeilt:
1. Gebruik een van de timers van de Arduino en pas port manipulation toe (direct de registers aansturen i.p.v. de abstraction layer van Arduino) om een behoorlijk exacte vertraging te verzorgen en de handeling van het aanpassen van de pin zo snel mogelijk uit te voeren, of...
2. Gebruik de interne pulsgenerator van de TMC2209 om het lastige werk voor je te doen.
Beide zijn goede opties. Optie 1 zou
mijn voorkeur hebben omdat dat ik niet bekend ben met de TMC2209 en wel bekend ben met de registers van Arduino en ik van mijzelf weet dat ik dit sneller in elkaar kan zetten dan ik de TMC2209 in huis kan hebben en de datasheet heb doorgespit. Anderzijds denk ik dat de TMC2209 een hele eenvoudige en zorgeloze oplossing kan als je het eenmaal door hebt. Maar ik wacht eerst even af wat de bedoeling is van je project en wat je precies nodig hebt voordat ik daar verder over uit ga wijden.
[
Voor 3% gewijzigd door
naarden 4ever op 24-10-2024 10:29
]