RAMPE auf LPC1768 CortexM3 programmieren

Gast #2509846
Hallo zusammen !
ich programmiere zur Zeit auf einem Microkontroller LPC1768 eine rampe,
die aus drei Sequenzen besteht. Aber irgendwie beim Compilieren habe ich
immer( wenn ich auf dem Oscilloscope anschaue) die drei Sequenzen(
Spannungsverlauf) die gleichzeitig auftreten. Und nicht nacheinander,
wie das sein sollte. Ich habe mehr mals versucht, den Timer richtig
einszustellen. klapp aber leider nicht !
könnte einer von euch mir helfen oder eine Idee geben, wie ich das
machen könnte.Es wäre Lieb !

ich meine die erst, die zweite Sequenz ... usW.
 da habe ich erst den code für die  Steigung der drei Sequenzen der
Rampe geschrieben.

 for (i=0;i>10;i++)               /*sequenz 1*/
   {
     tab1[i]= (i*0.08)+2 ;
   }                           /* speichert die 10 punkte(werte)*/

 for (i=0;i>15;i++)             /*sequenz 2*/
   {
     tab2[i]= Cst ;            /*konstante wert*/
   }                           /* speichert die 10 punkte(werte)*/

  for (i=10;i > 0;--)            /*sequenz 3*/

   {
     tab3[i]= (i*0.048)+2 ;      /*fallende Flanke*/
Gast #2509903
spess53 schrieb:
> Sicher, das das so gewollt ist? Macht für mich keinen Sinn.

Hi Spess53,
Klar das ist ein gedanken Fehler, ich meinte damit drei 
unterschiedlichen
Tabelle wo die Werte der Sequenzen gespeichert sein sollten. Sonst !

int i,j,k ;

for (i=0;i>10;i++)               /*sequenz 1*/
   {
     tab1[i]= (i*0.08)+2 ;
   }                           /* speichert die 10 punkte(werte)*/

 for (j=0;j>15;j++)             /*sequenz 2*/
   {
     tab2[k]= Cst ;            /*konstante wert*/
   }                           /* speichert die 10 punkte(werte)*/

  for (k=10;k > 0;--)            /*sequenz 3*/

   {
     tab3[k]= (i*0.048)+2 ;      /*fallende Flanke*/
Gast #2509940
spess53 schrieb:
> Hi
>
> Ich meine das *i>10* aus
>
>>sorry !!!!!!!!1   das ist viel Stress

klar (i=0;i<10;i++)

hast du ein idee, wie ich die sequenzen am ausgeben kann. Damit Sie in 
der richtigen Folge (nacheinander)am Oscilloscope auftreten können.
Gast #2509991
hallo Markus!

Markus Müller schrieb:
> Den Wert * 1000 (oder einen anderen Faktor) und auf den DA Wandler
> damit

das hatte ich schon gemacht. aber ich hatte troztdem ein Problem beim 
auslesen. die Sequenzen auftauchen gleichzeitig! oder bei anderem 
Versuch schrieb die dritte die anderen Sequenzen über.
weiß ich wirklich nicht ! liegt das am Timer ? oder

s0! mit einem DA-wandler 10bit  der 1024 werte rechnen kann /*0x200 
offset*/

for (i = 0; i < 12; i++)
       {
       seq_0[i]= (uint16_t)((i /12.5)*0x200) + 0x200;
       };

for (j=....)
.
.
for(k=....)

/* Ausgang an DA-wandler, wo "Counter" die Werte in jeder Tabelle 
annimmt*/

if(counter0<=(11))
  {
   LPC_DAC->DACR = (tab1[counter0] << 6) | DAC_BIAS;  /*DAC-OUt sequence 
0

       if(counter0 == 0)
          {
      counter0 = 11;
          }
  else
          {
      counter0--;
          };
  };

/* usw für die zwei letzten Sequenzen */ aber wie gesagt tritt nicht 
nacheinander auf.  HILFE !
Gast #2510765
Warum eigentlich 3 tabellen, ich hätte das jetzt so gemacht:

1
uint8 gau8_tab[30]; //gau8_ -> global array aus uint8
2

3
void InitTabelle(void)
4
{
5
  uint8 i; //bei einfachen zählern kann man ruhig auf den u8_ vorsatz verzichten
6
  //rampe1
7
  for(i=0; i<10; i++)
8
  {
9
    gau8_tab[i] = (i*0.08)+2;
10
  }
11
  //rampe2
12
  for(i=20; i<30; i++)
13
  {
14
    gau8_tab[i] = KONSTANTE;
15
  }
16
  //rampe3
17
  for(i=30; i<20; i--)
18
  {
19
    gau8_tab[i] = (i*0.048)+2;
20
  }
21
}
22

23
void ISR_TimerX(void)
24
{
25
  static uint8 u8_pos = 0u; //static damit der Wert beim nächsten auffruf noch bekannt ist
26

27
  if( u8_pos == 29u )
28
  {
29
    u8_pos = 0u; //wenn die Rampe dann neu starten soll ???
30
  }
31
  else
32
  {
33
    u8_pos++; //nächster wert
34
  }
35
  
36
  //jetzt wird gau8_tab[u8_pos] an den DAC übergeben:
37
  LPC_DAC->DACR = (gau8_tab[u8_pos] << 6) | DAC_BIAS; //das musst du wissen ob es so stimmt
38
}

(hab jetzt nicht compiliert aber sollte funzen)
Gast #2510781
+

InitTabelle() kommt dann in den Startcode, also bevor du Timer und DAC 
konfigurierst sollte das aufgerufen werden. Zum ändern der Tabelle 
kannst du dann andere Funktionen schreiben, falls das nötig ist.

Danach wird nur noch die InterrruptServiceRoutine "ISR_TimerX()" 
aufgerufen.

Um Quellcode hier im Forum einzufügen gibts übrigens das:
1
[c]C-Code[/c]
Gast #2510792
+

ich sehe gerade deine Berechnung verwendet float-Werte, das dürfte so 
nicht funktionieren.

welchen Datentyp hat den "LPC_DAC->DACR"

vielleicht sowas:
1
gau8_tab[i] = (SOLLWER/10u)* i + OFFSET; //10u = Anzahl der Schritte; SOLLWERT ist dann der Wert des geraden Abschnitts
Gast #2510803
+

noch ne kleine korrektur für rampe2:
1
for(i=10; i>0; i--)
2
{
3
    gau8_tab[19+i] = (SOLLWER/10u) * i + OFFSET;
4
}

oder
1
for(i=0; i<10; i--)
2
{
3
    gau8_tab[20+i] = (SOLLWER/10u) * (9u-i) + OFFSET;
4
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.