PWM Modifiable.

Bonjour à tous, dans le cadre d’un projet, je dois modifier à l’aide de deux potentiomètre ( rapport cyclique et fréquence) plusieurs sortie PWM . J’ai à ma disposition une carte arduino mega ADK rev.3 ainsi qu’un écran LCD A000096.

J’arrive à tout gérer pour l’instant, les potentiomètre, l’écran LCD, mais mon problème réside dans la modification de la fréquence du PWM ( beaucoup de TOPIC sur internet mais pas de code d’exemple disponible).

Voici mon programme (qui fonctionne très moyennement) de base, “sans le décor” permettant entre-autre de modifier la fréquence et le rapport cyclique.

Serait-il possible de me donner un petit coup de pouce ? étant novice dans le domaine, je ne comprend pas grand chose , surtout la manière de changer la fréquence du compteur interne dans le setup.

Merci d’avance pour votre aide :slight_smile:

PROGRAMME

#include <TFT.h> // Importation bibliothèques
#include <SPI.h>

#define cs 10 // définition broche pour LCD
#define dc 9
#define rst 8

TFT TFTscreen = TFT(cs, dc, rst);
int sensorPin = A0; // définiton potentiomètre 1 ( fréquence)
int sensorPin1 = A1; // définition potentiomètre 2 ( rpt cyclique )

int sensorValue = 0; // Mise à 0 du potentiomètre 1
int sensorValue1 = 0; // Mise à 0 du potentiomètre 2

int sensorValuedisplay = 0; //Mise à 0 de la position de la ligne du LCD

char sensorPrintout[8]; // char array to print to the screen
void setup() {

pinMode(ledPin1, OUTPUT); // renommage pin led out, pour plus de confort

TFTscreen.begin(); // commencement programme lcd
TFTscreen.background(250,27,217); // réglage couleur fond d’écran
TFTscreen.stroke(128,255, 128); // réglage couleur écriture
TFTscreen.setTextSize(2); // réglage taile écriture
TFTscreen.text("freq :\n ", 0, 0); // texte à affiche à l’écran

}

void loop() {

sensorValue = analogRead(sensorPin); // lecture de la valeur du potentiomètre 1
sensorValue1 = analogRead(sensorPin1); // lecture de la valeur du potentiomètre 2

digitalWrite(ledPin1, HIGH); // mise à 1 de la led 1

delay(sensorValue); // stop the program for milliseconds

digitalWrite(ledPin1, LOW); // mise à 0 de la led 0

delay(sensorValue+sensorValue1); // stop the program for for milliseconds

String sensorValuedisplay = String(analogRead(A0)); // lecture de la valeur du potentiomètre 1 ( de 0 à 1023 )

sensorValuedisplay.toCharArray(sensorPrintout, 8); // convert the reading to a char array

TFTscreen.stroke(255, 255, 255); // réglage couleur écriture text

TFTscreen.text(sensorPrintout, 30, 20); // affichage de la valeur du potentiomètre ( 30,20 sont des réglages de texte: horizontale/verticale)

delay(250); attente de 250ms

TFTscreen.stroke(250,27,217); // erase the text you just wrote
TFTscreen.text(sensorPrintout, 30, 20);

}

bonjour, tu veux par les deux potards modifier le delay si j'ai bien compris. l'analog va de 0 à 1023, donc ca fait en gros au max 1s pour les deux potards environ 2s au max

si tes valeurs sont trop petites, tu ne verras pas la différence. multiplie par 5-10 pour augmenter le delay. mets un serail.println de tes valeurs pour vérifier.

mets aussi un pinmode input pour tes potards dans le setup

Yep!

Utilisation du registre de la puce ??

Vf datasheet, section 16bit Timer/Counter, PWM -> ICRx, OCRx.

@+

Zoroastre.

julien-83: Bonjour à tous, dans le cadre d'un projet,

Scolaire ? Ce serait bien de le dire ouvertement, on a de bon détecteurs :grin:

julien-83: J'arrive à tout gérer pour l'instant, les potentiomètre, l'écran LCD, mais mon problème réside dans la modification de la fréquence du PWM ( beaucoup de TOPIC sur internet mais pas de code d'exemple disponible).

bonjour, Il faut mettre le code entre les balises codes c'est plus facile à lire et c'est écrit dans la charte que tu n'as pas manqué de lire :grin: . Pour trouver la bonne balise tu survole les icônes avec la souris et tu peux éditer ton premier message pour mettre le source du programme comme il convient.

Si j'ai bien compris tu cherches comment faire pour changer la fréquence de PWM. Dans l'univers arduino la fréquence de PWM est fixée dans l'initialisation --> fonction init() des bibliothèques arduino. La valeur est de 500 Hz (à peut prés). Il va falloir mettre les mains dans le cambouis.

Pour reprendre un autre sujet de discussion : - Dans un avr la PWM est matérielle et non pas logicielle. - Le logiciel configure le matériel par l'intermédiaire de registres 8 bits (normal les avr sont 8 bits).

La PWM se règle à partir des registres des timers (avec atmega328p que je connais bien T0,T1,T2). Chaque timer n'a accès qu'à 2 pins bien précise, c'est pour cela qu'avec la PWM matérielle il n'y a que 6 sorties PWM possibles sur une carte UNO (la Mega je ne connais pas mais il doit y en avoir davantage).

Ton cas est très particulier dans l'univers arduino et il est normal que les programmes exemples (ou tout faits pour les pas courageux) ne soient pas légion (si le projet est bien scolaire comme je le pense, le prof a "bien choisi" le sujet pour éviter le copier coller) La solution est de revenir aux fondamentaux : modifier la valeur des registres des timers. Ce n'est pas difficile il faut quand même lire la datasheet du micro que tu utilises c'est dire avec une Mega ADK un ATMega 2560.

Ce que je n'ai pas compris c'est pourquoi tu parles de changer la fréquence dans le setup(). La fonction setup() ne s'exécute qu'une seule fois c'est pour cela qu'elle s'appelle setup(). Si tu veux changer la fréquence de la PWM avec un potentiomètre il faut le faire dans la fonction loop() qui comme son nom l'indique s'exécute en boucle.

68tjs: La PWM se règle à partir des registres des timers (avec atmega328p que je connais bien T0,T1,T2). Chaque timer n'a accès qu'à 2 pins bien précise, c'est pour cela qu'avec la PWM matérielle il n'y a que 6 sorties PWM possibles sur une carte UNO (la Mega je ne connais pas mais il doit y en avoir davantage).

Ba! En utilisant 2 ISR (comparateur + overflow), on peut théoriquement utiliser tous les ports de l'arduino en basculant la pin que l'on désire, de manière (semi?) logicielle certes.