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
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..