L'Arduino ne peut pas générer des signaux sinusoïdaux, mais seulement des signaux carrés. La bonne nouvelle c'est que ton module les accepte (voir la doc, qui dit qu'il est compatible du PWM de l'Arduino).
La mauvaise nouvelle c'est qu'il n'est pas sûr qu'on puisse générer avec un nano des signaux carrés aux fréquences que tu veux.
Je ne suis pas un expert du PWM et des registres associés, mais il existe une bibliothèque qui gère ça simplement.
En gros, elle pilote les registres pour générer des signaux à des fréquences déterminées, qui sont des sous-multiples de la fréquence d'horloge. Pour un nano (équipé d'un Atmega328P), le code est ici :
void setPWMPrescaler(uint8_t pin, uint16_t prescale) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(prescale) {
case 1: mode = 0b001; break;
case 8: mode = 0b010; break;
case 64: mode = 0b011; break;
case 256: mode = 0b100; break;
case 1024: mode = 0b101; break;
default: return;
}
} else if(pin == 3 || pin == 11) {
switch(prescale) {
case 1: mode = 0b001; break;
case 8: mode = 0b010; break;
case 32: mode = 0b011; break;
case 64: mode = 0b100; break;
case 128: mode = 0b101; break;
case 256: mode = 0b110; break;
case 1024: mode = 0b111; break;
default: return;
}
}
if(pin==5 || pin==6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else if (pin==9 || pin==10) {
TCCR1B = TCCR1B & 0b11111000 | mode;
} else if (pin==3 || pin==11) {
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
Si je comprends bien ...
On voit que sur les pins 3 et 11, les diviseurs possibles sont : 1, 8, 32, 64, 128, 256 et 1024. Partant d'une fréquence de 31250 Hz, on obtient les fréquences possibles de 31250, 3906, 976, 488, 244, 122 et 61 Hz. Donc, pas celles que tu veux. On peut descendre à 31 Hz sur la pin 10 avec un prescaler de 1024.
EDIT : je vois que tu as réussi, partage ta solution... As-tu les moyens de vérifier (à l'oscillo par exemple) les fréquences générées ?
EDIT2 : à ces fréquences, on peut certainement générer ces signaux sans faire du PWM, mais en mettant une sortie à HIGH et LOW selon les valeurs de millis() ou micros() pour faire plus précis: voici un exemple pour 100 Hz
int freq = 1000; // dixièmes de hertz (1000 pour 100Hz, 333 pour 33.3 Hz)
unsigned long chrono;
unsigned long periode;
bool level = LOW;
const int pinMOSFET = 10;
void setup() {
pinMode (pinMOSFET, OUTPUT);
digitalWrite (pinMOSFET, level);
periode = 10000000ul / freq / 2; // microsecondes (demi période)
chrono = micros();
}
void loop() {
while (micros() - chrono < periode);
chrono = micros();
level = !level;
digitalWrite (pinMOSFET, level);
}