PWM imprécis ?

Bonjour à tous,

Je souhaite commander une pompe avec une sortie PWM de mon arduino UNO, or, lorsque j'y parviens, l'évolution de la rotation de ma pompe n'est pas linéaire alors que mes sorties pwm en tension paraissent l’être avec le voltmètre bien sur...
J'ai tenté de changer les fréquences de la pwm de plusieurs sorties, sans grand succès, si ce n'est obtenir une rotation de la pompe moins "vacillante" en arrivant après les 3921.16 Hz.

Voici la pompe en question : http://www.gilson.com/fr/AI/Products/8.47/Default.aspx#.WpbOCXyDO00

Je pensais m'orienter, si aucune solution avec les pwm, sur ce CNA : http://www.dx.com/fr/p/pcf8591-ad-da-analog-to-digital-digital-to-analog-converter-module-w-dupont-cable-deep-blue-336384?tc=EUR&ta=FR&gclid=EAIaIQobChMIyaOWvfrI2QIVkpkbCh1I0g2NEAQYASABEgKOx_D_BwE

Qu'en dites vous ?

J'en profite aussi d'être la pour une question concernant mon programme Arduino, je souhaite pouvoir choisir la vitesse de rotation de ma pompe entre avec des intervalles de 1 entre 0 et 255, malheureusement je n'arrive qu'à faire un programme à 10 vitesses que voici :

if(Serial.available()) //Si le port serie est disponible
{
int ch = Serial.read(); 

if (isdigit(ch)) //Si ch est un nombre alors 
{
  int vitesse = map(ch, '0', '9', 0, 255); //cette fonction convertie la valeur entrée au clavier en valeur comprise entre 0 et 255
  analogWrite(motorPin, vitesse); //Commande la vitesse du moteur en fonction de la valeur entrée au clavier 
  Serial.println(vitesse); //laisse choisir une vitesse à l'operateur
  }
else
{
  Serial.print("caractère inattendu : "); //Demande à l’opérateur d'entrer une valeur correcte
  Serial.println(ch);
}  
}  

}

Merci pour vos futurs nombreuses réponses ^^

Bonjour

  1. ordre de grandeur de la non linéarité constatée? La linéarité est elle acceptable en commandant la pompe par une tension issue d’une alimentation de laboratoire ?

  2. configuration en commande par tension ? (la notice évoque une commande alternative par résistance variable) Comment se fait le changement de commande externe (tension/résistance) ?
    analog input.jpg

  3. le signal PWM est-il appliqué tel quel (signal périodique ) ou filtré (passe bas RC par exemple) ?

(la pompe en commande extérieure par tension n’accepte peut être pas une tension périodique…ou une tension envoyée par une source de résistance interne élevée.)

4° le DAC I2C d’un PCF8591 pourrait être une bonne alternative, simple et économique.

Donc la conclusion est que si cela fonctionait "mieux" à fréquence de PWM élévée c'est parce qu'un filtrage "naturel" s'effectuait avec les éléments parasites (capacité parasite aux entrées/sorties et résistance et inductance des fils de liaison).

PCF8591 ou filtrage ?
Tout dépend de la vitesse de réaction à la commande.
Le filtrage passe bas est un intégrateur donc il apporte un retard.
Plus le signal doit être propre plus le retard sera grand.
Le Dac lui délivre son signal en un temps plus bref.

La pompe étant un organe mécanique il est peu probable que le retard apporté par un filtrage énergique soit pénalisant mais autant le signaler.

Un filtrage énergique va imposer une résistance série de valeur assez élevée.
L'entrée de la pompe a des exigences sur la valeur maximale de résistance de source continue. Ce qui peut imposer l'utilisation d'un AOP monté en suiveur de tension pour adapter l'impédance.

Si la sortie du PCF n'a pas cette inconvénient (a vérifier dans sa datasheet) au prix ou il coûte il est AMHA la meilleure solution.

Malgré que je penche pour le PCF une étude comparative un peu plus poussée me semble s'imposer.

Quand au RS 485, sauf bien sûr s'il apporte des possibilités supplémentaires non demandées dans la question initiale, et à ce titre il était utile d'en rappeler l'existance, il me semble bien compliqué en comparaison de la transmission d'un signal continu.

Bonjour

La notice de la pompe montre deux usages de son entrée analogique de commande externe
-commande par tension appliquée à cette entrée (domaine 0 à 5V)
-commande par résistance externe branchée entre cette entrée et la masse (pont diviseur formé avec une résistance interne de 68 kOhm reliée à +5V)

La notice n'évoque pas de menu de configuration permettant de passer d'un mode à l'autre.....

La résistance interne de 68kOhm serait donc toujours connectée ... d'où l'interrogation sur la résistance interne de la source de tension externe destinée à piloter la vitesse d la pompe.

Le filtrage RC du signal périodique PWM va augmenter cette résistance interne.
Si elle reste négligeable devant 68kOhm le résultat sera peut être acceptable. Essais indispensables ,d'autant plus qu'on ne connait pas l'ondulation tolérée par la pompe.

S'il faut un suiveur, le montage se complique et le PCF8591 devient intéressant + ses entrées analogiques (éventuellement en mode différentiel) pourront peut être servir...

(L'impédance de sortie du convertisseur numérique analogique du PCF8591 est inférieure à 50 Ohm sauf à proximité de VSS et VDD ou elle grimpe vers 400 Ohm)

Une belle 'bête' comme ce modèle de pompe péristaltique 'pro'mériterait une commande numérique qui comme le fait remarquer pepe parait bien documentée et ne pas mettre en oeuvre de hardware exotique

S’il est nécessaire d’avoir une bonne précision entre la vitesse de la pompe et sa commande, alors il est préférable d’utiliser un CNA plutôt qu’un signal PWM filtré.

En effet, un CAN délivre une tension qui est relativement indépendante de sa tension d’alimentation. Par contre, une sortie PWM de l’Arduino est (directement) tributaire de la tension d’alimentation de l’Arduino.

Cordialement.

Pierre

Bonjour,

la non linéarité est due au mode mixte (résistance ou tension) pour commander la pompe : on n'obtiendra pas de linéarité quoi qu'on fasse

J’ai monté deux filtres RC en cascade pour lisser le signal du PWM, ce qui a pu rendre la commande de la pompe suffisamment stable. Le retard du signal n’est pas vraiment un frein pour l’application que j’en aurais.

La commande par GSIOC (protocole du constructeur) de deux pompes semble imposer l’achat d’une interface de commande GSIOC qui sort du budget, ce qui explique pourquoi je me suis tourné vers la solution de l’input. (Du moins j’attends des nouvelles du fabricant pour savoir si deux adaptateurs 605 comme expliqué dans le manuel constructeur suffiraient, en cas de problèmes d’instabilité en milieu de projet).

Je vais désormais essayer la fonction parseInt() dont pepe me parle pour avoir mes 256 vitesses, ET, ensuite je pourrais faire le PID en relation avec les pompes et un capteur de poids, je pense revenir ici d’ici la, le plus gros reste à venir !

Merci pour votre patience.

Cela rajoute du travail, et mon manque de compétence pour l'instant risque de doubler voir tripler le temps de travail "classique" à sa réalisation...

pepe, j'ai du mal à mettre ta fonction parseInt() en application, je vais essayer d'incrémenter et décrémenter les vitesses ce serait plus simple...

J’y suis presque !

Encore un tout petit souci avec mon programme et la fonction parseInt !!!
Quand je tape 55, j’ai dans le port serie 5 (et ça fait bien tourner le moteur); à 233 il y a 33 qui ressort du port serie, en gros il me faut taper 2255 (ou nimporte quel chiffre devant la vitesse que je souhaite, et cela fonctionne, mais l’ideal est de pouvoir juste taper 233 et que ca puisse tourner à la vitesse 233… Sans oublier les ordres de fonctionnement de ma pompe ! Qu’est ce qui ne va pas :

void loop() {
 
  if (Serial.available()) //Si le port serie est disponible
{
 
int command = Serial.read(); 
 
if (command == 'O' || command == 'o') { //Allumage de la pompe, (S)tart
        digitalWrite(stopAndRun, LOW);
        Serial.println("Pompe On");
}
 
else if (command == 'S' || command == 's') { //Exctinction de la pompe, (S)top
        digitalWrite(stopAndRun, HIGH);
        Serial.println("Pompe Stop");
}
 
else if (command == 'H' || command == 'h') { //Sens de rotation, sens (H)oraire 
        digitalWrite(rotation, HIGH);
        Serial.println("Sens Horaire");
}
 
else if (command == 'A' || command == 'a') { //Sens de rotation, sens (A)nti-horaire
        digitalWrite(rotation, LOW);
        Serial.println("Sens Anti-horaire");
} 
 
    if (command >= 0 && command <= 255)  {  
    command = Serial.parseInt();  
    Serial.println(command);
    analogWrite(motorPin, command);
}
 
}

Voila c'est réglé, merci à tous pour votre aide.

Désormais je vais m'attaquer au PID. Je dois asservir ma pompe à une jauge de contrainte, or, il
n'est pas possible de faire ça avec avec un codeur, toutefois la précision de la pompe me parait suffisamment fiable (petit rappel : http://www.gilson.com/fr/AI/Products/8.47/Default.aspx#.WpbOCXyDO00), selon vous est il possible de m'attaquer à un asservissement en vitesse sans ce fameux codeur ?

Puis-je exporter mes sketchs arduino dans Processing (https://processing.org/examples/) sans aucun changement, histoire de faire une interface propre dans un fichier .exe une fois tout ça terminé ?

Bonne soirée

selon vous est il possible de m'attaquer à un asservissement en vitesse sans ce fameux codeur ?

pas "d'asservisement de vitesse" sans information en retour (feedback) sur la vitesse réelle.
Sans capteur de vitesse tu ne peux que supposer que la vitesse est égale à celle définie par le biais de l'entrée analogique de la pompe

La vitesse de la pompe est constante, et fiable. Est il possible de tenter l'asservissement (du coup ce n’est peut être pas en "vitesse" le bon terme), de sorte que la pompe accélère un peu ou décéléré en fonction du poids de la jauge, en partant du principe que la vitesse est respectée.

Je vois qu'il est possible d'asservir un actionneur autre qu'un moteur, (pelletier, résistance chauffante...), ces derniers ont bien qu'un feedback, celui du capteur de température ?

en fonction du poids de la jauge

Bonjour,
oui, bien sûr, il faut récupérer ce poids (comment ?) et le comparer à la valeur souhaitée

Je dois récupérer le poids avec une jauge de contrainte de ce type : Capteur de force 1 kg + interface SEN0160 DFRobot - Force | GO TRONIC

Pour laquelle j'ai déjà un programme qui me renvoi un poids relativement précis.

Pour être plus précis, les perturbations risquent de provenir du fait que le circuit fermé sera composée de deux pompes, (pompant mes deux poches de liquides), et ces deux pompes risquent d'être désynchronisée en vitesse l'une par rapport à l'autre.

Du coup au début ça risque de ne pas se voir, mais au bout d'un litre ou deux d’écoulement, l'une risque d'être plus remplie que l'autre, et c'est ce que je ne veux pas.

La perturbation serait donc mesurée par la perte de poids d'une poche en comparaison de l'autre avec ma jauge de contrainte (lien ci dessus), et en fonction, une des deux pompes accélère, ou décélère peu importe, pour ajuster le débit.

Voila, je suis un peu dans le vague encore avec ma problématique...

Bonjour,
la démarche me parait sensée !

Mais j'ai encore un peu de mal pour trouver le chemin, haha....

J'ai pensé modifier ce programme PID destiné à l'asservissement d'un moteur sous arduino pour coller avec mes besoins, comme specifié sur ce site : Asservissement en vitesse d’un moteur avec Arduino » Sciences et Techniques

Me lancer dans ce sens vous parait judicieux ?