Cours:TPS 2103 tp miniqv2 : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
 
Ligne 2 : Ligne 2 :
  
 
[[Cours:TPS_2103_tp_miniqv2_corrige|{{Vert|<big>'''Éléments de correction'''</big>}}]]
 
[[Cours:TPS_2103_tp_miniqv2_corrige|{{Vert|<big>'''Éléments de correction'''</big>}}]]
 +
 +
={{Rouge|moteur !}}=
 +
 +
Cette partie ayant été étudiée en TD, on partira du code suivant :
 +
 +
<source lang=c>
 +
#include <avr/io.h>
 +
#include <util/delay.h>
 +
 +
// prototype des fonctions
 +
void initMoteur();
 +
inline void setVitesse (int8_t, int8_t) __attribute__((always_inline));
 +
inline void setMoteurG (int8_t) __attribute__((always_inline));
 +
inline void setMoteurD (int8_t) __attribute__((always_inline));
 +
 +
#define topPWM 100    // la vitesse des moteurs varie de -topPWM à topPWM
 +
 +
int main()
 +
{
 +
initMoteur();
 +
while(1)
 +
{
 +
}
 +
}
 +
 +
void initMoteur()
 +
{
 +
DDRD |= (1<<PD7) | (1<<PD6);
 +
DDRE |= 1<<PE6;
 +
DDRC |= 1<<PC6;
 +
TCCR4B |= (1<<PWM4X)                              // inverse les sortie OCRxA et OCRxA/
 +
|(1<<CS42)|(1<<CS41)|1<<CS40;            // prédiviseur
 +
TCCR4A |= (1<<PWM4A) | (1<<COM4A0);                // PWM sur COM4A/
 +
TCCR4C |= (1<<PWM4D) | (1<<COM4D0) | (1<<COM4D1);  // PWM sur COM4D
 +
TC4H=0;
 +
OCR4C=topPWM;                                      // valeur max PWM -> fmli = fq / (topPWM * prediv )
 +
}
 +
 +
void setVitesse(int8_t vG, int8_t vD)
 +
{
 +
setMoteurD(vD);
 +
setMoteurG(vG);
 +
}
 +
 +
void setMoteurG(int8_t vit)
 +
{
 +
if (vit<0)
 +
{
 +
vit = -vit;
 +
PORTD |= (1<<PD6);
 +
}
 +
else PORTD &=~ (1<<PD6);
 +
if (vit>topPWM) vit=topPWM;
 +
OCR4A = vit;
 +
}
 +
 +
void setMoteurD(int8_t vit)
 +
{
 +
if (vit<0)
 +
{
 +
vit = -vit;
 +
PORTE |= (1<<PE6);
 +
}
 +
else PORTE &=~ (1<<PE6);
 +
if (vit>topPWM) vit=topPWM;
 +
OCR4D = vit;
 +
}
 +
</source>
 +
 +
{{Question|Utiliser ces fonctions pour que la trajectoire du robot soit un cercle}}
 +
 +
{{Question|Comment faire varier le rayon du cercle ?}}

Version du 16 mai 2016 à 10:58

Retour à la liste des Tps

Éléments de correction

moteur !

Cette partie ayant été étudiée en TD, on partira du code suivant :

#include <avr/io.h>
#include <util/delay.h>

// prototype des fonctions
void initMoteur();
inline void setVitesse (int8_t, int8_t) __attribute__((always_inline));
inline void setMoteurG (int8_t) __attribute__((always_inline));
inline void setMoteurD (int8_t) __attribute__((always_inline));

#define topPWM 100    // la vitesse des moteurs varie de -topPWM à topPWM

int main()
{
	initMoteur();
	while(1)
	{
	}
}

void initMoteur()
{
	DDRD |= (1<<PD7) | (1<<PD6);
	DDRE |= 1<<PE6;
	DDRC |= 1<<PC6;
	TCCR4B |= (1<<PWM4X)                               // inverse les sortie OCRxA et OCRxA/
		 |(1<<CS42)|(1<<CS41)|1<<CS40;             // prédiviseur
	TCCR4A |= (1<<PWM4A) | (1<<COM4A0);                // PWM sur COM4A/
	TCCR4C |= (1<<PWM4D) | (1<<COM4D0) | (1<<COM4D1);  // PWM sur COM4D
	TC4H=0;
	OCR4C=topPWM;                                      // valeur max PWM -> fmli = fq / (topPWM * prediv )
}

void setVitesse(int8_t vG, int8_t vD)
{
	setMoteurD(vD);
	setMoteurG(vG);
}

void setMoteurG(int8_t vit)
{
	if (vit<0)
	{
		vit = -vit;
		PORTD |= (1<<PD6);
	}
	else PORTD &=~ (1<<PD6);
	if (vit>topPWM) vit=topPWM;
	OCR4A = vit;
}

void setMoteurD(int8_t vit)
{
	if (vit<0)
	{
		vit = -vit;
		PORTE |= (1<<PE6);
	}
	else PORTE &=~ (1<<PE6);
	if (vit>topPWM) vit=topPWM;
	OCR4D = vit;
}

Question.jpg Utiliser ces fonctions pour que la trajectoire du robot soit un cercle

Question.jpg Comment faire varier le rayon du cercle ?