J'ai un arduino pro mini qui me génère une tension à la sortie d'une DAC selon la valeur de deux variables selectionnables par boutons-poussoirs .. ces valeurs sont stockées dans une eeprom aux adresses 0 et 1 de façon à ce qu'à la mise sous tension de l'arduino, la dernière tension sélectionnée revienne
Les valeurs par bouton-poussoirs :
BP1 => adresse0= 2.00 et adresse1 = 715.00
BP2 => adresse0= 1.50 et adresse1 = 715.00
BP3 => adresse0= 1.00 et adresse1 = 715.00
BP4 => adresse0= 1.00 et adresse1 = 204.00
Les tensions de sortie sont bonnes en fonctionnement normal
Mais à la remise sous tension, seule la valeur du BP4 revient correctement ... les autres produisent une tension differente
j'ai mis deux serial.print des valeurs relues dans l'eeprom à l'allumage et elles sont correctes mais mais la DAC ne donnent pas la bonne tension .. une idée?

Mon sketch :
#include "MCP_DAC.h"
#include <EEPROM.h> // bibliotheque pour lire et ecrire dans Eeprom
MCP4921 MCP(11, 10); //attribution entrées -> MCP4921 MCP(MOSI, SCK)
double tensionEYE3 = 0; // tension mesurée en volt
double tensionEYE3max = 715; // 715 = 3,55v
double valeurAenvoyer = 0; // valeur numerique envoyée au DAC
double tensionVoulueEnSortie = 0; // valeur en sortie de la formule
int adresse1 = 0;
int adresse2 = 1;
float Kchoisi;
//Choix des pines d'entrée
int boutonA = 6; // the number of the RF output D0 => pine D3
int boutonB = 5; // the number of the RF output D1 => pine D4
int boutonC = 4; // the number of the RF output D2 => pine D5
int boutonD = 3; // the number of the RF output D3 => pine D6
int LedChoix = 2; // led clignotante sur D2
// ========================
// Initialisation programme
// ========================
void setup() {
// Initialise la liaison série (arduino nano -> PC)
Serial.begin(115200);
// initialise les pines boutton en mode entrée
pinMode(boutonA, INPUT);
pinMode(boutonB, INPUT);
pinMode(boutonC, INPUT);
pinMode(boutonD, INPUT);
pinMode(10, OUTPUT); // CS de la DAC
pinMode(12, OUTPUT); // MOSI(SDI) de la DAC
pinMode(13, OUTPUT); // CLK de la DAC
pinMode(LedChoix, OUTPUT);
// commande chip slect (CS) attribuée à la pine D12
MCP.begin(12);
//lecture de la dernière valeur de l'acceleration choisie
Kchoisi = EEPROM.read(adresse1);
tensionEYE3max = EEPROM.read(adresse2);
delay(100);
// si la case lue contient 255, la remplacer par Kchoisi 1.5
if (Kchoisi == 255) {
Kchoisi = 2;
}
}
// =================
// Boucle principale
// =================
void loop() {
Serial.println(Kchoisi);
Serial.println(tensionEYE3max);
Serial.println(" ");
// === CHOIX COURBES ===================================
// Pour acceleration très faible (kchoisi=2),presser le bouton A => RF haut
// 1 clignotements
if (digitalRead(3) == HIGH) { // Bouton A -> D3(Mini) -> D0(RF)
Kchoisi = 2.0; // acceleration très faible
tensionEYE3max = 715;
EEPROM.write(adresse1, Kchoisi); // ------------- ecrire Bchoisi dans EEPROM
EEPROM.write(adresse2, tensionEYE3max);
delay(100);
ClignotementsLed(1, 500); // 1 clignotements
}
// Pour aceleration faible (Kchoisi=1,5) ,presser le bouton B => RF haut
// 2 clignotements
if (digitalRead(4) == HIGH) { // Bouton B -> D4(Mini) -> D1(RF)
Kchoisi = 1.5; // accelereration faible
tensionEYE3max = 715;
EEPROM.write(adresse1, Kchoisi); // ------------- ecrire Bchoisi dans EEPROM
EEPROM.write(adresse2, tensionEYE3max);
delay(100);
ClignotementsLed(2, 500); // 2 clignotements
}
// Pour acceleration forte (Kchoisi= 1,2),presser le bouton C ==> RF haut
// 3 clignotements
if (digitalRead(5) == HIGH) { // Bouton C -> D5(Mini) -> D2(RF)
Kchoisi = 1; // acceleration forte
tensionEYE3max = 715;
EEPROM.write(adresse1, Kchoisi); // ------------- ecrire Bchoisi dans
EEPROM.write(adresse2, tensionEYE3max);
delay(100);
ClignotementsLed(3, 500); // 3 clignotements
}
// Pour acceleration très forte (Kchoisi=1),presser le bouton D ==> RF haut
// 4 clignotements
if (digitalRead(6) == HIGH) { // Bouton D rouge -> D6(Mini) -> D3(RF)
Kchoisi = 1.0; // acceleration très forte
tensionEYE3max = 204;
EEPROM.write(adresse1, Kchoisi); // ------------- ecrire Bchoisi dans EEPROM
EEPROM.write(adresse2, tensionEYE3max);
delay(100);
ClignotementsLed(4, 500); // 4 clignotement
}
// === MESURE SIGNAL,TRAITEMENT ET ENVOI VERS DAC ===============
// lecture signal sur la pine A3
double tensionEYE3 = analogRead(A3);
//La formule ne fonctionnera pas si tensionEYE3 > tensionEYE3max
if (tensionEYE3 > tensionEYE3max) {
tensionEYE3 = tensionEYE3max;
}
// Formule de la courbe à sortir
double tensionVoulueEnSortie = tensionEYE3max - pow(pow(tensionEYE3max, Kchoisi) - pow(tensionEYE3, Kchoisi), 1 / Kchoisi);
// calcul de la valeur de la tension voulue en sortie du DAC et son envoi
// * 4.0 pour convertir la sortie en 12bits et + 0,x si ajustement necessaire
double valeurAenvoyer = (tensionVoulueEnSortie * 4.0);
// envoi sur sortie DAC
MCP.analogWrite(valeurAenvoyer); // ecriture signal sur la pine 8 du MCP4921
}
// === SOUS-PROGRAMME CLIGNOTEMENTS ===============================
void ClignotementsLed(int C, unsigned long T) {
for (int i = 1; i <= C; i++) {
digitalWrite(LedChoix, HIGH);
delay(T);
digitalWrite(LedChoix, LOW);
delay(T);
}
}
