Riadenie krokového motorčeka I.: Rozdiel medzi revíziami
Z SensorWiki
(→Algoritmus a program) |
|||
Riadok 36: | Riadok 36: | ||
<tabs> | <tabs> | ||
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | <tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | ||
+ | |||
+ | |||
+ | |||
+ | /* | ||
+ | * 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; | ||
+ | } | ||
+ | /* | ||
+ | Program je navrhnutý tak, aby sa krokový motorček otáčal v smere a protismere hodinových ručičiek. Každý krok motorčeka má uhol 90°, preto sme hore zadefinovali for(int i = 0; i < 4; i++) | ||
+ | { | ||
+ | cw(pins); | ||
+ | PORTB = pins[i]; | ||
+ | _delay_ms(2000); | ||
+ | } | ||
+ | Pri každom pootočení bude svietiť jedna LEDka, pri samotnom cykle otáčania blikajú všetky | ||
+ | */ | ||
+ | |||
+ | |||
+ | |||
+ | /* | ||
+ | * Verzia kde povolávam točenie ako funkciu | ||
+ | */ | ||
+ | |||
+ | |||
+ | |||
+ | /* | ||
+ | * 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 <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) | 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; | ||
} | } | ||
+ | /* | ||
+ | Program je navrhnutý tak, aby sa krokový motorček otáčal v smere a protismere hodinových ručičiek. Každý krok motorčeka má uhol 90°, preto sme hore zadefinovali for(int i = 0; i < 4; i++) | ||
+ | { | ||
+ | cw(pins); | ||
+ | PORTB = pins[i]; | ||
+ | _delay_ms(2000); | ||
+ | } | ||
+ | Pri každom pootočení bude svietiť jedna LEDka, pri samotnom cykle otáčania blikajú všetky | ||
+ | */ | ||
+ | |||
+ | |||
+ | |||
+ | |||
</source></tab> | </source></tab> | ||
Riadok 63: | Riadok 259: | ||
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]] | Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]] | ||
− | |||
=== Overenie === | === Overenie === |
Verzia zo dňa a času 21:05, 6. jún 2023
Záverečný projekt predmetu MIPS / LS2023 - Meno Priezvisko
Zadanie
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
Riadenie krokového motorčeka
Literatúra:
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
Nezabudnite doplniť schému zapojenia!
Algoritmus a program
Algoritmus programu je....
/*
* 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;
}
/*
Program je navrhnutý tak, aby sa krokový motorček otáčal v smere a protismere hodinových ručičiek. Každý krok motorčeka má uhol 90°, preto sme hore zadefinovali for(int i = 0; i < 4; i++)
{
cw(pins);
PORTB = pins[i];
_delay_ms(2000);
}
Pri každom pootočení bude svietiť jedna LEDka, pri samotnom cykle otáčania blikajú všetky
*/
/*
* Verzia kde povolávam točenie ako funkciu
*/
/*
* 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;
}
/*
Program je navrhnutý tak, aby sa krokový motorček otáčal v smere a protismere hodinových ručičiek. Každý krok motorčeka má uhol 90°, preto sme hore zadefinovali for(int i = 0; i < 4; i++)
{
cw(pins);
PORTB = pins[i];
_delay_ms(2000);
}
Pri každom pootočení bude svietiť jedna LEDka, pri samotnom cykle otáčania blikajú všetky
*/
#include <avr/io.h>
void adc_init(void); // A/D converter initialization
unsigned int adc_read(char a_pin);
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.
Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.