Hallo Leute,
ich bin nicht sonderlich geübt im Umgang mit uC Programmierung und
verwende den uC nur als Mittel zum Zweck, um mir eine Sinus PWM zu
erzeugen.
Nun ist es so, dass ich gerne die Amplitude der Referenzspannung
variabel halten möchte, um über den Modulationsgrad auf die gewünschte
Ausgangsspannung zu kommen.
Im Prinzip also wie folgt:
mit
von 0 bis 1 (nur eine Halbwelle verwendet aufgrund der Symmetrie) und
von 0 bis zum Wert des Compareregisters.
Anbei die Sinustabelle:
1
constdoublesineLookup[]=
2
{
3
0.00,
4
0.02,
5
0.03,
6
0.05,
7
0.06,
8
0.08,
9
0.09,
10
0.11,
11
0.13,
12
0.14,
13
0.16,
14
0.17,
15
0.19,
16
0.20,
17
0.22,
18
0.23,
19
0.25,
20
0.26,
21
0.28,
22
0.29,
23
0.31,
24
0.32,
25
0.34,
26
0.35,
27
0.37,
28
0.38,
29
0.40,
30
0.41,
31
0.43,
32
0.44,
33
0.45,
34
0.47,
35
0.48,
36
0.50,
37
0.51,
38
0.52,
39
0.54,
40
0.55,
41
0.56,
42
0.58,
43
0.59,
44
0.60,
45
0.61,
46
0.63,
47
0.64,
48
0.65,
49
0.66,
50
0.67,
51
0.68,
52
0.70,
53
0.71,
54
0.72,
55
0.73,
56
0.74,
57
0.75,
58
0.76,
59
0.77,
60
0.78,
61
0.79,
62
0.80,
63
0.81,
64
0.82,
65
0.83,
66
0.84,
67
0.84,
68
0.85,
69
0.86,
70
0.87,
71
0.88,
72
0.88,
73
0.89,
74
0.90,
75
0.90,
76
0.91,
77
0.92,
78
0.92,
79
0.93,
80
0.94,
81
0.94,
82
0.95,
83
0.95,
84
0.96,
85
0.96,
86
0.96,
87
0.97,
88
0.97,
89
0.98,
90
0.98,
91
0.98,
92
0.99,
93
0.99,
94
0.99,
95
0.99,
96
0.99,
97
1.00,
98
1.00,
99
1.00,
100
1.00,
101
1.00,
102
1.00,
103
1.00,
104
1.00,
105
1.00,
106
1.00,
107
1.00,
108
1.00,
109
1.00,
110
0.99,
111
0.99,
112
0.99,
113
0.99,
114
0.99,
115
0.98,
116
0.98,
117
0.98,
118
0.97,
119
0.97,
120
0.96,
121
0.96,
122
0.96,
123
0.95,
124
0.95,
125
0.94,
126
0.94,
127
0.93,
128
0.92,
129
0.92,
130
0.91,
131
0.90,
132
0.90,
133
0.89,
134
0.88,
135
0.88,
136
0.87,
137
0.86,
138
0.85,
139
0.84,
140
0.84,
141
0.83,
142
0.82,
143
0.81,
144
0.80,
145
0.79,
146
0.78,
147
0.77,
148
0.76,
149
0.75,
150
0.74,
151
0.73,
152
0.72,
153
0.71,
154
0.70,
155
0.68,
156
0.67,
157
0.66,
158
0.65,
159
0.64,
160
0.63,
161
0.61,
162
0.60,
163
0.59,
164
0.58,
165
0.56,
166
0.55,
167
0.54,
168
0.52,
169
0.51,
170
0.50,
171
0.48,
172
0.47,
173
0.45,
174
0.44,
175
0.43,
176
0.41,
177
0.40,
178
0.38,
179
0.37,
180
0.35,
181
0.34,
182
0.32,
183
0.31,
184
0.29,
185
0.28,
186
0.26,
187
0.25,
188
0.23,
189
0.22,
190
0.20,
191
0.19,
192
0.17,
193
0.16,
194
0.14,
195
0.13,
196
0.11,
197
0.09,
198
0.08,
199
0.06,
200
0.05,
201
0.03,
202
0.02,
203
};
Und anbei der Eintrag in das Register:
1
EPwm1Regs.CMPA.half.CMPA=amplitude*sineLookup[i];
mit diesem Code gibt mir der Compiler eine Fehlermeldung, allerdings
nichts Konkretes (siehe Bild).
Ich bin mir sicher, dass es daran liegt, dass das Ergebnis von
aplitude*sineLookup[i] eine Fließkommazahl ist, das Register allerdings
eine Ganzzahl benötigt.
Verwendet wird ein F28027 DSP von TI.
Ich habe schon nach Castings (int)... im Internet gesucht, aber nichts
hat so wirklich funktioniert.
Wie kann ich das am geschicktesten in einen Int umwandeln oder runden?
Für eure Hilfe bin ich sehr dankbar.
Gruß,
Alexander
Ist ein bischen eigenartig.
Denn Zeile 117 in deinem Code ist mitten in einem Kommentar.
Wie geht denn die Fehlermeldung dort weiter. bei 'Location' kann ich nut
lesen "line 117, exter..."
wie geht dort der Text weiter? Zieh dir doch mal die Spalte dort in den
Fehlermeldungen breiter, damit du das komplett lesen kannst.
Alexander schrieb:> mit diesem Code gibt mir der Compiler eine Fehlermeldung, allerdings> nichts Konkretes (siehe Bild).
Wie ich das lese, kommt die Meldung vom Linker. Der Compiler hat was
'zurechtgebastelt', dich aber vorher gewarnt!
Dirk B. schrieb:> Hallo,>> bei Deiner Tabelle würde ich sagen: Multiplikation mit 100...>> Grüße,> Dirk
Hi,
das könnte gut funktionieren. Allerdings habe ich dann bei der Amplitude
weniger Spielraum (da ich die Amplitude um den Faktor 100 kleiner habe.
Könnte aber sehr gut sein, dass es sich auf die gewünschte
Ausgangsspannung wenig auswirkt).
Karl Heinz schrieb:> Ist ein bischen eigenartig.> Denn Zeile 117 in deinem Code ist mitten in einem Kommentar.>> Wie geht denn die Fehlermeldung dort weiter. bei 'Location' kann ich nut> lesen "line 117, exter..."> wie geht dort der Text weiter? Zieh dir doch mal die Spalte dort in den> Fehlermeldungen breiter, damit du das komplett lesen kannst.
Siehe Anhang.
Ralf G. schrieb:> Dirk B. schrieb:>> bei Deiner Tabelle würde ich sagen: Multiplikation mit 100...>> und die Tabelle auf 90° begrenzen.
und symmetrisch machen! Sie fängt bei 0.00 an, hat dann 0.02 und am Ende
auch nochmal 0.02. Das riecht nach falsch.
Hat natürlich mit der Programmierung nichts zu tun. Extrathema
Alexander schrieb:>> Wie geht denn die Fehlermeldung dort weiter. bei 'Location' kann ich nut>> lesen "line 117, exter...">> wie geht dort der Text weiter? Zieh dir doch mal die Spalte dort in den>> Fehlermeldungen breiter, damit du das komplett lesen kannst.
Ist immer noch nicht komplett lesbar.
Dort steht ein Dateiname. Diese Datei kann man mal aufmachen und
reinschauen, was dort an der Zeile 177 steht.
Ich schätze mal, es hat was mit der Floating Point Arithmetik zu tun. Da
es eine Meldug vom Linker ist, wird halt die Floating Point nicht
komplett gelinkt worden sein, wenn überhaupt.
Was besagen die 3 Warnings?
RobWa schrieb:> Hi,>>> Alexander schrieb:>> 0.03,>> 0.02,>> };> ... ist das letzte Komma nach 0.02 nicht zuviel?
Ist wurscht.
Man darf da eines machen, muss es aber nicht machen.
Gerade wenn man Tabellen per Programm generiert, ist es oft praktisch,
dass man dieses letzte, eigentlich überflüssige, Komma machen darf.
Hi,
Ralf G. schrieb:> Schon mal mit den vorgegebenen Ganzzahlen probiert?
ich nehme an, dass du die Lookup Tabelle const int sineLookup[] meinst,
richtig?
Falls ja, damit funktioniert es super. Keine Fehlermeldung (obgleich die
Warnungen weiterhin vorhanden sind), die DSP Pins wackeln in dem
gewünschten Muster. Mein Wechselrichter funktioniert tadellos damit.
Falls du die Multiplikation mit 100 meinst, wie hier vorgeschlagen:
Beitrag "Re: Fließkommazahlen in Ganzzahlen umrechnen für Register"
Nein, das habe ich noch nicht ausprobiert. Muss gerade ein paar
Studenten betreuen.
Alexander schrieb:> ich nehme an, dass du die Lookup Tabelle const int sineLookup[] meinst
Ja.
Alexander schrieb:> Wie kann ich das am geschicktesten in einen Int umwandeln oder runden?
Damit hat sich das Problem ja erstmal deutlich verkleinert. Jetzt geht's
an die Warnungen...