Cours:TPS 2103 tp miniqv2 : Différence entre versions
(Page créée avec « {{Rouge|<big>'''Retour à la liste des Tps'''</big>}} {{Vert|<big>'''Éléments de correction'''</big>}} ») |
|||
| 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
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;
}
Utiliser ces fonctions pour que la trajectoire du robot soit un cercle