Commande non linéaire de servo.

PieM

Senior Member
Approche d'une courbe en S pour augmenter la progressivité autour de la zone neutre.
Aide à compenser en outre la non linéarité de la commande liée à la sortie sur palonnier.
Le calcul est basé sur une entrée 0 à 250 (readadc par ex.)
et une sortie standard 750 à 2250 µs

Code:
'==========================================
'Commande de servo: coube en S
'entree ana de 0 à 255 - 'sortie servo de 750 à 2250 µs
'La courbe en S et obtenue par combinaison de deux moities de parabole
'PieM
'===========================================
#picaxe 14M2
#no_data

symbol i_ana = C.4	        'input analogique 0-250
symbol o_servo = B.5	'out servo amplitude +/- 750 µs
symbol mil = 1500		'position neutre servo 1500 µs		

servo o_servo,150		 'init servo

'=============================
do
	readadc C.4, b1

	if b1 < 125 then
[INDENT]		w3= 125 - b1
		w3 = w3*w3/125*6
		w3 = mil - w3[/INDENT]
	else 
		w3 = b1 - 125
		w3 = w3*w3/125*6
		w3 = mil + w3
	endif

	w3 = w3/10 	'car w3 en µs
	servopos o_servo,w3

loop

2014-02-28 001.jpg
 
Last edited:

dje8269

Senior Member
Génial PieM , Je pense que ca va servir tres vite ca !!!

cela mérite quelques éclaircissement pour moi tout de même .

-Pkoi le "#no_data" ?
-J' ia du mal a comprendre le fonctionnement de la fonctions servo . J'ai pourtant lus la doc .lol . Je la relis et si je comprends toujours pas , je me permettrais de vous poser quelques questions dessus . !
 

PieM

Senior Member
-Pkoi le "#no_data" ?
-J' ia du mal a comprendre le fonctionnement de la fonctions servo . J'ai pourtant lus la doc .lol . Je la relis et si je comprends toujours pas , je me permettrais de vous poser quelques questions dessus . !
la directive no_data dit simplement qu'il n'y a pas de data à charger en mémoire au moment du téléchargement. ça fait gagner du temps !
Pour la cde servo, faut bien comprendre comment fonctionne un servo. L'instruction ne fait qu'envoyer des impulsion de 0.75 à 2.250 ms au servo toutes les 20 ms, et ce en tâche de fond.
 

PapyJP

Senior Member
Elegant ! Bravo
J' avais pensé à " la courbe du chien " et son image par rapport à (0,0).
J' ai testé sur Excel ... superbe.
On peut l'ajuster à souhait.
Malheureusement les Picaxes ne connaissent pas la fonction log népérien, nécessaire pour résoudre l' équation de cette courbe.
 
Last edited:

dje8269

Senior Member
faut bien comprendre comment fonctionne un servo
Je pense que ca c'est acquis !

L'instruction ne fait qu'envoyer des impulsion de 0.75 à 2.250 ms au servo toutes les 20 ms, et ce en tâche de fond.
Ca c'est pas acquis du tout .

car pour moi hein ..... le servo doit recevoir une impulsion toutes les 20 ms ok pour garder sa position , mais si les MAJ de sa position se font toutes les 80ms par exemple, bon du coup c'est comme s'il se mettait avec 60ms de retard .
En fait je me projette déjà dans la version 2 de la voiture,avec strachpad et tout le toutim ...... .
La tache de fond effectue un envoie de donnée au servo toute les 20ms . mais si la MAJ de la valeur de position est plus longue , car il y en auras des choses a faire pour l'esclave . jouer la musique(sirene) en pwm, allume et éteindre des leds pour le gyros , allumer ou eteindre les phares ; vérifier le courant moteur , vérifie la perte de signal, vérifier le basculement de la voiture ....... ca risque de prendre du temps tout ca non ?
 

PieM

Senior Member
Si le temps de réponse est critique, et bien on fait un programme en conséquence pour ne pas avoir de retard !
Pour ce problème, merci de revenir sur les sujets déjà abordés pour ta télécommande, sinon le forum entier va être consacré à ça ...
 

PieM

Senior Member
PieM,je ne comprends pas la formule : w3 = w3*w3/125*75/125*10.....pourquoi ne pas écrire directement : w3=w3*w3/75/10 ?
Parce que ça ne donne pas le même résultat ...
en fait la formule peut s'écrire w3*w3/125*6

Personnellement j'utilise une formule ou gamme d'entrée, gamme de sortie sont entièrement paramétrées, donc un peu ... lourde.
le 125 représente la demi variation de l'entrée numérique (0 - 250) que j'avais posé en paramètre. Et je l'ai laissé en entier.
Mais il est exact que l'on peut simplifier la formule si la gamme d'entrée est bien définie.
 
Last edited:

PieM

Senior Member
Je viens de le calculer aussi , ça marche, mais alors y'a -t-il une raison pour l'écrire :w3 = w3*w3/125*75/125*10
je l'ai dit : Mais il est exact que l'on peut simplifier la formule si la gamme d'entrée est bien définie.
j'ai mis la formule simplifiée dans le programme.
 
Top