Skip to content

Commit

Permalink
Closes #16
Browse files Browse the repository at this point in the history
  • Loading branch information
jean-michel-gonet committed Feb 27, 2016
1 parent addcc49 commit f3f1cfc
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 9 deletions.
21 changes: 17 additions & 4 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*
* Créé Mars 29, 2015, 10:21 AM
*/
#include <htc.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>

Expand Down Expand Up @@ -78,13 +78,26 @@ void low_priority interrupt interruptionsBassePriorite() {
static unsigned char hall0 = 0;
static int tempsMesureVitesse = TEMPS_BASE_DE_TEMPS;
static unsigned int instantCapture4, instantCapture5;
static int mesureAdc = 0;

// Traitement des conversions AD:
if (PIR5bits.TMR4IF) {
PIR5bits.TMR4IF = 0;

if (!ADCON0bits.GODONE) {
enfileEvenement(LECTURE_POTENTIOMETRE, ADRESH);
switch (ADCON0bits.CHS) {
case 8:
enfileEvenement(LECTURE_POTENTIOMETRE, ADRESH);
ADCON0bits.CHS = 13;
break;
case 13:
enfileEvenement(LECTURE_ALIMENTATION, ADRESH);
ADCON0bits.CHS = 8;
break;
default:
ADCON0bits.CHS = 8;
break;
}
ADCON0bits.GODONE = 1;
}
}
Expand Down Expand Up @@ -166,7 +179,7 @@ void main() {

// Configure le module A/D:
ANSELA = 0x00; // Désactive les convertisseurs A/D
ANSELB = 0b00000100; // Active AN8 / RB2 comme entrée analogique.
ANSELB = 0b00100100; // Active AN8(RB2) et AN13(RB5) comme entrées analogiques.
ANSELC = 0x00; // Désactive les convertisseurs A/D.

ADCON2bits.ADFM = 0; // Résultat justifié sur ADRESH.
Expand Down Expand Up @@ -246,7 +259,7 @@ void main() {
PORTB = 0;
PORTC = 0;
TRISA = 0b10111111; // RA6 est une sortie.
TRISB = 0b00011111; // Entrées analogiques du port B.
TRISB = 0b00111111; // Entrées analogiques du port B.
TRISC = 0x00; // Tous les bits du port C comme sorties.

// Surveille la file d'événements, et les traite au fur
Expand Down
58 changes: 53 additions & 5 deletions puissance.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@

#define TENSION_MOYENNE_MIN 10
#define TENSION_MOYENNE_MAX 180
#define TENSION_MOYENNE_MAX_REDUITE 40
#define TENSION_ALIMENTATION_MIN 7.4
#define LECTURE_ALIMENTATION_MIN 255 * (TENSION_ALIMENTATION_MIN / 2) / 5

/**
* La tension moyenne maximum peut varier si la tension d'alimentation
* tombe en dessous d'un certain seuil.
*/
static char tensionMoyenneMax = TENSION_MOYENNE_MAX;

/**
* Corrige la tension moyenne du {@link TableauDeBord} selon différence observée entre
Expand All @@ -13,17 +22,19 @@
*/
void corrigeTensionMoyenne(MagnitudeEtDirection *vitesseMesuree,
MagnitudeEtDirection *vitesseDemandee) {
unsigned char magnitude = vitesseDemandee->magnitude;
tableauDeBord.tensionMoyenne.direction = vitesseDemandee->direction;

if (vitesseDemandee->magnitude > TENSION_MOYENNE_MAX) {
vitesseDemandee->magnitude = TENSION_MOYENNE_MAX;

if (magnitude > tensionMoyenneMax) {
magnitude = tensionMoyenneMax;
}

if (vitesseDemandee->magnitude < TENSION_MOYENNE_MIN) {
vitesseDemandee->magnitude = 0;
if (magnitude < TENSION_MOYENNE_MIN) {
magnitude = 0;
}

tableauDeBord.tensionMoyenne.magnitude = vitesseDemandee->magnitude;
tableauDeBord.tensionMoyenne.magnitude = magnitude;
}

/**
Expand Down Expand Up @@ -76,6 +87,13 @@ void PUISSANCE_machine(EvenementEtValeur *ev) {
static MagnitudeEtDirection vitesseDemandee = {INDETERMINEE, 0};

switch(ev->evenement) {
case LECTURE_ALIMENTATION:
if (ev->valeur < LECTURE_ALIMENTATION_MIN) {
tensionMoyenneMax = TENSION_MOYENNE_MAX_REDUITE;
} else {
tensionMoyenneMax = TENSION_MOYENNE_MAX;
}
break;
case VITESSE_MESUREE:
vitesseMesuree = &(tableauDeBord.vitesseMesuree);
corrigeTensionMoyenne(vitesseMesuree, &vitesseDemandee);
Expand Down Expand Up @@ -111,7 +129,36 @@ unsigned test_evalueVitesseDemandee() {

return testsEnErreur;
}
unsigned char test_limiteTensionMoyenneMax() {
unsigned char testsEnErreur = 0;
EvenementEtValeur evenementEtValeur;

reinitialiseMessagesInternes();
tableauDeBord.tensionMoyenne.direction = INDETERMINEE;
tableauDeBord.tensionMoyenne.magnitude = 0;

evenementEtValeur.evenement = LECTURE_RC_AVANT_ARRIERE;
evenementEtValeur.valeur = 128 + 30;
PUISSANCE_machine(&evenementEtValeur);

evenementEtValeur.valeur = 8;
evenementEtValeur.evenement = LECTURE_ALIMENTATION;
PUISSANCE_machine(&evenementEtValeur);

evenementEtValeur.evenement = VITESSE_MESUREE;
PUISSANCE_machine(&evenementEtValeur);
testsEnErreur += assertEqualsChar(tableauDeBord.tensionMoyenne.magnitude, TENSION_MOYENNE_MAX_REDUITE, "PMAX03");

evenementEtValeur.valeur = 255;
evenementEtValeur.evenement = LECTURE_ALIMENTATION;
PUISSANCE_machine(&evenementEtValeur);

evenementEtValeur.evenement = VITESSE_MESUREE;
PUISSANCE_machine(&evenementEtValeur);
testsEnErreur += assertEqualsChar(tableauDeBord.tensionMoyenne.magnitude, 60, "PMAX13");

return testsEnErreur;
}
unsigned char test_corrigeTensionMoyenne() {
unsigned char testsEnErreur = 0;
MagnitudeEtDirection vitesseDemandee;
Expand Down Expand Up @@ -173,6 +220,7 @@ unsigned char test_puissance() {

testsEnErreur += test_evalueVitesseDemandee();
testsEnErreur += test_corrigeTensionMoyenne();
testsEnErreur += test_limiteTensionMoyenneMax();
testsEnErreur += test_calculeVitesseDemandeeSurLecturePotentiometre();

return testsEnErreur;
Expand Down

0 comments on commit f3f1cfc

Please sign in to comment.