nouvelles modification du code
/*
ce programme sert as controler un moteur DC en boucle fermer avec PID
le mouvement est detecter par un encodeur as quadrature en mode X4
deux entree nommee STEP et DIR permete le controle du moteur avec un
controleur classique de cnc
le code as ete cree pour un arduino nano avec port usb !
le port serie affiche la position courante de l'axe toute les secondes
ce code as ete fait avec l'aide de la communauter arduino et de ses librairie libre
toute utilisation de ce code ne peu etre commerciale .
pin utilisee:
entree Digitale D2 et D8 pour l'encodeur AB
entree Digitale D3 pour le STEP
entree Analogique A0 pour le DIR
sortie Digitale 9 et 10 pour le pont en H
sortie Digitale 4 pour l'activation du pont en H , possible mise as jour avec gestion
courant max moteur , entree enable securiter diverse
ATTENTION les valeur Kp, Ki, Kd, doivent etre ajustee selon votre moteur/encodeur/charge sur l'axe
en tant que tel il ne pourrais pas fonctionner correctement
Doctor_itchy
*/
#include <digitalWriteFast.h>
#include "Arduino.h"
//#include <PinChangeInt.h>
//#include <PinChangeIntConfig.h>
#include <PID_v1.h>
#define encoder0PinA 8 // encodeur A
#define encoder0PinB 2 // encodeur B
#define M1 9 // sortie pwm moteur A
#define M2 10 // sortie pwm moteur B
#define enable 4 // activation pont en H
double kp=5.2,ki=200,kd=0.010000;
//double kp=2.25,ki=0.25,kd=0;
double input=80, output=0, setpoint=180;
PID myPID(&input, &output, &setpoint,kp,ki,kd, DIRECT);
volatile long encoder0Pos = 0;
long previousMillis = 0; // enregistre la derniere position
long target1=0;
//pour le controle via ramps 1.4
bool newStep = false;
bool oldStep = false;
bool dir = false;
void setup() {
pinModeFast(encoder0PinA, INPUT);
pinModeFast(encoder0PinB, INPUT);
pinModeFast(3,INPUT);
digitalWrite(encoder0PinA,LOW);
digitalWrite(encoder0PinB,LOW);
digitalWrite(3,LOW);
pinModeFast(enable, OUTPUT);
pinModeFast(M1, OUTPUT);
pinModeFast(M2, OUTPUT);
digitalWrite(enable, HIGH);
//PCintPort::attachInterrupt(encoder0PinB,doEncoderMotor0,CHANGE); // permet l'utilisation du mode 4x de l'encodeur as desactiver si besoin mais demande une freq 4 x superieur 125hz
attachInterrupt(0, doEncoderMotor0, CHANGE); // pin de l'encodeur sur l'interruption 0 pin 2 (desactiver si le mode4x est activer!)
attachInterrupt(1, countStep, RISING); //entree step sur pin 3
TCCR1B = TCCR1B & B11111000 | B00000001; // frequence pwm pour la sortie , as changer si moteur bruyant
Serial.begin (115200);
//configuration du pid
myPID.SetMode(AUTOMATIC);
myPID.SetSampleTime(1); // code 2 si pcintport couper , code 1 si activer
myPID.SetOutputLimits(-255,255);
}
void loop(){
input = encoder0Pos;
setpoint=target1;
myPID.Compute();
pwmOut(output);
if(millis() > previousMillis+250 ) {Serial.print(encoder0Pos); Serial.print("->"); Serial.println(target1); previousMillis=millis(); }
if(Serial.available()) target1=Serial.parseInt();
}
void pwmOut(int out) {
if(out<0) { analogWrite(M1,0); analogWrite(M2,abs(out)); }
else { analogWrite(M2,0); analogWrite(M1,abs(out)); }
}
void doEncoderMotor0(){
if (((PIND&B0000100)>>2) == HIGH) {
if ((PINB&B0000001) == LOW) {
encoder0Pos-- ;
}
else {
encoder0Pos++ ;
}
}
else
{
if ((PINB&B0000001) == LOW) {
encoder0Pos++ ;
}
else {
encoder0Pos-- ;
}
}
}
void countStep(){
if (PINC&B0000001) target1++;
else target1--;
}
j'ai viré le pinchange qui devait théoriquement multiplier la résolution , ça bug trop il y as une perte de quelque pas , que je n'ai pas en mode classique ( qui offre quand meme 1000pas par tour avec un codeur 500pas
en mode console cela fonctionne tres tres bien (code "cr" suivis du nombre de pas , et code LF pour retour au zero ! ) et pas de perte de pas ! , par contre en mode step dir , il me perd toujours quelque pas quand je lui demande de grand déplacement , donc soit ma carte hycnc déconne ,soit le cablage entre les deux as des parasite, soit l'arduino ne suis pas as grande vitesse ! ( et en mode fastwrite pour les entrée ça ne change rien ! )
donc il me reste as revoir cette partie du code , mais bizzarement je n'avais pas constaté cette perte de pas en mode step dir la derniere fois ? , allez comprendre ^^