besoin d aide signal pwm

Bonjour,
Je cherche à créer un petit module à base d'Attiny 45 et de 2 octocoupleurs qui , branchés sur une radiocommande à la mise sous tension me générerait à sa sortie pwm un signal à 50 Hz et une pulsation d'1 microseconde au bout d'un temps donné. Et ensuite rebasculerai sur le signal de la télécommande. J'ai trouvé un module similaire mais dont les valeurs de sortie ne sont pas les bonnes et dont voici le code :

/*
 * Programm zu Steuerung und überlagerung einer Signalleitung
 * für eine CGO2 Kamera.
 */
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL  // 1,0 MHz (für delay.h)
 
bool signal_online = false;
byte PIN_PWM = 1;
byte PIN_SWSE = 3; //Schaltersignal Empfänger
byte PIN_SWSP = 4; // Schaltersignal Prozessor
long start_at = millis();
void setup() {
  // put your setup code here, to run once:
  pinMode(PIN_PWM,OUTPUT);
  pinMode(PIN_SWSE,OUTPUT);
  pinMode(PIN_SWSP,OUTPUT);
  
  analogWrite(PIN_PWM,0);
  digitalWrite(PIN_SWSE,LOW);
  digitalWrite(PIN_SWSP,LOW);
    
}
 
void loop() {
  long now = millis();
  /*
   * Wenn das Singnal bereits vom Empfänger Online ist
   * wird der Kanal offen gehalten.
   */
  if(signal_online){
    analogWrite(PIN_PWM,0);
    digitalWrite(PIN_SWSP,LOW);
    digitalWrite(PIN_SWSE,HIGH);
    return;
  }
 
  /*
   * Nach dem Einschalten, wird nach ca. 5 Sekunden
   * ein Signal von ca. 500us für eine Sekunde aufgelegt.
   */
  if( now - start_at > 5000 && now - start_at < 6000 ){
    digitalWrite(PIN_SWSP,HIGH);
    analogWrite(PIN_PWM,7);
    digitalWrite(PIN_SWSE,LOW);
  }
 
  /*
   * Nach ca. 6 Sekunden wird das Signal vom Prozessor das oben
   * erzeigt wurde auf 0 gesetzt und der Koppler geschlossen.
   * Dafür wird die Signalleitung des Empfängers nun freigegeben.
   */
  if( now - start_at >= 6000 ){
    analogWrite(PIN_PWM,0);
    digitalWrite(PIN_SWSP,LOW);
    digitalWrite(PIN_SWSE,HIGH);
    signal_online = true;     
  }
 
}

Pensez-vous qu'il soit possible de modifier le code ici dessus pour passer de 500 microsecondes de pulsations à le durée dont j'ai besoin ?
Merci de votre analyse.
Charlie

tursio:
Bonjour,
Je cherche à créer un petit module à base d'Attiny 45 et de 2 octocoupleurs qui , branchés sur une radiocommande à la mise sous tension me générerait à sa sortie pwm un signal à 50 Hz et une pulsation d'1 microseconde

bonjour
Il n'est pas possible de generer un creneau de largeur 1µs sur une sortie de ton MCU (qui plus est avec un horloge à 1 MHz )

Merci de ta réponse mais j'ai fait une erreur dans mon exposé: il faut un créneau de largeur 1 milliseconde et pas microseconde... désolé mais je ne suis pas de la partie.

Avec un avr 8 bits on ne peut pas créer le signal que l'on veut.
Les formules pour calculer les fréquences de répétition possibles sont dans la datasheet du micro de la carte que tu utilises qui est la ? ? ? ?).
Pour de faibles valeurs de fréquence de répétition il ne devrait pas y avoir de difficultés : si tu obtient 49.8 Hz au lieu de pile 50 Hz cela ne devrait pas poser de problème (49,8 = valeur choisie au pif pour l'explication).
La durée minimale de l'impulsion sera 20 ms/255 = 78 µs (pour un timer 8bits)

Tu verra dans la datasheet qu'il existe 2 ou 3 types de PWM selon le timer utilisé.
Il est préférable de ne pas utiliser le timer 0 qui est utilisé par les fonctions de temps arduino.
Le timer 1 est 16 bits, le timer 2 est 8bits.

Chaque timer ne peut prendre le contrôle que de 2 sorties donc selon le timer utilisé les numéros de pins sont imposés.

il faut un créneau de largeur 1 milliseconde

Bonjour,
...
delay(1)
...

quelle sera la fréquence de l'oscillateur ?

dès lors que les interruptions sont désactivées

Bonjour pepe,

oui mais comment désactiver les interruptions sans risquer de ficher le bazar dans le fonctionnement d'un arduino ?
par exemple si on les désactive alors que le programme a besoin d'en déclencher une ?
ou pire, si on les rétablit alors qu'il faut qu'elles sont (temporairement) désactivées pour le bon déroulement du programme ?

bref, comment le compilateur va gérer toutes ces instructions pour le moins inhabituelles ?

pepe:
Bonjour

Il est tout-à-fait possible de générer une impulsion de 1µs sur un AVR 8 bit tournant à 1 MHz, dès lors que les interruptions sont désactivées afin de ne pas perturber le programme sur lequel repose le contrôle de la chronologie.

Par exemple, pour générer une impulsion d'une durée d'un cycle d'horloge système sur la sortie PB0, on peut faire :

  PINB = 1;

PINB = 1;



ou, en forçant la main au compilateur :



asm volatile (
   " ldi r24,1 \n"
   " out %[_PINB],r24 \n"
   " out %[_PINB],r24 \n"
   :: [_PINB] "I" (_SFR_IO_ADDR(PINB)) );




On peut a fortiori contrôler des processus plus lents, et même trèèès lents, toujours avec une précision au cycle d'horloge près.

**Bien évidemment, selon ce principe (purement logiciel), le micro-contrôleur ne peut pas faire autre chose à côté qui ne soit pas précisément contrôlé en durée.**

Toutefois, comme le micro-contrôleur dispose de périphériques intégrés dont les cycles de fonctionnement sont, sinon réglables, au moins connus avec précision, il est possible de le libérer de certaines de ces tâches en les mettant à profit.

Ainsi, les compteurs/timers sont eux aussi capables de générer, sur des sorties spécifiques, des impulsions pouvant être aussi courtes qu'un cycle d'horloge système, et même de les répéter automatiquement avec une période précise au cycle d'horloge près. Sur certains micro-contrôleurs, qui intègrent un circuit PLL et un ou plusieurs compteurs/timers rapides, l'horloge utilisée peut avoir une fréquence supérieure à celle de l'horloge système. Par exemple, sur un ATtiny45 cadencé par son horloge RC interne à 8 MHz, cette horloge peut tourner à 64 MHz.

Pour des durées dépassant les capacités des compteurs/timers et de leur prédiviseur de fréquence, le microcontrôleur peut reprendre la main logiciellement afin d'enchaîner des séquences de contrôles différentes, en modifiant les registres de réglage au vol mais à une fréquence et avec une précision beaucoup plus faibles que le processus généré. Par exemple avec une horloge système à 1 MHz et un compteur/timer 8 bits, on pourrait ainsi générer une impulsion de 1 µs à la fréquence de 50 Hz en paramétrant une période de 200 cycles d'horloge (soit 5 kHz) et en n'autorisant logiciellement la production de l'impulsion sur la sortie associée que durant une période de compteur toutes les 100 périodes.

Bonsoir pepe
Merci pour la démonstration faisabilité soft :grin: , mais perso, si je devais faire je ne passerais très surement pas par ce biais

Bonjour,

les programmes en assembleur avec les cycles en commentaire, j'ai déjà donné
(pepe tu savait que pour tuer 2 cycles, tu peut faire rjmp $+1, et pour en tuer 4, un rcall directement vers un return quelconque)

les inclusions d'asm dans le c, je savais faire, mais j'ai abandonné : top lourd, craintes vis-à-vis de la réaction du compilo, et surtout, entre-temps, j'ai acquis les connaissances pour pouvoir s'en passer

donc merci à pepe pour cet exposé complet (on devrait en faire un tuto pour les ex débutants)
et +1 avec Artouste

J'en reviens a la réponse donnée en #3 (on est déjà en #15)--> lire la datasheet du micro qui équipe la carte et voir ce qu'il est possible de faire avec les timers ( 8bits ou 16 bits).
Ajout : les possibilités des micro ARM (carte due ou zéro) sont bien supérieures.

Bon c'est vrai que demander de lire la datasheet du micro à l'air d'être considéré comme une punition, et pourtant c'est la seule véritable source d'information.