Riadenie krokového motorčeka I.: Rozdiel medzi revíziami
Zo stránky SensorWiki
(25 medziľahlých úprav od jedného ďalšieho používateľa nie je zobrazených) | |||
Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu MIPS / LS2023 - ''' | Záverečný projekt predmetu MIPS / LS2023 - '''Martin Cíbik''' | ||
== Zadanie == | == Zadanie == | ||
zadanie č. 47: | |||
Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90° | |||
Mám naprogramovať riadenie krokového motorčeka pre posun o 90° v smere aj v protismere hodinových ručičiek. | |||
Riadenie [https://www.laskakit.cz/radic-uln2003-pro-krokovy-motor/ krokového motorčeka] | Riadenie [https://www.laskakit.cz/radic-uln2003-pro-krokovy-motor/ krokového motorčeka] | ||
[[Obrázok: | [[Obrázok:Arduino uno.jpg|400px|thumb|center|Vývojová doska Arduino UNO.]] | ||
'''Literatúra:''' | '''Literatúra:''' | ||
* [ | *[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf Dokumentácia k doske Arduino UNO] | ||
* [ | *[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Dokumentácia k ATmega328p] | ||
Riadok 20: | Riadok 23: | ||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
Zapojil som si motorček podľa tejto schémy(lepší obrázok som nenašiel). | |||
[[Súbor:Schema_zapojenia.png|400px|thumb|center|Schéma zapojenia Krokového motorčeka.]] | |||
Potrebujem nasledovné súčiastky: Arduino UNO doska, krokový motorček, 6x káblik typu samička-samček, pinová doska so švábom | |||
=== Algoritmus a program === | |||
Riadok 44: | Riadok 45: | ||
* Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90° | * Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90° | ||
* Author: Martin Cíbik | * Author: Martin Cíbik | ||
*/ | */ | ||
#define F_CPU 16000000UL | #define F_CPU 16000000UL | ||
Riadok 122: | Riadok 124: | ||
PORTB = 0x00; | PORTB = 0x00; | ||
} | } | ||
</source></tab> | |||
<tab name="AVR C-code s povolávaním funkcie"><source lang="c++" style="background: LightYellow;"> | |||
Riadok 146: | Riadok 139: | ||
* Author: Martin Cíbik | * Author: Martin Cíbik | ||
*/ | */ | ||
#define F_CPU 16000000UL | #define F_CPU 16000000UL | ||
Riadok 232: | Riadok 226: | ||
PORTB = 0x00; | PORTB = 0x00; | ||
} | } | ||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|Zdrojové súbory Martin Cíbik.zip]] | |||
=== Overenie === | |||
Po zapojení sa motorček začne otáčať. Po 90° zastaví a počká 2 sekundy. To sa zopakuje 4x a nastane otáčanie v opačnom smere. Tak isto o 90° a počká (tiež 4x). | |||
V prípade povolávania funkcie, treba na do funkcie void loop() zadať koľko krát chceme aby sa otočilo (dal som 10 otočení), ale funguje v rovnakom princípe. | |||
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]] | [[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]] | ||
'''Video:''' | '''Video:''' | ||
<center><youtube>6TpmggueZVk</youtube></center> | |||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Aktuálna revízia z 11:58, 8. jún 2023
Záverečný projekt predmetu MIPS / LS2023 - Martin Cíbik
Zadanie
zadanie č. 47: Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90°
Mám naprogramovať riadenie krokového motorčeka pre posun o 90° v smere aj v protismere hodinových ručičiek.
Riadenie krokového motorčeka
Literatúra:
Analýza a opis riešenia
Zapojil som si motorček podľa tejto schémy(lepší obrázok som nenašiel).
Potrebujem nasledovné súčiastky: Arduino UNO doska, krokový motorček, 6x káblik typu samička-samček, pinová doska so švábom
Algoritmus a program
/*
* semestralny_projekt.c
* zadanie č. 47: krokový motorček
* Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90°
* Author: Martin Cíbik
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
void loop(bool dir, char pins[]);
void cw(char c[]);
void ccw(char pins[]);
void OneStep(char pin);
int main(void)
{
DDRB |= 0B00011110;
char pins[] = {0x10, 0x08, 0x04, 0x02}; // zadefinované piny
while (1)
{
loop(true, pins); // v smere hodinových ručičiek
loop(false, pins); //v protismere hodinových ručičiek
}
}
void loop(bool dir, char pins[])
{
if (dir)
{
for(int i = 0; i < 4; i++)
{
cw(pins);
PORTB = pins[i];
_delay_ms(2000);
}
}
else
{
for(int i = 3; i >= 0; i--)
{
ccw(pins);
PORTB = pins[i];
_delay_ms(5000);
}
}
}
// void loop - zadefinovanie otáčania motorčeka, jeho rýchlosť atď
void OneStep(char pin)
{
PORTB = pin;
_delay_ms(10);
}
//v smere hodinových ručičiek
void cw(char pins[])
{
for(int i = 0; i < 128; i++)
{
for(int j = 0; j < 4; j++)
{
OneStep(pins[j]);
}
}
PORTB = 0x00;
}
//v protismere hodinových ručičiek
void ccw(char pins[])
{
for(int i = 0; i < 128; i++)
{
for(int j = 4; j > 0; j--)
{
OneStep(pins[j]);
}
}
PORTB = 0x00;
}
/*
* semestralny_projekt.c
* zadanie č. 47: krokový motorček
* Krokový motorček - pohyb v smere a v protismere hodinových ručičiek po 90°
* Author: Martin Cíbik
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
void loop(bool dir, char pins[]);
void cw(char c[]);
void ccw(char pins[]);
void OneStep(char pin);
void loopRotate(bool dir, char pins[], int times);
int main(void)
{
DDRB |= 0B00011110;
char pins[] = {0x10, 0x08, 0x04, 0x02}; // zadefinované piny
while (1)
{
loop(true, pins); // v smere hodinových ručičiek
loop(false, pins); //v protismere hodinových ručičiek
}
}
void loop(bool dir, char pins[])
{
loopRotate(dir, pins, 10); //loopRotate(dir, pins, POČET ROTÁCIÍ O 90°)
}
// void loop - zadefinovanie otáčania motorčeka, jeho rýchlosť atď
void loopRotate(bool dir, char pins[], int times)
{
for(int t = 0; t < times; t++)
{
if (dir)
{
for(int i = 0; i < 4; i++)
{
cw(pins);
PORTB = pins[i];
_delay_ms(2000);
}
}
else
{
for(int i = 3; i >= 0; i--)
{
ccw(pins);
PORTB = pins[i];
_delay_ms(2000);
}
}
}
}
void OneStep(char pin)
{
PORTB = pin;
_delay_ms(10);
}
//v smere hodinových ručičiek
void cw(char pins[])
{
for(int i = 0; i < 128; i++)
{
for(int j = 0; j < 4; j++)
{
OneStep(pins[j]);
}
}
PORTB = 0x00;
}
//v protismere hodinových ručičiek
void ccw(char pins[])
{
for(int i = 0; i < 128; i++)
{
for(int j = 4; j > 0; j--)
{
OneStep(pins[j]);
}
}
PORTB = 0x00;
}
Zdrojový kód: Zdrojové súbory Martin Cíbik.zip
Overenie
Po zapojení sa motorček začne otáčať. Po 90° zastaví a počká 2 sekundy. To sa zopakuje 4x a nastane otáčanie v opačnom smere. Tak isto o 90° a počká (tiež 4x).
V prípade povolávania funkcie, treba na do funkcie void loop() zadať koľko krát chceme aby sa otočilo (dal som 10 otočení), ale funguje v rovnakom princípe.
Video: