INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Suche Hilfe für den Fehler in der Datei
31.10.2017, 23:15
Beitrag #1
Suche Hilfe für den Fehler in der Datei
Hallo,
ich suche eine Möglichkeit ein Resolversignal in ein Inkrementalsignal umzuwandeln.
Ich habe eine Bauanleitung mit einer *.pde Datei gefunden. Ich wollte die Datei mit Arduino für einen Nano kompilieren, leider funktioniert es nicht. Könnte sich jemand das mal ansehen und mir einen Tip geben wie ich das zum laufen bringen könnte.
Code:
// The encoder angle is measured as an angle fro 0 - 1023 "binary degrees".
// These arrays define at which angles the Hall signals H1 (Pin 2) H2 (pin 3) and H3 (pin 4) are high.
// H1 = {0, 171, 341, 512, 683, 853) would set the H1 pin high between 0-60, 120-180 and 240-300 degrees
// Which might suit a 3 pole motor.
// All three arrays must have the same number of elements set by the NUMSEGS constant.
// Angle-wrapping is not supported, 0 is always less then 1023.

// Quadrature signals are A (pin 5), B (pin 6), Z (pin 7)

// Resolver Cos+ is Analog(0), Sin+ is Analog(2)

// 31kHz PWM Sine wave excitation Pin11 (low pass filter / buffer required)


#include "avr/pgmspace.h"
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

const char NUMSEGS = 8;

int H1[] = {0, 171, 341, 512, 683, 853, 1025, 1025};
int H2[] = {114, 284, 455, 626, 796, 967, 1025, 1025};
int H3[] = {0, 58, 228, 398, 569, 740, 910, 1023};
byte i1;
byte i2;
byte i3;

// table of 256 sine values / one sine period / stored in flash memory
PROGMEM  prog_uchar sine16[]  = {127, 176, 217, 245, 255, 245, 217, 176, 128, 79, 38, 10, 0, 10, 38, 79, 127 };

PROGMEM prog_uchar arctan256[] = {
0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 16, 17, 18, 18, 19, 20,
20, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37,
38, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 46, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53,
54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69,
69, 70, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83,
84, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96,
96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 101, 102, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106,
106, 107, 107, 108, 108, 108, 109, 109, 110, 110, 110, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 115, 115,
115, 116, 116, 116, 117, 117, 118, 118, 118, 119, 119, 119, 120, 120, 120, 121, 121, 121, 122, 122, 122, 123, 123,
123, 124, 124, 124, 125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128
};

byte EP0[] = { B00000000, B00100000, B01100000, B01000000 };



volatile byte V[6]; // Analogue values
byte Z[6]; // Zero-offset values for each channel
volatile boolean F; // "You have new Volts" flag.

signed int Q; // Three Quadrature encoders
signed int A; // Three Angles
long Accum; // For zero-measurement

volatile byte index; // index to current mux channel

byte oldindex = 0; // Only do arctan if there is new data
// variables used inside interrupt service declared as voilatile
volatile byte icnt;              // var inside interrupt

void setup()
{
  DDRB = B00111111;      // PORTB as output
  DDRD = B11111100;      // PortD as output, except serial IO
  Serial.begin(115200);        // connect to the serial port
  Serial.println("Resolver to Hall Converter");

  
  //First populate the zero-volt value for each channel
  analogReference(EXTERNAL);
  for (int i = 0 ; i <= 5 ; i++) { // iterate through channels
    Accum = 0;
    for (int j = 1 ; j<=1000 ; j++) { // 1000 samples should do
      Accum = Accum + analogRead(i);
    }
    Z[i] = Accum / 4000; // 10-to-8 bitshift and 1000
    Serial.println(Z[i], DEC);
  }
  
  Setup_timer2();

  // disable interrupts to avoid timing distortion
  cbi (TIMSK0,TOIE0);              // disable Timer0 !!! delay() is now not available
  
  SetupADC();

}
void loop()
{
  sbi (TIMSK2,TOIE2);              // enable Timer2 Interrupt
  
  // Main loop
  
  while(1) {
      if (F)  // Only bother updating angle and Hall signals after a new angle measurement
      {
        F = false;
        A = arctan(V[0] - Z[0], V[3] - Z[3]);
        // Set the Hall Sensors
        i1 = i2 = i3 = 0;
        for (int n = 0 ; n < NUMSEGS; n++){
          if (A > H1[n]) i1++;
          if (A > H2[n]) i2++;
          if (A > H3[n]) i3++;
        }
        if (i1 & 1) sbi(PORTD, 2);
        else cbi(PORTD, 2);
        
        if (i2 & 1) sbi(PORTD, 3);
        else cbi(PORTD, 3);
        
        if (i3 & 1) sbi(PORTD, 4);
        else cbi(PORTD, 4);
      }
    // Count till the Quadrature counter equals the angle
    if ((Q < A && int(A - Q) < 512)  || int(Q - A) > 511 ) Q = (1023 & ++Q) ;
    else if ((Q > A  && int(Q - A) < 512) || int(A - Q) > 511)  Q = (1023 & --Q) ;
    PORTD = (PORTD & B10011111) | EP0[Q & 3];
    if (Q == 0) sbi(PORTD, 7);
    else cbi(PORTD,7);
    }
}
//******************************************************************
// timer2 setup
// set prscaler to 1, PWM mode to phase correct PWM,  16000000/510 = 31372.55 Hz clock
void Setup_timer2() {

  sbi (TCCR2B, CS20); // Timer2 Clock Prescaler to : 1
  cbi (TCCR2B, CS21);
  cbi (TCCR2B, CS22);

  // Timer2 PWM Mode set to Phase Correct PWM
  cbi (TCCR2A, COM2A0);  // clear Compare Match
  sbi (TCCR2A, COM2A1);

  sbi (TCCR2A, WGM20);  // Mode 1  / Phase Correct PWM
  cbi (TCCR2A, WGM21);
  cbi (TCCR2B, WGM22);
}

//Setup ADC
void SetupADC() {
// cbi(ADMUX, REFS1);
//cbi(ADMUX, REFS0); // External Aref
analogReference(EXTERNAL);
sbi(ADMUX, ADLAR); // Left-aligned for 8-bit data
cbi(ADMUX, MUX3);
cbi(ADMUX, MUX2);
cbi(ADMUX, MUX1);
cbi(ADMUX, MUX0); // Set the Mux to zero to begin

sbi(ADCSRA, ADEN); // Enable the ADC
cbi(ADCSRA, ADSC); // Don't start conversion yet
cbi(ADCSRA, ADATE); // No auto-trigger
cbi(ADCSRA, ADIF); // Not sure if that is possible or wise
sbi(ADCSRA, ADIE); // Conversion-complete Interrupt to process data
sbi(ADCSRA, ADPS2);
cbi(ADCSRA, ADPS1);
cbi(ADCSRA, ADPS0); // ADC Clock prescalar = 16
}

//******************************************************************
// Timer2 Interrupt Service at 31372,550 KHz = 32uSec
// this is the timebase REFCLOCK for the DDS generator

ISR(TIMER2_OVF_vect) {

  icnt= 15 & (++icnt); // Choose the next value from the lookup table, with wrap

  OCR2A=pgm_read_byte_near(sine16 + icnt);  // Set the PWM duty for this cycle

  if (icnt == 5 || icnt==7 ) {
    sbi(ADCSRA, ADSC);  // Start Conversion
  }
}

// ADC Conversion Complete Interrupt
ISR(ADC_vect) {
V[index] = ADCH; //get the data
F = true;
index = (index == 0) ? index = 3 : index = 0 ; // swap between active channels
ADMUX = (ADMUX & B11110000) | index; // set the ACDC channel
}

// Lookup-Table based Arctan function

int arctan(int V1, int V2) {
  //Handle the quadrants explicitly
  if (V1 < 0)
  {
    if (V2 < 0)
    {
      if (V1 < V2) // 180-225
      {
        return 512 + pgm_read_byte_near(arctan256 + 256 * V2 / V1);
      }
      else // 225-270
      {
        return 768 - pgm_read_byte_near(arctan256 + 256 * V1 / V2);
      }
    }
    else // V2 => 0
    {
      if (-V1 < V2) // 90-135
      {
        return 256 + pgm_read_byte_near(arctan256 - 256 * V1 / V2);
      }
      else // 135-180
      {
        return 512 - pgm_read_byte_near(arctan256 - 256 * V2 / V1);
      }
    }
  }
  else // V1 => 0
  {
    if (V2 < 0)
    {
      if (V1 < -V2) // 270-315
      {
        return 768 + pgm_read_byte_near(arctan256 - 256 * V1 / V2);
      }
      else // 315-360
      {
         return 1024 - pgm_read_byte_near(arctan256 - 256 * V2 / V1);
      }      
    }
    else // V2 => 0
    {
      if (V1 < V2) // 45-90
      {
        return 256 - pgm_read_byte_near(arctan256 + 256 * V1 / V2);
      }
      else // 0-45
      {  
        return pgm_read_byte_near(arctan256 + 256 * V2 / V1);
      }      
    }  
  }
}
Ich bin wohl leider nicht in der Lage den Fehler zu beheben.
Vielen Dank für jede Antwort

Hans
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.10.2017, 23:28
Beitrag #2
RE: Suche Hilfe für den Fehler in der Datei
Was heißt, es funktioniert nicht ?

Gibt es denn eine Fehlermeldung ?
Wenn ja, kannst du die auch posten ?
Und hast du den Autor schon angeschrieben ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
31.10.2017, 23:29
Beitrag #3
RE: Suche Hilfe für den Fehler in der Datei
Hallo Hans,

ersetze die Zeile:
Code:
PROGMEM  prog_uchar sine16[]  = {127, 176, 217, 245, 255, 245, 217, 176, 128, 79, 38, 10, 0, 10, 38, 79, 127 };
durch:
Code:
static const uint8_t sine16[] PROGMEM  = {127, 176, 217, 245, 255, 245, 217, 176, 128, 79, 38, 10, 0, 10, 38, 79, 127 };

und die Zeile:
Code:
PROGMEM prog_uchar arctan256[] = {
durch:
Code:
static const uint8_t arctan256[] PROGMEM  = {

Der Umgang mit PROGMEM hat sich seit .pde geändert.
Berichte mal ob es läuft!

Gruß
Arne

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 08:08
Beitrag #4
RE: Suche Hilfe für den Fehler in der Datei
Hallo Arne,
vielen Dank für deine Hilfe. Das Kompilieren hat funktioniert. Es gibt im unteren Fenster noch eine orangene Meldung, ich habe aber wieder vergessen wie man aus diesem Fenster was kopiert. Wenn es mir wieder einfällt stelle ich die Meldung noch ein. Als nächstes werde ich es mal in der Schaltung ausprobieren.
Nochmals vielen Dank

Hans
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 11:47
Beitrag #5
RE: Suche Hilfe für den Fehler in der Datei
Hallo Hans,
schön dass der Kompiler nicht mehr mit Fehler aussteigt.
Bei mir übersetzt es fehlerfrei, aber das hängt auch von der IDE Version und den Einstellungen ab.

Eine rote Zeile bekomme ich auch, das ist aber nur eine Info.
Code:
Archiving built core (caching) in: C:\Users\...\AppData\Local\Temp\arduino_cache_216473\core\core_arduino_avr_pro_c​pu_16MHzatmega328_2cd95cfddcfa1e6be30a1724df5ad583.a
Der Sketch verwendet 3310 Bytes (10%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 294 Bytes (14%) des dynamischen Speichers, 1754 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Archiving built core ... ist dabei in roter Schrift.

Den Meldungstext konnte ich mit der Maus markieren, mit Ctrl-C kopieren und mit Ctrl-V hier einfügen.

Gruß
Arne

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.11.2017, 14:26
Beitrag #6
RE: Suche Hilfe für den Fehler in der Datei
Hallo Arne,
diese Meldung hatte ich gemeint. Jetzt weiß ich auch wieder wie man aus diesem Fenster was rauskopiert.

Vielen Dank

Hans
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  DCF77 Fehler beim Kompilieren Xwill 5 404 11.06.2019 21:47
Letzter Beitrag: Tommy56
  [includes]Wie gebe ich den Pfad der .h-Datei richtig an ManniP 6 343 28.04.2019 09:29
Letzter Beitrag: Fips
  Oled 0.91 wechselnde Anzeige . Benötige hilfe MotD 6 586 24.03.2019 22:48
Letzter Beitrag: Bitklopfer
  Einfache IF-Abfrage....(mir) unerklärlicher Fehler Lite 10 468 24.03.2019 12:36
Letzter Beitrag: Lite
  Simon Says bzw. Senso - Spiel bitte Hilfe Riddle 3 454 15.03.2019 13:46
Letzter Beitrag: Tommy56
  Fehler in Beispielen MCP23S17 Blende8 0 249 03.03.2019 10:22
Letzter Beitrag: Blende8
  Hilfe benötigt beim Verknüpfen von Klassen Batucada 7 556 02.03.2019 23:47
Letzter Beitrag: georg01
  Lokale Variable an loop zurück - Fehler Haukini 3 388 26.02.2019 22:33
Letzter Beitrag: Haukini
  Hilfe bei Formulierung der Frage Matt 3 473 23.02.2019 12:45
Letzter Beitrag: Tommy56
  Frage zur Datei "preferences.txt" daja64 5 390 17.02.2019 21:00
Letzter Beitrag: amithlon

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste