So, folgendes Konzept jetzt, wäre nett wenns jemand überprüfen könnte:
Ich lege im externen Ram eine Tabelle an mit 100 Werten (Speicher Position: 0 - 99) damit ich keine Wurzelfunktion brauche.
Mein AD-Wandler liefert mir für meinen Schalter einen Digital Wert von 0-255.
Meine SPannweite in der die Motoren aus sind lege ich auf 54 fest. (Daraus ergibt sich utnere Hälfte 0-127, obere Hälfte 128-255)
D.h.: Schalter:
-Max. Stop! Max.
0 100| 54 |155 255
Jetzt gehts an die Berechnung. Folgende "Konstanten"-Adressen habe ich mir definiert:
Flag equ R4
ADSpeed1 equ 0h ; AD-Wandler eingelesene Geschwindigkeit, Interner Ram an Pos 0h
CalcSpeed1 equ 1h ; Berechnete Geschwindigkeit (0...100) an Pos 1h
Direction1 equ 3h
(Hier im Prinzip unnötig, aber der vollständigkeit halber nur mal kurz erwähnt
![:)](wcf/images/smilies/smile.png.pagespeed.ce.cw1CRsMB0z.png)
ADSpeed2 equ 4h
CalcSpeed2 equ 5h
Direction1 equ 6h
Jetzt gehts ans Berechnen, erstmal Pseudo Code:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
for(i = 100; i > 0 OR ADSpeed1 == i; --i)
{
int a = ADSpeed1 - i;
if(!a) ; a == 0
{
CalcSpeed1 = 100 - i;
Direction1 = 0/1; //Muss ich erst abchecken ist erstmal unrelevant..
Flag = 1;
}
}
if(Flag)
end.
for(i = 255; i > 155 OR ADSpeed1 == i; --i)
{
int a = ADSpeed1 - i;
if(!a) ; a == 0
{
CalcSpeed1 = i - 155;
Direction1 = 0/1; //Muss ich erst abchecken ist erstmal unrelevant..
Flag = 1;
}
}
if(!Flag)
CalcSpeed1 = 0;
|
Das war der Pseudocode zum berechnen, Assembler kommt noch.
Jetzt das ganze in ne anständige Zahl umwandeln, die ich in meine PWM-Register packen kann!!
|
Quellcode
|
1
2
|
// PWM Register-Werte stehen im externen Rom an stelle 0-99!
int pwm_reg_val = PWM_REG_VALUES[CalcSpeed1];
|
Die Schleifen sind so weil ich sie Assembler bedingt andersrum umsetzen muss..