Konzept einfachst-Drehmomentsensor

Diskutiere Konzept einfachst-Drehmomentsensor im Controller/Regler, Fahrerinformation, Elektronik Forum im Bereich Diskussionen;

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
E2679AD9-2F98-4EC4-A971-5230C0168B46.jpeg
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Gibts eigendlich einen Debugger für Arduino ? Ich kenne das von VBA und finde das sehr hilfreich: Einzelschritt, Werteüberwachung etc.

So sucht man immer im Dunkeln. Daher auch die PAS Led (soll später anderes machen).
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Du kannst doch den Vorwiderstand auf die GND Seite legen, wie von mir dargestellt, dann ist GND das Bezugspotential und du bekommst ein Signal zwischen 0 und 5V...
Das stimmt, aber ich habe eine vorhandene 12V Versorgung für Dauerlicht, und daran den Digispark und eben den Spannungsteiler angeschlossen.

Hätte auch die 5V vom Digispark nehmen können, aber zu spät geschnallt.
Da die Werte ja sowieso umgerechnet werden, ist eine Umkehrung nicht schwierig.
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Ich habe noch folgendes Problem:
Der Bootprozess läuft nicht zuende, wenn an PA3 oder PA4 eine Spannung (vom Spannungsteiler als Drehmomentsignal) anliegt.
Pin PA2 ist als Interrupt-pin für den PAS belegt und PA5 macht ein Reset, wenn Spannung oder GND anliegt.
Damit ist dann kein AnalogRead-Pin mehr frei und ich komme nicht weiter.
Ggf. muss ich auf ein anderes Board mit mehr Pins wechseln.

Was bei PA0 mit Aref gemeint ist, verstehe ich nicht.

F69B5C39-6CBD-4B8E-9CDC-ECB8E8488795.png
 

Hochsitzcola

Dabei seit
04.09.2009
Beiträge
3.564
Details E-Antrieb
Gazelle mit BionX IGH3 + OpenSource Firmware
Der Bootprozess läuft nicht zuende, wenn an PA3 oder PA4 eine Spannung (vom Spannungsteiler als Drehmomentsignal) anliegt.
?! bei mir macht das gar nichts, ich habe es gerade extra noch mal ausprobiert, egal ob ich PA3 auf GND oder auf +5V lege, der Prozessor startet ganz normal.
ggf. machen natürlich die Zener-Dioden auf PA3 und PA4 noch unerwartete Sachen, wenn die Spannung größer als die Sperrspannung von 3,6 V lt Schaltplan wird. Das sollte aber keinen Einfluß auf den Bootprozess haben, sondern nur die Spannung an deinem Spannungsteiler beeinflussen.

1618208747014.png



Gruß
hochsitzcola
 
Zuletzt bearbeitet:

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Gerade nochmal mit einem neuen Digispark getestet:

Am 5V Notebook USB:
Status: GND 5V+
Pin 3 fail ok
Pin 4 ok ok

Am 5V USB Netzteil (ohne Datenleitungen)
Pin 3 fail ok
Pin 4 fail ok


Ich versorge mit 12V am Vin und GND Pin. Keine Ahnung, ob das einen Einfluss hat.
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Und noch mal im Aufbau geprüft:

Status: GND 4,8V+
Pin 3 fail ok
Pin 4 ok fail


(leider funktionieren mehrere Leerzeichen hintereinander nicht, sodaß die Tabelle immer etwas verschoben aussieht)
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Ok, habe jetzt Pin3 (Taster) und PIN0 (Drehmomentsignal) getauscht.
Pin0 ging nicht für Drehmoment, da kein analogRead verfügbar.
Er bootet jetzt, es kommt auch ein Drehmomentsignal im Digispark an, Gasgriff-Berechnung muss noch angepasst werden. Soweit ok.

PIN3 an 4,8V bootet, aber er läßt sich nicht mehr beschreiben.
Dazu muss die Verbindung getrennt werden. Ist zwar nicht so praktisch, aber ok. Reicht erstmal.

Danke HSC :)
 

martin_155

Dabei seit
12.04.2021
Beiträge
1
Dennoch werden die Widerstände halt vom Wetter, von der Schmierung, von dem Alter, vom Schräglauf im gewählten Gang.... abhängen. Man müsste wohl ständig nachkalibrieren...
Guter Einwand :)
Man müsste eigentlich nur initial kalibrieren und dann noch einmal bei jedem Start. Vor jedem Losfahren den Widerstand ohne Kettenspannung messen und einmal mit Bremse gezogen und dem Körpergewicht (welches hinterlegt ist) auf einer Pedale.
Für Kettenschaltung wäre es in der Tat ideal, wenn der Gang noch bekannt wäre (über Shimano FlightDeck, Di2, o.ä.). Dann sollten initial aufgezeichnete Schrägläufe als Kalibrierung auch dieses Problem angehen können.
Wenn es denn dann wirklich mal regnet - tja, dann sind die Werte halt verhunzt, das hier soll ja nicht die eierlegende Wollmilchsau werden.

@bjp : ich finde die Idee super! Bin gespannt, ob es möglich ist, da was draus zu machen.
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
So, die Berechnung des Gasgriffsignals habe ich noch nicht ganz verstanden und habe sie zu Testzecken stark vereinfacht: Es werden jetzt einfach der Mittelwert der letzten 20 aufbereiteten Drehmomentsignale verwendet, Zeit bleibt unberücksichtigt.
Drehmomentsignal potentiell von 0-1023, da umgekehrt zur Kraft wird das mit -1 multipliziert und 1024 addiert. Damit gibts ansteigende Zahl zu ansteigenderKraft.

Anschliessend die 20 aufbereiteten Drehmomentwerte / (4x20) geteilt, da der Ausgang nur 255 Stufen hat und 20 Werte addiert wurden.

Das ganze ging zuerst sehr mäßig, die Widerstandswerte waren im unbelasteten/niedrig belasteten Bereich zwischen 5k und 15k Ohm schwankend.

Gebracht hat es Caramba Kettenspray !!!, wodurch ein deutlich weicheres Verhalten entstanden ist: Widerstand sinkt und steigt viel enger an die Pedallast angelehnt.

Jetzt noch mal ein Video:
Links analoge Spannungswerte, die vom Spannungsteiler über die Kette in den Digispark eingespeisst werden.
Rechts digital verarbeite Werte wie oben beschrieben (Später: Gasgriff)

Die Werte sind noch nicht angepasst, da ist noch Programmierung erforderlich, aber das grundsätzliche Prinzip wird erkennbar.
Ausbremsen gegen Pedalkraft am Ende im Video.

 
Zuletzt bearbeitet:

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Spricht etwas dagegen, den PAS Sensor parallel am Digispark und am Controller anzuschliesen?
Dann könnte ich, wenn die Kettenkraftsteuerung Probleme bereitet, unterwegs immer noch auf reinen PAS Betrieb umstellen - und ich würde dadurch nicht liegenbleiben.

Müsste ja eigendlich nur die Signalleitung an beide Anschlüsse legen.

——————

Generelle elektronische Frage: Controller und Digispark haben ja eigenständige 5 Volt Versorgungen, beide vermutlich über Spannungswandler mit PWM.
Kann man die 5 Volt der beiden dann einfach zusammenschließen oder gibts dabei unangenehme Nebenwirkungen ?
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Ich auch, könnte heute vielleicht klappen.
Ich musste die Elektronik aus dem Controllerfach Akku rausnehmen, weil ich da so schlecht dran komme um ein neues Program aufzuspielen. Mit USB-Kabel klappte nicht.
Also alles noch mal neu in einer alten Rückleuchte. So kann ich den Digispark einfach rausnehmen und einen anderen einsetzen. Wohne auf der 2.Etage und so ist es deutlich praktischer.
7F88BC39-60E0-4321-9BCD-78E599F08374.jpeg
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
So, erste Probefahrt gemacht, aber noch zuviel Fehler, um Erfolg zu melden.
Ich fahre einen KT-Sinus-Controller mit max 14 Ampere am Bafang G310. Parameter P4=0 und C4=3 sind eingestellt.

Habe das PAS vom Controller mit Strom versorgt, das Signal geht zum Controller und zum Digispark.
Gas vom Digispark geht als einzelne Signalleitung an den Controller, ausgehend davon, daß der Controler nur das Signal braucht und +/- ihm egal ist.
Edit: Das analoge Signal von der Kette skaliert relativ gleichmäßig von 3,1 Volt ( ohne Last ) bis 0,04 Volt ( volle Last ).

Beim Digispark funktioniert:
1. PAS
2. Timeout, wenn nicht getreten wird.
3. Gassteuerung geht, aber nicht wie gewünscht.

Es kommen folgende Fehler
1. ab und zu meckert der Controller "Info_1", was auf Probleme mit dem Gaseingang deutet.
Dies kommt vermutlich daher, daß ich den für den Controller zulässigen Min und/oder Max Wert des Gaseingang überschreite.
Aus dem Programm von Hochsitzcola entnehme ich ca. 0,5 und 4,2 Volt.

2. Die Gassteuerung geht etwa alle 3 Pedalumdrehungen auf volle Leistung, um dann langsam wieder abzufallen. Warum, ist mir nicht klar.

3. Der Controller schaltet sich immer mal wieder mit reinem "PAS-Betrieb" hinzu, also ohne Berücksichtigung des GAS-Signals, nur nach Leistungsstufen im Display.

4. Ab und zu hört das PAS im Digispark auf, warum weiss ich nicht.
Ggf. Konflikte mit dem Signalstrom vom Controller ?
Aus- und Einschalten geht dann erst wieder nach einer Weile.
Sicherungen Digispark ??

Edit: 5. Beim PAS habe ich eine 12er Magnetscheibe durch eine 10er ersetzt
Sensor ist gleich geblieben, ebenso die Einbauposition. Trotzdem erkennt der Controller jetzt nur das Rückwärtstreten als richtig Richtung an. Habe es im Controller entsprechend korrigiert ( von 7 au 2).
Warum das passiert? Vielleicht weil der Sensor gegen zwei Pullup-Widerstände arbeiten muss?

6. Es gibt noch weitere Ungereimtheiten, die ich aber noch nicht genauer beschreiben kann.

Etwa 10% der Strecke bin ich aber schon per Kraftsteuerung gefahren.

Hier mein aktueller Code (Baustelle, teilweise Versuchswerte eingetragen):

Code:
volatile unsigned int PASZaehler = 0;         // wird von Timer0 inkrementiert
volatile unsigned int PAS = 64000;            // Timertics zwischen zwei PAS-interrupts
volatile unsigned int PASTimeOut = 32000;     // Timertics bis zum Abschalten des Ausgang
volatile unsigned int SlowLoopZaehler = 0;    // wird von Timer0 inkrementiert
volatile unsigned int Torque_kumuliert = 0;   // aufsummiertes Drehmomentsignal
volatile unsigned int Torque_IST = 0;         // erfasstes Drehmomentsignal
volatile unsigned int Spannung_min = 10;        // ADC-Wert bei Drehmoment = 0 (0,5V -> muss an tatsächlichen Wert angepasst werden)
volatile unsigned int Spannung_max = 220;       // ADC-Wert bei maximalen Drehmoment  (4,2V -> muss an tatsächlichen Wert angepasst werden)
volatile unsigned int PASSignale360 = 10;      // Anzahl der PAS-Signale auf 360°, meist Anzahl der PAS-Magnete
volatile unsigned int VoltageMax = 600;          // Höchster gelesene Spannung am Krafteingang. Versuchswert 600 ~ 3 Volt.
volatile unsigned int VoltageMin = 50;        // niedrigste gelesene Spannung am Krafteingang. Versuchswert 50 ~ 0,5 Volt.
volatile unsigned int VoltageCurrent = 0;      // aktuell gelesene Spannung am Krafteingang.
int PASFunktion=0;
volatile unsigned long Spannung_Ausgang = 0;  // Wert PWM-Ausgang 0 ... 255
int CLevel[10] = { 10,20,30,50,100,200,300,500,700,1023 };    //Spannungsstufen Kette
int PLevel[10] = {100,95,90,85,80,75,70,65,60,};                //Powerlevel in Prozent

boolean PASFlag=0;


void setup() {
  pinMode(0, INPUT_PULLUP);     // Eingang Taster
  pinMode(1, OUTPUT);           // Ausgang Gasgriff
  pinMode(2, INPUT_PULLUP);     // Input PAS, external interrupt INT0
  pinMode(3, INPUT);            // Eingang Drehmomentsignal
  pinMode(4, OUTPUT);           // Ausgang LED

  // Timer0 on PB0 and PB1
  // Fast PWM, TOP=0xFF (WGM01, WGM00)

  TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
  TCCR0B = _BV(CS00);          //Prescaler 256 @ 16MHz -> 62,5 kHz PWM Frequenz
  OCR0B = 0;                   //Ausgang auf 0 setzen (LED aus)

  TIMSK |= (1 << TOIE0); //enable Timer0 overflow interrupt
  sei();
  attachInterrupt(0, PAS_Puls, CHANGE);      //INT0 ist Interruptquelle 2. Change: Interrupt bei jedem Flankenwechsel also 32 mal pro Kurbelumdrehung
}



void loop()
  {
  if(PASFlag)     //Bei jedem PAS-Puls Drehmomentsignal einlesen und über eine Kurbeldrehung mitteln
    {           
    PASFlag=0;
    VoltageCurrent = analogRead(3);
    //if (VoltageMax < VoltageCurrent)  VoltageMax = VoltageCurrent;
    //if (VoltageMin > VoltageCurrent) VoltageMin = VoltageCurrent;
    Torque_kumuliert = Torque_kumuliert - (Torque_kumuliert/20) +  map(VoltageCurrent,VoltageMin,VoltageMax,1023,0);
    }

  Spannung_Ausgang = map((Torque_kumuliert/20),0,1023,Spannung_min,Spannung_max);
  if(SlowLoopZaehler>640)                 // Ausgang mit 100Hz aktualisieren
      {
        SlowLoopZaehler=0;
        if (PASZaehler>PASTimeOut)
          {                                                 
          Spannung_Ausgang = 0;                                                         //Wenn sich Pedale nicht bewegen, Ausgang auf Null setzen
          if (Torque_kumuliert>0)Torque_kumuliert--;                                    //Torque_kumuliert langsam reduzieren, damit nach längerem Stand wieder bei Null gestartet wird
          }
        if (Spannung_Ausgang > 210) Spannung_Ausgang = 210;
        OCR0B = Spannung_Ausgang;                                                       //PWM Ausgang auf Pin1 (PB1) aktualisieren
      }
  }


ISR(TIMER0_OVF_vect)    //Interruptroutine Timer0
{
  if(PASZaehler<64000)PASZaehler++;
  SlowLoopZaehler++;
}

void PAS_Puls()                 //Interruptroutine IN0 (PAS)
{     
  if (PASFunktion == 0)
      {
      PASFunktion = 1;
      digitalWrite(4,HIGH);
      }
  else
      {
      PASFunktion = 0;
      digitalWrite(4,LOW);
      }
  PAS = PASZaehler;
  PASZaehler = 0;
  PASFlag = 1;

}
 
Zuletzt bearbeitet:

Hochsitzcola

Dabei seit
04.09.2009
Beiträge
3.564
Details E-Antrieb
Gazelle mit BionX IGH3 + OpenSource Firmware
daß der Controler nur das Signal braucht und +/- ihm egal ist.
Hast du denn GND vom Digispark mit GND vom Controller verbunden? Das ist essentiell! Wenn du einen nicht isolierten DC/DC-Wandler direkt am Akku benutzt, sollte das passen. Wenn du einen "guten" hast, der Ein- und Ausgang galvanisch trennt, muß du GND extra verbinden....

Gruß
hochsitzcola
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Ich verwende den unten abgebildeten. Direkt am Akku. GND ist nicht mit dem Controller verbunden. Könnte ich aber noch machen - bzw. einfach mal den Widerstand messen.
Dürfte keine galv. Trennung haben:

B166C1F4-87B0-4DEA-96A9-79B0F43A4074.jpeg
 

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Vermute, dass es in erster Linie Softwarefehler sind. Bin ja jetzt nicht soo der Experte - und mir fehlt das Debugging.

Werde mich mal um die im Digispark Wiki beschriebenen Möglichkeiten kümmern: https://digistump.com/wiki/digispark/tutorials/debugging

Die Digikeyboard Variante reicht ja ggf. schon, um ein paar Werte im Betrieb gezeigt zu bekommen.
Dazu brauchts dann aber einen Emulator: PAS-Signal und variables Torquesignal auf dem Breadboard. Dürfte aber mit einem Nano oder anderem Digispark machbar sein. So auf der Strasse, ggf. radfahrend mit Notebook in der Hand ist es etwas schwierig 😀.

Also: dauert alles noch etwas...., werde aber weiter berichten und gerne kommentare entgegennehmen.

Gruss, Bernd
 

PillePalle

Dabei seit
02.11.2008
Beiträge
518
Ort
S/W
Details E-Antrieb
Diverse Bafangs, BBS, Cute, Boschs, Puma/MAC
Debugger mit Arduino? Das hat mich immer abgeschreckt von dieser IDE.
Lieber gleich als ATmega in C mit AVR JTAG ICE3. Andere Welt. Kommt nicht an einen echten Debugger (Lauterbach etc. ) ran, aber immerhin.
Arduinos sind für Webdesigner mit Programmierambitionen.
Aber vielleicht hat sich dahingehend mittlerweile was getan. Für mich ist das seit 10 Jahren kein Thema mehr gewesen (bin aber leider auch zu nichts mehr gekommen).
 
Zuletzt bearbeitet:

bjp

Dabei seit
22.03.2012
Beiträge
514
Ort
Aachen
Details E-Antrieb
Go Swissdrive, Suntour HESC, MXUS XF18, G310
Ja, Debugger habe ich keinen prakikablen gefunden. Allerdings möchte ich ja gar nicht unbedingt "groß" einsteigen - insofern gehts erstmal "klein", langsam und mit manueller Fehlersuche weiter. Vielleicht auch, um festzustellen, daß ich das zukünftig nicht weiter machen will. Wäre auch ok.
Die beiden Drehspulinstrumente reichen auch zur "Verhaltensüberprüfung" beim Programmieren.


Momentaner Stand:
Habe aufgrund von @Hochsitzcola 's Hinweis mit der Zehnerdiode den Spannungsteiler auf 3,7 Volt reduziert, um nicht einen Bereich oberhalb von 3,7 Volt zu haben, der nicht erkannt wird.

Dann habe ich das Programm weiter auf meine Verständnislevel gestrippt - und bin heute ein paar Runden mit funktionierender Steuerung gefahren. Komfortabel ist anders - ich wollte aber erstmal erreichen, daß es überhaupt funktioniert. Das tut es jetzt.
Störungen seitens des Controllers sind weg.

Hier meine aktuelle Software - in erster Linie mal zum klar bekommen, was welcher Wert ist und was welchen Einfluß hat.

Code:
const int K_Faktor = 1023;
const int G_Faktor = 255;

const float A_UG = 3.0;     //Untergrenze Auswertebereich
const float A_OG = 1;       //Obergrenze Auswertebereich


//Fahrrad-Hardware:

// Spannungsteiler an 12V mit 750 Ohm und 330 Ohm erzeugt 3,7 Volt.
// Kette paralell zum 330 Ohm Widerstand erzeugt Spannungsabfall wie folgt(gemessen im Stand) :   
const float K_UG =3.7;        //Untergrenze Kraftsensor 3.7
const float K_OG=0.04;         //Obergrenze Kraftsensor 0.04

const float G_UG = 0.5;     //Untergrenze Gasausgang
const float G_OG = 4;       //Obergrenze Gasausgang

const float C_Min = 0.5;      //Controllergrenze Min
const float C_Max = 4.2;      //Controllergrenze Max

volatile unsigned int PASZaehler = 0;         // wird von Timer0 inkrementiert
volatile unsigned int PAS = 64000;            // Timertics zwischen zwei PAS-interrupts
volatile unsigned int PASTimeOut = 32000;     // Timertics bis zum Abschalten des Ausgang
volatile unsigned int SlowLoopZaehler = 0;    // wird von Timer0 inkrementiert


volatile unsigned int iA_UG;    //integer Werte werden im Programm Berechnet: 
volatile unsigned int iA_OG;
volatile unsigned int iG_UG;
volatile unsigned int iG_OG;
volatile unsigned int iC_Min;
volatile unsigned int iC_Max;

volatile unsigned int iG_IST = 0;         // erfasstes, konvergiertes Kraftsignal
volatile unsigned int iG_kumuliert = 0;   // aufsummiertes, konvergiertes Kraftsignal 
volatile unsigned int PAS360 = 20;      // Anzahl der PAS-Signale-Flankenänderung auf 360°, meist doppelte Anzahl der PAS-Magnete
volatile unsigned int Krafteingang;

int PASFunktion=0;
double iG_Korrektur;
volatile unsigned long Spannung_Ausgang = 0;  // Wert PWM-Ausgang 0 ... 255
boolean PASFlag=0;


void setup() {

  pinMode(0, INPUT_PULLUP);     // Eingang Taster 
  pinMode(1, OUTPUT);           // Ausgang Gasgriff
  pinMode(2, INPUT_PULLUP);     // Input PAS, external interrupt INT0
  pinMode(3, INPUT);            // Eingang Kraftsignal
  pinMode(4, OUTPUT);           // Ausgang LED


  

  // Timer0 on PB0 and PB1
  // Fast PWM, TOP=0xFF (WGM01, WGM00)

  TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
  TCCR0B = _BV(CS00);          //Prescaler 256 @ 16MHz -> 62,5 kHz PWM Frequenz
  OCR0B = 0;                   //Ausgang auf 0 setzen (LED aus)

  TIMSK |= (1 << TOIE0); //enable Timer0 overflow interrupt
  sei();
  attachInterrupt(0, PAS_Puls, CHANGE);      //INT0 ist Interruptquelle 2. Change: Interrupt bei jedem Flankenwechsel also 32 mal pro Kurbelumdrehung


iA_UG = int(A_UG/5*K_Faktor);
iA_OG = int(A_OG/5*K_Faktor);
iG_UG = int(G_UG/5*G_Faktor);
iG_OG = int(G_OG/5*G_Faktor);
iC_Min = int(C_Min/5*G_Faktor);
iC_Max =  int(C_Max/5*G_Faktor);
}



void loop()

  {
    PASFlag=1 ;
  if(PASFlag)     //Bei jedem PAS-Puls Kraftsignal einlesen und über eine Kurbeldrehung mitteln
    {              
    PASFlag=0; 
    Krafteingang = analogRead(3);
    if (Krafteingang > iA_UG) Krafteingang = iA_UG;
    if (Krafteingang < iA_OG) Krafteingang = iA_OG;
    
 //Umrechnung Kraftsignal zu Gassignal   
    iG_IST = map(Krafteingang,iA_UG,iA_OG,iG_UG,iG_OG); //-iA_OG)*(iG_OG-iG_UG)/(iA_OG-iA_UG)+iG_OG;     //=(Wert-AlteOG)*(NeueOG-NeueUG)/((AlteOG-AlteUG))+NeueOG = manuelle map-Funktion

    
    iG_kumuliert = iG_kumuliert - int(iG_kumuliert/PAS360) + iG_IST;

//      if (PASFunktion == 0) 
//      {
//      PASFunktion = 1;
//      digitalWrite(4,HIGH);
//      }
//  else
//      {
//      PASFunktion = 0;
//      digitalWrite(4,LOW);
//      }    
    }

  Spannung_Ausgang = iG_kumuliert/PAS360; // * sq(iG_Korrektur);          //Versuch eines exponentiellen Anstiegs
//        if (Spannung_Ausgang > iG_Max) Spannung_Ausgang = iG_Max;
//        if (Spannung_Ausgang < iG_Min) Spannung_Ausgang = iG_Min;

  
//OCR0B = Spannung_Ausgang;


  if(SlowLoopZaehler>640)                 // Ausgang mit 100Hz aktualisieren
      {  
        SlowLoopZaehler=0;
        if (PASZaehler>PASTimeOut)
          {                                                    
          Spannung_Ausgang = 0;                                                  //Wenn sich Pedale nicht bewegen, Ausgang auf Null setzen
          if (iG_kumuliert>0) iG_kumuliert=0; //--;                              //iG_kumuliert langsam reduzieren, damit nach längerem Stand wieder bei Null gestartet wird
          }
  
        if (Spannung_Ausgang > iC_Max) Spannung_Ausgang = iC_Max;
        if (Spannung_Ausgang < iC_Min) Spannung_Ausgang = iC_Min;
  
        OCR0B = Spannung_Ausgang;                                                        //PWM Ausgang auf Pin1 (PB1) aktualisieren 
    }
  }


ISR(TIMER0_OVF_vect)    //Interruptroutine Timer0
{
  if(PASZaehler<64000)PASZaehler++;
  SlowLoopZaehler++;
}

void PAS_Puls()                 //Interruptroutine IN0 (PAS)
{        

  PAS = PASZaehler;
  PASZaehler = 0;
  PASFlag = 1;
  
}
 
Thema:

Konzept einfachst-Drehmomentsensor

Konzept einfachst-Drehmomentsensor - Ähnliche Themen

OPTISCHER Drehmoment-Sensor, Fragen Teil 3: Liebe Leute, habe neulich Alv besucht und konnte dankenswerterweise sein Rad mit Drehmomentsensor, realisiert mit Wiegezelle unter der Kette...
Oben