Bonjour,
Je veux générer deux fréquences sur mon Arduino Micro :
L'une variable, j'ai trouvé se code qui fonctionne très bien pour les fréquence élevés entre 1 et 12KHz.
Programmer un signal PWM normal (lent), symétrique et non inversé sur la sortie OC1B/PB6 (timer 1/comparateur B) correspondant à la pin 10 ,
les valeurs peuvent être :
- configuration sortie : DDRB[6] = 1
- prédiviseur : CS1[2:0] = 1 (f/1)
- mode : WGM1[3:0] = 8 ("PWM, Phase and Frequency Correct" avec ICR1)
- fréquence : ICR1 = 800 (fout = 16MHz/(2·prédiviseur·ICR1) = 10 kHz)
- polarité : COM1B[1:0] = 2 (signal non inversé)
- rapport cyclique : OCR1B (relativement à la valeur de ICR1)
*/
int frequence ;
int freq1 ; // fréquence = 8 kHz (800 pour 10KHz)
unsigned int dutycycl ; // rapport cyclique rel. icr1
void setup() {
Serial.begin(9600); // initialize the serial 1 communication
// pinMode(10, OUTPUT);
// OC1A et OC1C inutilisées
unsigned char com1A = 0;
unsigned char com1C = 0;
// 8 kHz sur sortie 10 Micro (OC1B/PB6)
unsigned char cs1 = 1; // prédiviseur = f/1
unsigned char mode1 = 8; // mode = 8
unsigned char com1B = 2; // signal non inversé
unsigned int freq = 1000 ; // fréquence = (1000 pour 8 kHz et 800 pour 10KHz)
unsigned int dutycycl = freq/2 ; // rapport cyclique rel. icr1
// check if data has been sent from the computer:
DDRB |= 1<<6;
TCCR1A = (com1A<<6)|(com1B<<4)|(com1C<<2)|(mode1&3);
TCCR1B = ((mode1>>2)<<3)|cs1;
ICR1 = freq;
OCR1B = dutycycl;
}
void loop() {
if (Serial.available()) {
// read the most recent byte (which will be from 0 to 255)
freq1 = Serial.parseInt();
frequence = (16000/(2*1*freq1));
// set the brightness of the LED:
// analogWrite(ledPin, frequence);
Serial.print("Saisir la valeur de la frequence en KHz:");
Serial.println(freq1);
ICR1 = frequence ;
OCR1B = frequence/2 ;
}
}
Une seconde très faible de l'autre d'environ 20Hz à 80Hz, fixe pas besoin de la varié pendant exécution.
J'arrive en modifiant le prédiviseur : CS1[2:0] = 1 (f/1),
unsigned char cs1 = 4; // prédiviseur = f/1
Mais le souci c'est que les deux fonctionnes mais sur la même pin 10 Arduino Micro.
Ne n'arrive pas à modifier les registres pour utiliser par exemple pin 6.
ps : les pins 2, 3, 7 et 12 sont déjà utilisés.
Si quelqu'un peux m'aider à avoir une freq. fixe faible sur la pin 6 ou 5, j'ai essayé avec la fonction
void setPwmFrequency(int pin, int divisor)
http://playground.arduino.cc/Code/PwmFrequency
Mais y je pense un "conflit" car il ecrit déjà au dessus sur :
TCCR0B = TCCR0B & 0b11111000 | mode; // pour les pins 5 ,6
TCCR1B = TCCR1B & 0b11111000 | mode; // pour les pins 9 ,10
TCCR1B = TCCR1B & 0b11111000 | mode; // pour les pins 9 ,10
Sinon ( au pire ) si je peux avoir deux sorties avec une de Freq = 30Hz et 8KHz sur deux broches je suis preneur.
Merci d'avance pour votre aide...