Hello !
ça y est, je me suis motivé à recommencer ce projet, ou du moins d'avancer un peu dessus avant de l'abandonner à nouveau quelques temps XD.
J'espère finir la partie alim +/-15V.
Mais avant ça, j'ai testé le convertisseur numérique/analogique "du pauvre" sur 8bits, avec des résistances à 1%.
Les résultats sont plutôt intéressants
Le signal numérique est généré à l'aide d'une arduino.
La fréquence d'échantillonnage est de 40kHz.
La fréquence d'échantillonnage maximale à laquelle j'ai pu allé avec les timers de l'arduino, c'est 54kHz, donc clairement pas assez pour ce que je veux faire. (la clock de l'arduino est cadencé à 16MHz)
Le schéma est le même que celui du post
#22, mais étendu à 8 bits. Les résistances sont de 11 et 22k @1%.
Pour la sortie, j'ai utilisé le port L de mon arduino mega (pin 42 à 49)
Je n'ai pas utilisé de bibliothèque ou ni même les fonctions arduinos pour mettre à jours le port, mais directement le timer1 et les interruptions de ATmel
// Tableau contenant une période du sinus sur 100 valeurs)
byte sine[] = {
127, 134, 142, 150, 158, 166, 173, 181, 188, 195,
201, 207, 213, 219, 224, 229, 234, 238, 241, 245,
247, 250, 251, 252, 253, 254, 253, 252, 251, 250,
247, 245, 241, 238, 234, 229, 224, 219, 213, 207,
201, 195, 188, 181, 173, 166, 158, 150, 142, 134,
127, 119, 111, 103, 95, 87, 80, 72, 65, 58,
52, 46, 40, 34, 29, 24, 19, 15, 12, 8,
6, 3, 2, 1, 0, 0, 0, 1, 2, 3,
6, 8, 12, 15, 19, 24, 29, 34, 40, 46,
52, 58, 65, 72, 80, 87, 95, 103, 111, 119
};
int t = 0;
void setup(){
// Initialisation du portL (arduino Mega : pin 42 à 49)
for(int i = 0; i < 8; i++) pinMode(42+i,OUTPUT);
// Configuration du timer1.
// Interruption à 40kHz
noInterrupts();
TCCR1A = B00000000;
TCCR1B = B00000000;
TCNT1 = 0;
OCR1A = 49; // = (16*10^6) / (40000*8) - 1 // 49 = 40kHz
TCCR1B |= (1 << WGM12); // CTC
TCCR1B |= (1 << CS11); // prescale8
TIMSK1 |= (1 << OCIE0A); // timer compare interrupt enable
interrupts();
}
// Interruption timer 1, déclanché à une fréquence de 40Hz
ISR(TIMER1_COMPA_vect){
//On écrit sur le port L
PORTL = sine[t++];
if (t > 99) t = 0;
}
void loop(){
}
Et voici le résultat
Quand on zoom sur le sinus, on voit les "marches" induite par la quantification 8 bits.
On passe de marche en marche avec une fréquence de 40kHz