Operácie

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)
 
{
 
{
  unsigned int measuredValue;
+
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);
 +
}
  
  while (1)
+
//v smere hodinových ručičiek
  {
+
void cw(char pins[])
    /*  relax  */ 
+
{
  }
+
for(int i = 0; i < 128; i++)
 +
{
 +
for(int j = 0; j < 4; j++)
 +
{
 +
OneStep(pins[j]);
 +
}
 +
}
 +
PORTB = 0x00;
 +
}
  
  return(0);
+
//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


Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...

RGB LED.

Nezabudnite doplniť schému zapojenia!

Schéma zapojenia LCD displeja.


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.

Aplikácia.

Video:

Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.