Forum: Mikrocontroller und Digitale Elektronik RAMPE auf LPC1768 CortexM3 programmieren


von DIRK (Gast)


Lesenswert?

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*/

von spess53 (Gast)


Lesenswert?

Hi

>for (i=0;i>10;i++)               /*sequenz 1*/
           ^

>for (i=0;i>15;i++)             /*sequenz 2*/
           ^

Sicher, das das so gewollt ist? Macht für mich keinen Sinn.

MfG Spess

von DIRK (Gast)


Lesenswert?

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*/

von spess53 (Gast)


Lesenswert?

Hi

Ich meine das *i>10* aus

>for (i=0;i>10;i++)               /*sequenz 1*/

MfG Spess

von DIRK (Gast)


Lesenswert?

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.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Den Wert * 1000 (oder einen anderen Faktor) und auf den DA Wandler 
damit.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Oder mache nach dem ganzen ein Breakpoint und schreibe die Werte im 
Debugger ab in eine Tabellenkalkulation und mache daraus eine Grafik.

von DIRK (Gast)


Lesenswert?

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 !

von Benjamin (Gast)


Lesenswert?

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)

von Benjamin (Gast)


Lesenswert?

+

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]

von Benjamin (Gast)


Lesenswert?

+

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

von Benjamin (Gast)


Lesenswert?

+

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
}

von Benjamin (Gast)


Lesenswert?

+

EDIT: meine Rampe3 und die zweite schleife muss natürlich i++ zählen.

Sorry für den Spam, ich sollte mal meinen Login raus suchen :D

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.