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*/
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
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*/
Hi
Ich meine das *i>10* aus
>for (i=0;i>10;i++) /*sequenz 1*/
MfG Spess
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.
Den Wert * 1000 (oder einen anderen Faktor) und auf den DA Wandler damit.
Oder mache nach dem ganzen ein Breakpoint und schreibe die Werte im Debugger ab in eine Tabellenkalkulation und mache daraus eine Grafik.
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 !
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)
+ 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] |
+ 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 |
+ 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 | }
|
+ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.