MikroRP: Vorbereitung zu Versuch 3

Gbi, Algo, Mikrorechner - alles was es eben so gibt

MikroRP: Vorbereitung zu Versuch 3

Beitragvon mabl » 12.05.2009 20:11

Dieses Mal wars ja mal richtig einfach... :mrgreen: Naja aus Gründen der Tradition:

Wovon hängt die Drehzahl des Schrittmotors im Praktikum ab?
Die Drehzahl hängt mit der Periodendauer des Sinus-Signals des DACs zusammen, welche wiederum direkt proportional zum Aufruf der Counter ISR ist. Diese ist wiederum proportional zu Timer_16_SMT_TIMER_PERIOD.

Wie wird die Drehrichtung des Schrittmotors festgelegt?
Es exisitiert eine globale Variable in timer16_smtint.asm welche festlegt ob man vorwärts oder Rückwärts in der LUT geht. Der Wert dieser Variable lässt sich über den in comlib definierten Befehl SMT_SetDirection festlegen.

Welche Funktion hat der Timer16_SMT in diesem Versuch?
Der Timer legt die Intervalle fest, mit denen ein neuer Wert aus der LUT am DAC ausgegeben wird.

Welche Auswirkungen hat eine zu geringe Periodendauer des Timer16_SMT?

Der Mikrocontroller arbeitet nicht mehr seinen normalen Programmablauf ab, sondern springt immer sofort wieder in die ISR, wodurch es aussieht als würder das Programm sich aufhängen.

Was ist ein Interrupt und durch welches Ereignis wird er in diesem Versuch ausgelöst?

Ein Interrupt ist eine gewollte Unterbrechung des regulären Programmablaufs um eine Aktion höherer Priorität durchzuführen. Der Prozessor springt hierbei auf fest vorgegbene Speicherstellen, und führt diese aus. In unserem Versuch wird ein Interrupt unteranderem durch den underflow des 16-Bit Timers Timer16_SMT ausgelöst.

Was ist eine ISR und wie wird sie gestartet bzw. aufgerufen?
Tritt ein Interrupt auf, so springt die CPU je nach Interrupt zu einer Bestimmten stelle im Speicher, von wo aus sie einen LCALL zu der eigentlichen ISR macht. Beendet wird die ISR mit reti.

Es ist zu beachten, das sowohl die globalen Interrupts, als auch die dieser spezielle Interrupt aktiviert sein müssen, bevor der Sprung ausgeführt wird.

Damit der Schrittmotor sich dreht, müssen an die beiden DA-Wandler ständig diskretisierte SIN-/COS-Werte übergeben werden. An welcher Stelle des Quelltextes sollten die entsprechenden Assemblerbefehle stehen, welche die DA-Wandler ansteuern?
In der ISR _Timer16_SMR_ISR des Counters , in der Datei timer16_smtint.asm

Warum sollte der Interrupt-Mode des Timer16_SMT in der SMT-Initialisierungsroutine nicht aktiviert werden?
Der Timer befindet sich noch nicht in einem fest Definierten zustand, da er noch nicht Initialisiert wurde. Er würde also evt. schon die ISR aufrufen, und so den regulären Programmablauf stoppen, wodurch er nie richtig initialisiert würde.

Mit welchem Wert für den DA-Wandler wird am Schrittmotor eine Spannung von Null Volt erreicht, so dass er still steht?
Für den Wert 31.

Wie kann der zurückgelegte Weg des Förderbandes bestimmt werden?

Durch Zählen der Löcher auf der Drehscheibe mit Hilfe einer Lichtschranke.

In welchen Variablen werden im PSoC-Baustein nach einem empfangenen Befehl die Befehlsnummer und die Parameterdaten abgespeichert?
Die Befehlsnummer wird in com_recvCommand, die Parameterdaten in com_recvParamData gespeichert.
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: MikroRP: Vorbereitung zu Versuch 3

Beitragvon mabl » 12.05.2009 20:40

Also da ich zu faul bin die Look-Up-Table wärend dem Praktikum zu baseln habe ich schnell ein kleines Python Programm geschrieben, was die für mich ausrechnet.

Code: Alles auswählen
from __future__ import division
from math import pi, sin

NUMBER_OF_ENTRIES = 2**6
DESCRETE_STATES_DAC = 62
FUNCTION_RANGE = 2*pi
FUNCTION_MAX_ABS_VAL = 1


descrete_vals = []
if __name__ == '__main__':
    print 'pos\tx\tf(x)\tDAC\tDAC(hex)'
    for pos in range(NUMBER_OF_ENTRIES):
        x = pos/NUMBER_OF_ENTRIES * FUNCTION_RANGE
        val = sin(x)
        descrete_val = int((val/FUNCTION_MAX_ABS_VAL)*\
                           (DESCRETE_STATES_DAC/2)+DESCRETE_STATES_DAC/2)
        descrete_vals.append(descrete_val)
       
        print '%i\t%0.3f\t%0.3f\t%i\t%x'%(pos, x, val, descrete_val, descrete_val)
   
    for div in range(NUMBER_OF_ENTRIES)[::8]:
        print 'db\t', ', '.join(['%02xh'%val for val in descrete_vals[div:div+8]])


In der Einstellung erzeugt es mir also 2^6 Tabelleneinträge:
Code: Alles auswählen
pos   x   f(x)   int   int(hex)
0   0.000   0.000   31   1f
1   0.098   0.098   34   22
2   0.196   0.195   37   25
3   0.295   0.290   39   27
4   0.393   0.383   42   2a
5   0.491   0.471   45   2d
6   0.589   0.556   48   30
7   0.687   0.634   50   32
8   0.785   0.707   52   34
9   0.884   0.773   54   36
10   0.982   0.831   56   38
11   1.080   0.882   58   3a
12   1.178   0.924   59   3b
13   1.276   0.957   60   3c
14   1.374   0.981   61   3d
15   1.473   0.995   61   3d
16   1.571   1.000   62   3e
17   1.669   0.995   61   3d
18   1.767   0.981   61   3d
19   1.865   0.957   60   3c
20   1.963   0.924   59   3b
21   2.062   0.882   58   3a
22   2.160   0.831   56   38
23   2.258   0.773   54   36
24   2.356   0.707   52   34
25   2.454   0.634   50   32
26   2.553   0.556   48   30
27   2.651   0.471   45   2d
28   2.749   0.383   42   2a
29   2.847   0.290   39   27
30   2.945   0.195   37   25
31   3.043   0.098   34   22
32   3.142   0.000   31   1f
33   3.240   -0.098   27   1b
34   3.338   -0.195   24   18
35   3.436   -0.290   22   16
36   3.534   -0.383   19   13
37   3.632   -0.471   16   10
38   3.731   -0.556   13   d
39   3.829   -0.634   11   b
40   3.927   -0.707   9   9
41   4.025   -0.773   7   7
42   4.123   -0.831   5   5
43   4.222   -0.882   3   3
44   4.320   -0.924   2   2
45   4.418   -0.957   1   1
46   4.516   -0.981   0   0
47   4.614   -0.995   0   0
48   4.712   -1.000   0   0
49   4.811   -0.995   0   0
50   4.909   -0.981   0   0
51   5.007   -0.957   1   1
52   5.105   -0.924   2   2
53   5.203   -0.882   3   3
54   5.301   -0.831   5   5
55   5.400   -0.773   7   7
56   5.498   -0.707   9   9
57   5.596   -0.634   11   b
58   5.694   -0.556   13   d
59   5.792   -0.471   16   10
60   5.890   -0.383   19   13
61   5.989   -0.290   22   16
62   6.087   -0.195   24   18
63   6.185   -0.098   27   1b


Und als Schmankerl noch automatisch den dazugehörigen Assemblercode, für die Tippfaulen :D
Code: Alles auswählen
db   1fh, 22h, 25h, 27h, 2ah, 2dh, 30h, 32h
db   34h, 36h, 38h, 3ah, 3bh, 3ch, 3dh, 3dh
db   3eh, 3dh, 3dh, 3ch, 3bh, 3ah, 38h, 36h
db   34h, 32h, 30h, 2dh, 2ah, 27h, 25h, 22h
db   1fh, 1bh, 18h, 16h, 13h, 10h, 0dh, 0bh
db   09h, 07h, 05h, 03h, 02h, 01h, 00h, 00h
db   00h, 00h, 00h, 01h, 02h, 03h, 05h, 07h
db   09h, 0bh, 0dh, 10h, 13h, 16h, 18h, 1bh


Cosinus ist dann zwar nur 90Grad phasenverschoben, das könnte man also auch aus der SIN Tabelle nehemen, aber wenn man noch genug Speicher hat...
Code: Alles auswählen
db   3eh, 3dh, 3dh, 3ch, 3bh, 3ah, 38h, 36h
db   34h, 32h, 30h, 2dh, 2ah, 27h, 25h, 22h
db   1fh, 1bh, 18h, 16h, 13h, 10h, 0dh, 0bh
db   09h, 07h, 05h, 03h, 02h, 01h, 00h, 00h
db   00h, 00h, 00h, 01h, 02h, 03h, 05h, 07h
db   09h, 0bh, 0dh, 10h, 13h, 16h, 18h, 1bh
db   1eh, 22h, 25h, 27h, 2ah, 2dh, 30h, 32h
db   34h, 36h, 38h, 3ah, 3bh, 3ch, 3dh, 3dh
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: MikroRP: Vorbereitung zu Versuch 3

Beitragvon stefanL » 14.05.2009 18:34

Also, als ich das Praktikum gemacht habe, war diese Tabelle bereits implementiert ^^
stefanL
 
Beiträge: 42
Registriert: 11.11.2008 22:13

Re: MikroRP: Vorbereitung zu Versuch 3

Beitragvon mabl » 14.05.2009 22:11

stefanL hat geschrieben:Also, als ich das Praktikum gemacht habe, war diese Tabelle bereits implementiert ^^

*ohne Worte*
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe


Zurück zu Informatik

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron