Cours:TPS 2103 tp miniqv2

De troyesGEII
Aller à : navigation, rechercher

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 ?