Forum: Mikrocontroller und Digitale Elektronik Sinus aus PWM - X-Mega Problem


von PWM-Laie (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Es gibt schon einige Beiträge zu diesem Thema, konnte aber die Lösung 
für mein Problem nirgendwo finden.
Ich will aus zwei PWM über eine H-Brücke einen Sinus erzeugen.
So weit so gut.
Ich benutze einen X-Mega128D3 und benutze die PWM-Ausgänge OCRA und OCRB 
am PortF.
Ich arbeite mit einer Sinustabelle in der die jeweiligen PWM-Werte drin 
stehen.
In Anlehnung an dieses Projekt:
http://www.mikrocontroller.net/articles/Wechselrichter

Nur, dass ich einen X-Mega benutze. Müsste aber meiner Meinung nach egal 
sein.
Jetzt schaut euch mal meine Bilder an. Ich habe Probleme bei der 
PWM-Erzeugung. Ich habe am Schluss meiner Halbwelle immer einen langen 
Impuls.
Wo kommt dieser her. Diesen langen Impuls sieht man natürlich auch nach 
dem Filter -> siehe Sinus Welle, da sind Überschwinger drin.

Meine Timer-Init:
1
void InitTimerF0(void)
2
{
3
  // Timer F0 als PWM-Timer initialisieren
4
  TCF0.CTRLA = 0b00000001;    // Frequenzteiler = 1
5
  
6
  TCF0.CTRLB = 0b00110011;    // Timer= Sigle Slope PWM; OCRA und OCRB einschalten
7
  //TCF0.CTRLB = 0b00110110;    // Timer= Dual Slope PWM(Top and Bottom); OCRA und OCRB einschalten
8
  //TCF0.CTRLB = 0b00110101;    // Timer= Dual Slope PWM(Top); OCRA und OCRB einschalten
9
  //TCF0.CTRLB = 0b00110111;    // Timer= Dual Slope PWM(Bottom); OCRA und OCRB einschalten
10
  TCF0.INTCTRLA = 0b00000011;    // OVF-Int einschalten auf High Level
11
  
12
  //TCF0.PER = 1250;        // Timer Top-Wert auf 1250 setzen, entspricht 0,0625 ms bei 20 MHz
13
  TCF0.PER = 2000;        // Timer Top-Wert auf 2000 setzen, entspricht 0,0625 ms bei 32 MHz
14
}

Jetzt habe ich mir das Datenblatt mal angeschaut (siehe Anhang). Kann es 
sein, dass mein Timer am Schluss der Halbwelle nochmals komplett 
durchläuft und am Schluss den Ausgang nochmals aktualisiert. Wenn ja, 
wie kann ich das verhindern?
Ich entschuldige mich schon mal für Infos die fehlen. Bitte einfach 
melden.

Danke

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

PWM-Laie schrieb:
> Kann es
> sein, dass mein Timer am Schluss der Halbwelle nochmals komplett
> durchläuft und am Schluss den Ausgang nochmals aktualisiert.

Sieht so aus. Du könntest versuchsweise deine PWM Werte mal 
(entsprechend gekürzt) parallel auf den DAC geben und damit 
sicherstellen, das du keine Werte ausserhalb der Tabelle auf die OC 
Register schreibst.

PWM-Laie schrieb:
> TCF0.CTRLB = 0b00110011;    // Timer= Sigle Slope PWM; OCRA und OCRB
> einschalten

Da blickt übrigens keiner durch. Schreib doch lieber sowas:
1
TCF0.CTRLA = ( TCF0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc;
denn dann weiss man, welche Sachen du setzen willst.

Alsdann ist es sinnvoll, die OC Werte in die CCABUF statt in CCA zu 
schreiben, damit beim nächsten Update die Werte sicher im CC Register 
stehen.
Hat der der D3 AWEX? Dann ist das noch eine gute Möglichkeit.

von Jens W. (jensw)


Lesenswert?

Du könntest mal den gesamten Sourcecode zeigen.
Hier sieht man nur die Initialisierung. Eine Aussage zu deinem Fehler 
ist damit alleine nicht möglich.
Hast du das Projekt zum Frequenzumrichter so übernommen?
Die Werte für den Sinus gehen da von 0 bis 4095.
Wenn du deinen Timer auf den Wert 2000 begrenzt kann das nicht gehen.
Was hast du da alles verändert?

Bitte alles posten, dann findet man diesen Fehler bestimmt recht 
schnell!

Gruß, Jens

von Horst M. (horst)


Lesenswert?

Matthias S. schrieb:
> Du könntest versuchsweise deine PWM Werte mal
> (entsprechend gekürzt) parallel auf den DAC geben

Xmega128D3 hat keinen DAC.

von PWM-Laie (Gast)


Lesenswert?

Jens W. schrieb:
> Du könntest mal den gesamten Sourcecode zeigen.
> Hier sieht man nur die Initialisierung. Eine Aussage zu deinem Fehler
> ist damit alleine nicht möglich.
> Hast du das Projekt zum Frequenzumrichter so übernommen?
> Die Werte für den Sinus gehen da von 0 bis 4095.
> Wenn du deinen Timer auf den Wert 2000 begrenzt kann das nicht gehen.
> Was hast du da alles verändert?
>
> Bitte alles posten, dann findet man diesen Fehler bestimmt recht
> schnell!
>
> Gruß, Jens

Ja ich hab die Sinustabelle angepasst. Hab eigentlich nicht übernommen.

Hier meine ISR:
1
ISR(TCF0_OVF_vect)
2
{
3
    
4
  //PORTF.OUT ^= (1<<4); // Testpin
5
    
6
  
7
  if(step >= 320)
8
    step=0; 
9
10
  if(step <= 160)
11
  {
12
    TCF0.CCA = sinustabelle32MHz[step];
13
  }    
14
  if(step >= 161)
15
  {
16
    TCF0.CCB = sinustabelle32MHz[step];
17
  }    
18
  
19
  step++;  
20
}

Und die Tabelle.
1
const unsigned int sinustabelle32MHz[321] ={
2
  0,  // Zeit: 0 ms -> Step: 0
3
  39,  // Zeit: 0,0625 ms -> Step: 1
4
  79,  // Zeit: 0,125 ms -> Step: 2
5
  118,  // Zeit: 0,1875 ms -> Step: 3
6
  157,  // Zeit: 0,25 ms -> Step: 4
7
  196,  // Zeit: 0,3125 ms -> Step: 5
8
  235,  // Zeit: 0,375 ms -> Step: 6
9
  274,  // Zeit: 0,4375 ms -> Step: 7
10
  313,  // Zeit: 0,5 ms -> Step: 8
11
  352,  // Zeit: 0,5625 ms -> Step: 9
12
  390,  // Zeit: 0,625 ms -> Step: 10
13
  429,  // Zeit: 0,6875 ms -> Step: 11
14
  467,  // Zeit: 0,75 ms -> Step: 12
15
  505,  // Zeit: 0,8125 ms -> Step: 13
16
  543,  // Zeit: 0,875 ms -> Step: 14
17
  581,  // Zeit: 0,9375 ms -> Step: 15
18
  618,  // Zeit: 1 ms -> Step: 16
19
  655,  // Zeit: 1,0625 ms -> Step: 17
20
  692,  // Zeit: 1,125 ms -> Step: 18
21
  729,  // Zeit: 1,1875 ms -> Step: 19
22
  765,  // Zeit: 1,25 ms -> Step: 20
23
  801,  // Zeit: 1,3125 ms -> Step: 21
24
  837,  // Zeit: 1,375 ms -> Step: 22
25
  873,  // Zeit: 1,4375 ms -> Step: 23
26
  908,  // Zeit: 1,5 ms -> Step: 24
27
  943,  // Zeit: 1,5625 ms -> Step: 25
28
  977,  // Zeit: 1,625 ms -> Step: 26
29
  1011,  // Zeit: 1,6875 ms -> Step: 27
30
  1045,  // Zeit: 1,75 ms -> Step: 28
31
  1078,  // Zeit: 1,8125 ms -> Step: 29
32
  1111,  // Zeit: 1,875 ms -> Step: 30
33
  1144,  // Zeit: 1,9375 ms -> Step: 31
34
  1176,  // Zeit: 2 ms -> Step: 32
35
  1207,  // Zeit: 2,0625 ms -> Step: 33
36
  1238,  // Zeit: 2,125 ms -> Step: 34
37
  1269,  // Zeit: 2,1875 ms -> Step: 35
38
  1299,  // Zeit: 2,25 ms -> Step: 36
39
  1329,  // Zeit: 2,3125 ms -> Step: 37
40
  1358,  // Zeit: 2,375 ms -> Step: 38
41
  1386,  // Zeit: 2,4375 ms -> Step: 39
42
  1414,  // Zeit: 2,5 ms -> Step: 40
43
  1442,  // Zeit: 2,5625 ms -> Step: 41
44
  1469,  // Zeit: 2,625 ms -> Step: 42
45
  1495,  // Zeit: 2,6875 ms -> Step: 43
46
  1521,  // Zeit: 2,75 ms -> Step: 44
47
  1546,  // Zeit: 2,8125 ms -> Step: 45
48
  1571,  // Zeit: 2,875 ms -> Step: 46
49
  1595,  // Zeit: 2,9375 ms -> Step: 47
50
  1618,  // Zeit: 3 ms -> Step: 48
51
  1641,  // Zeit: 3,0625 ms -> Step: 49
52
  1663,  // Zeit: 3,125 ms -> Step: 50
53
  1684,  // Zeit: 3,1875 ms -> Step: 51
54
  1705,  // Zeit: 3,25 ms -> Step: 52
55
  1725,  // Zeit: 3,3125 ms -> Step: 53
56
  1745,  // Zeit: 3,375 ms -> Step: 54
57
  1764,  // Zeit: 3,4375 ms -> Step: 55
58
  1782,  // Zeit: 3,5 ms -> Step: 56
59
  1799,  // Zeit: 3,5625 ms -> Step: 57
60
  1816,  // Zeit: 3,625 ms -> Step: 58
61
  1832,  // Zeit: 3,6875 ms -> Step: 59
62
  1848,  // Zeit: 3,75 ms -> Step: 60
63
  1862,  // Zeit: 3,8125 ms -> Step: 61
64
  1876,  // Zeit: 3,875 ms -> Step: 62
65
  1890,  // Zeit: 3,9375 ms -> Step: 63
66
  1902,  // Zeit: 4 ms -> Step: 64
67
  1914,  // Zeit: 4,0625 ms -> Step: 65
68
  1925,  // Zeit: 4,125 ms -> Step: 66
69
  1935,  // Zeit: 4,1875 ms -> Step: 67
70
  1945,  // Zeit: 4,25 ms -> Step: 68
71
  1954,  // Zeit: 4,3125 ms -> Step: 69
72
  1962,  // Zeit: 4,375 ms -> Step: 70
73
  1969,  // Zeit: 4,4375 ms -> Step: 71
74
  1975,  // Zeit: 4,5 ms -> Step: 72
75
  1981,  // Zeit: 4,5625 ms -> Step: 73
76
  1986,  // Zeit: 4,625 ms -> Step: 74
77
  1990,  // Zeit: 4,6875 ms -> Step: 75
78
  1994,  // Zeit: 4,75 ms -> Step: 76
79
  1997,  // Zeit: 4,8125 ms -> Step: 77
80
  1998,  // Zeit: 4,875 ms -> Step: 78
81
  2000,  // Zeit: 4,9375 ms -> Step: 79
82
  2000,  // Zeit: 5 ms -> Step: 80
83
  2000,  // Zeit: 5,0625 ms -> Step: 81
84
  1998,  // Zeit: 5,125 ms -> Step: 82
85
  1997,  // Zeit: 5,1875 ms -> Step: 83
86
  1994,  // Zeit: 5,25 ms -> Step: 84
87
  1990,  // Zeit: 5,3125 ms -> Step: 85
88
  1986,  // Zeit: 5,375 ms -> Step: 86
89
  1981,  // Zeit: 5,4375 ms -> Step: 87
90
  1975,  // Zeit: 5,5 ms -> Step: 88
91
  1969,  // Zeit: 5,5625 ms -> Step: 89
92
  1962,  // Zeit: 5,625 ms -> Step: 90
93
  1954,  // Zeit: 5,6875 ms -> Step: 91
94
  1945,  // Zeit: 5,75 ms -> Step: 92
95
  1935,  // Zeit: 5,8125 ms -> Step: 93
96
  1925,  // Zeit: 5,875 ms -> Step: 94
97
  1914,  // Zeit: 5,9375 ms -> Step: 95
98
  1902,  // Zeit: 6 ms -> Step: 96
99
  1890,  // Zeit: 6,0625 ms -> Step: 97
100
  1876,  // Zeit: 6,125 ms -> Step: 98
101
  1862,  // Zeit: 6,1875 ms -> Step: 99
102
  1848,  // Zeit: 6,25 ms -> Step: 100
103
  1832,  // Zeit: 6,3125 ms -> Step: 101
104
  1816,  // Zeit: 6,375 ms -> Step: 102
105
  1799,  // Zeit: 6,4375 ms -> Step: 103
106
  1782,  // Zeit: 6,5 ms -> Step: 104
107
  1764,  // Zeit: 6,5625 ms -> Step: 105
108
  1745,  // Zeit: 6,625 ms -> Step: 106
109
  1725,  // Zeit: 6,6875 ms -> Step: 107
110
  1705,  // Zeit: 6,75 ms -> Step: 108
111
  1684,  // Zeit: 6,8125 ms -> Step: 109
112
  1663,  // Zeit: 6,875 ms -> Step: 110
113
  1641,  // Zeit: 6,9375 ms -> Step: 111
114
  1618,  // Zeit: 7 ms -> Step: 112
115
  1595,  // Zeit: 7,0625 ms -> Step: 113
116
  1571,  // Zeit: 7,125 ms -> Step: 114
117
  1546,  // Zeit: 7,1875 ms -> Step: 115
118
  1521,  // Zeit: 7,25 ms -> Step: 116
119
  1495,  // Zeit: 7,3125 ms -> Step: 117
120
  1469,  // Zeit: 7,375 ms -> Step: 118
121
  1442,  // Zeit: 7,4375 ms -> Step: 119
122
  1414,  // Zeit: 7,5 ms -> Step: 120
123
  1386,  // Zeit: 7,5625 ms -> Step: 121
124
  1358,  // Zeit: 7,625 ms -> Step: 122
125
  1329,  // Zeit: 7,6875 ms -> Step: 123
126
  1299,  // Zeit: 7,75 ms -> Step: 124
127
  1269,  // Zeit: 7,8125 ms -> Step: 125
128
  1238,  // Zeit: 7,875 ms -> Step: 126
129
  1207,  // Zeit: 7,9375 ms -> Step: 127
130
  1176,  // Zeit: 8 ms -> Step: 128
131
  1144,  // Zeit: 8,0625 ms -> Step: 129
132
  1111,  // Zeit: 8,125 ms -> Step: 130
133
  1078,  // Zeit: 8,1875 ms -> Step: 131
134
  1045,  // Zeit: 8,25 ms -> Step: 132
135
  1011,  // Zeit: 8,3125 ms -> Step: 133
136
  977,  // Zeit: 8,375 ms -> Step: 134
137
  943,  // Zeit: 8,4375 ms -> Step: 135
138
  908,  // Zeit: 8,5 ms -> Step: 136
139
  873,  // Zeit: 8,5625 ms -> Step: 137
140
  837,  // Zeit: 8,625 ms -> Step: 138
141
  801,  // Zeit: 8,6875 ms -> Step: 139
142
  765,  // Zeit: 8,75 ms -> Step: 140
143
  729,  // Zeit: 8,8125 ms -> Step: 141
144
  692,  // Zeit: 8,875 ms -> Step: 142
145
  655,  // Zeit: 8,9375 ms -> Step: 143
146
  618,  // Zeit: 9 ms -> Step: 144
147
  581,  // Zeit: 9,0625 ms -> Step: 145
148
  543,  // Zeit: 9,125 ms -> Step: 146
149
  505,  // Zeit: 9,1875 ms -> Step: 147
150
  467,  // Zeit: 9,25 ms -> Step: 148
151
  429,  // Zeit: 9,3125 ms -> Step: 149
152
  390,  // Zeit: 9,375 ms -> Step: 150
153
  352,  // Zeit: 9,4375 ms -> Step: 151
154
  313,  // Zeit: 9,5 ms -> Step: 152
155
  274,  // Zeit: 9,5625 ms -> Step: 153
156
  235,  // Zeit: 9,625 ms -> Step: 154
157
  196,  // Zeit: 9,6875 ms -> Step: 155
158
  157,  // Zeit: 9,75 ms -> Step: 156
159
  118,  // Zeit: 9,8125 ms -> Step: 157
160
  79,  // Zeit: 9,875 ms -> Step: 158
161
  39,  // Zeit: 9,9375 ms -> Step: 159
162
  0,  // Zeit: 10 ms -> Step: 160
163
  39,  // Zeit: 10,0625 ms -> Step: 161
164
  79,  // Zeit: 10,125 ms -> Step: 162
165
  118,  // Zeit: 10,1875 ms -> Step: 163
166
  157,  // Zeit: 10,25 ms -> Step: 164
167
  196,  // Zeit: 10,3125 ms -> Step: 165
168
  235,  // Zeit: 10,375 ms -> Step: 166
169
  274,  // Zeit: 10,4375 ms -> Step: 167
170
  313,  // Zeit: 10,5 ms -> Step: 168
171
  352,  // Zeit: 10,5625 ms -> Step: 169
172
  390,  // Zeit: 10,625 ms -> Step: 170
173
  429,  // Zeit: 10,6875 ms -> Step: 171
174
  467,  // Zeit: 10,75 ms -> Step: 172
175
  505,  // Zeit: 10,8125 ms -> Step: 173
176
  543,  // Zeit: 10,875 ms -> Step: 174
177
  581,  // Zeit: 10,9375 ms -> Step: 175
178
  618,  // Zeit: 11 ms -> Step: 176
179
  655,  // Zeit: 11,0625 ms -> Step: 177
180
  692,  // Zeit: 11,125 ms -> Step: 178
181
  729,  // Zeit: 11,1875 ms -> Step: 179
182
  765,  // Zeit: 11,25 ms -> Step: 180
183
  801,  // Zeit: 11,3125 ms -> Step: 181
184
  837,  // Zeit: 11,375 ms -> Step: 182
185
  873,  // Zeit: 11,4375 ms -> Step: 183
186
  908,  // Zeit: 11,5 ms -> Step: 184
187
  943,  // Zeit: 11,5625 ms -> Step: 185
188
  977,  // Zeit: 11,625 ms -> Step: 186
189
  1011,  // Zeit: 11,6875 ms -> Step: 187
190
  1045,  // Zeit: 11,75 ms -> Step: 188
191
  1078,  // Zeit: 11,8125 ms -> Step: 189
192
  1111,  // Zeit: 11,875 ms -> Step: 190
193
  1144,  // Zeit: 11,9375 ms -> Step: 191
194
  1176,  // Zeit: 12 ms -> Step: 192
195
  1207,  // Zeit: 12,0625 ms -> Step: 193
196
  1238,  // Zeit: 12,125 ms -> Step: 194
197
  1269,  // Zeit: 12,1875 ms -> Step: 195
198
  1299,  // Zeit: 12,25 ms -> Step: 196
199
  1329,  // Zeit: 12,3125 ms -> Step: 197
200
  1358,  // Zeit: 12,375 ms -> Step: 198
201
  1386,  // Zeit: 12,4375 ms -> Step: 199
202
  1414,  // Zeit: 12,5 ms -> Step: 200
203
  1442,  // Zeit: 12,5625 ms -> Step: 201
204
  1469,  // Zeit: 12,625 ms -> Step: 202
205
  1495,  // Zeit: 12,6875 ms -> Step: 203
206
  1521,  // Zeit: 12,75 ms -> Step: 204
207
  1546,  // Zeit: 12,8125 ms -> Step: 205
208
  1571,  // Zeit: 12,875 ms -> Step: 206
209
  1595,  // Zeit: 12,9375 ms -> Step: 207
210
  1618,  // Zeit: 13 ms -> Step: 208
211
  1641,  // Zeit: 13,0625 ms -> Step: 209
212
  1663,  // Zeit: 13,125 ms -> Step: 210
213
  1684,  // Zeit: 13,1875 ms -> Step: 211
214
  1705,  // Zeit: 13,25 ms -> Step: 212
215
  1725,  // Zeit: 13,3125 ms -> Step: 213
216
  1745,  // Zeit: 13,375 ms -> Step: 214
217
  1764,  // Zeit: 13,4375 ms -> Step: 215
218
  1782,  // Zeit: 13,5 ms -> Step: 216
219
  1799,  // Zeit: 13,5625 ms -> Step: 217
220
  1816,  // Zeit: 13,625 ms -> Step: 218
221
  1832,  // Zeit: 13,6875 ms -> Step: 219
222
  1848,  // Zeit: 13,75 ms -> Step: 220
223
  1862,  // Zeit: 13,8125 ms -> Step: 221
224
  1876,  // Zeit: 13,875 ms -> Step: 222
225
  1890,  // Zeit: 13,9375 ms -> Step: 223
226
  1902,  // Zeit: 14 ms -> Step: 224
227
  1914,  // Zeit: 14,0625 ms -> Step: 225
228
  1925,  // Zeit: 14,125 ms -> Step: 226
229
  1935,  // Zeit: 14,1875 ms -> Step: 227
230
  1945,  // Zeit: 14,25 ms -> Step: 228
231
  1954,  // Zeit: 14,3125 ms -> Step: 229
232
  1962,  // Zeit: 14,375 ms -> Step: 230
233
  1969,  // Zeit: 14,4375 ms -> Step: 231
234
  1975,  // Zeit: 14,5 ms -> Step: 232
235
  1981,  // Zeit: 14,5625 ms -> Step: 233
236
  1986,  // Zeit: 14,625 ms -> Step: 234
237
  1990,  // Zeit: 14,6875 ms -> Step: 235
238
  1994,  // Zeit: 14,75 ms -> Step: 236
239
  1997,  // Zeit: 14,8125 ms -> Step: 237
240
  1998,  // Zeit: 14,875 ms -> Step: 238
241
  2000,  // Zeit: 14,9375 ms -> Step: 239
242
  2000,  // Zeit: 15 ms -> Step: 240
243
  2000,  // Zeit: 15,0625 ms -> Step: 241
244
  1998,  // Zeit: 15,125 ms -> Step: 242
245
  1997,  // Zeit: 15,1875 ms -> Step: 243
246
  1994,  // Zeit: 15,25 ms -> Step: 244
247
  1990,  // Zeit: 15,3125 ms -> Step: 245
248
  1986,  // Zeit: 15,375 ms -> Step: 246
249
  1981,  // Zeit: 15,4375 ms -> Step: 247
250
  1975,  // Zeit: 15,5 ms -> Step: 248
251
  1969,  // Zeit: 15,5625 ms -> Step: 249
252
  1962,  // Zeit: 15,625 ms -> Step: 250
253
  1954,  // Zeit: 15,6875 ms -> Step: 251
254
  1945,  // Zeit: 15,75 ms -> Step: 252
255
  1935,  // Zeit: 15,8125 ms -> Step: 253
256
  1925,  // Zeit: 15,875 ms -> Step: 254
257
  1914,  // Zeit: 15,9375 ms -> Step: 255
258
  1902,  // Zeit: 16 ms -> Step: 256
259
  1890,  // Zeit: 16,0625 ms -> Step: 257
260
  1876,  // Zeit: 16,125 ms -> Step: 258
261
  1862,  // Zeit: 16,1875 ms -> Step: 259
262
  1848,  // Zeit: 16,25 ms -> Step: 260
263
  1832,  // Zeit: 16,3125 ms -> Step: 261
264
  1816,  // Zeit: 16,375 ms -> Step: 262
265
  1799,  // Zeit: 16,4375 ms -> Step: 263
266
  1782,  // Zeit: 16,5 ms -> Step: 264
267
  1764,  // Zeit: 16,5625 ms -> Step: 265
268
  1745,  // Zeit: 16,625 ms -> Step: 266
269
  1725,  // Zeit: 16,6875 ms -> Step: 267
270
  1705,  // Zeit: 16,75 ms -> Step: 268
271
  1684,  // Zeit: 16,8125 ms -> Step: 269
272
  1663,  // Zeit: 16,875 ms -> Step: 270
273
  1641,  // Zeit: 16,9375 ms -> Step: 271
274
  1618,  // Zeit: 17 ms -> Step: 272
275
  1595,  // Zeit: 17,0625 ms -> Step: 273
276
  1571,  // Zeit: 17,125 ms -> Step: 274
277
  1546,  // Zeit: 17,1875 ms -> Step: 275
278
  1521,  // Zeit: 17,25 ms -> Step: 276
279
  1495,  // Zeit: 17,3125 ms -> Step: 277
280
  1469,  // Zeit: 17,375 ms -> Step: 278
281
  1442,  // Zeit: 17,4375 ms -> Step: 279
282
  1414,  // Zeit: 17,5 ms -> Step: 280
283
  1386,  // Zeit: 17,5625 ms -> Step: 281
284
  1358,  // Zeit: 17,625 ms -> Step: 282
285
  1329,  // Zeit: 17,6875 ms -> Step: 283
286
  1299,  // Zeit: 17,75 ms -> Step: 284
287
  1269,  // Zeit: 17,8125 ms -> Step: 285
288
  1238,  // Zeit: 17,875 ms -> Step: 286
289
  1207,  // Zeit: 17,9375 ms -> Step: 287
290
  1176,  // Zeit: 18 ms -> Step: 288
291
  1144,  // Zeit: 18,0625 ms -> Step: 289
292
  1111,  // Zeit: 18,125 ms -> Step: 290
293
  1078,  // Zeit: 18,1875 ms -> Step: 291
294
  1045,  // Zeit: 18,25 ms -> Step: 292
295
  1011,  // Zeit: 18,3125 ms -> Step: 293
296
  977,  // Zeit: 18,375 ms -> Step: 294
297
  943,  // Zeit: 18,4375 ms -> Step: 295
298
  908,  // Zeit: 18,5 ms -> Step: 296
299
  873,  // Zeit: 18,5625 ms -> Step: 297
300
  837,  // Zeit: 18,625 ms -> Step: 298
301
  801,  // Zeit: 18,6875 ms -> Step: 299
302
  765,  // Zeit: 18,75 ms -> Step: 300
303
  729,  // Zeit: 18,8125 ms -> Step: 301
304
  692,  // Zeit: 18,875 ms -> Step: 302
305
  655,  // Zeit: 18,9375 ms -> Step: 303
306
  618,  // Zeit: 19 ms -> Step: 304
307
  581,  // Zeit: 19,0625 ms -> Step: 305
308
  543,  // Zeit: 19,125 ms -> Step: 306
309
  505,  // Zeit: 19,1875 ms -> Step: 307
310
  467,  // Zeit: 19,25 ms -> Step: 308
311
  429,  // Zeit: 19,3125 ms -> Step: 309
312
  390,  // Zeit: 19,375 ms -> Step: 310
313
  352,  // Zeit: 19,4375 ms -> Step: 311
314
  313,  // Zeit: 19,5 ms -> Step: 312
315
  274,  // Zeit: 19,5625 ms -> Step: 313
316
  235,  // Zeit: 19,625 ms -> Step: 314
317
  196,  // Zeit: 19,6875 ms -> Step: 315
318
  157,  // Zeit: 19,75 ms -> Step: 316
319
  118,  // Zeit: 19,8125 ms -> Step: 317
320
  79,  // Zeit: 19,875 ms -> Step: 318
321
  39,  // Zeit: 19,9375 ms -> Step: 319
322
  0,  // Zeit: 20 ms -> Step 320 (Extraschritt wird für die saubere Abschaltung des OCR-Pins benötigt)
323
  
324
};

Das ist eigentlich alles.
Es ist bis jetzt nur ein Testprogramm. Keine Schnittstelle, kein ADC, 
kein Display. Der Controller macht nur die PWM-Ausgabe.

von PWM-Laie (Gast)


Lesenswert?

Matthias S. schrieb:
> Da blickt übrigens keiner durch. Schreib doch lieber sowas:TCF0.CTRLA =
> ( TCF0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV64_gc;
> denn dann weiss man, welche Sachen du setzen willst.

Ja ich weiß. Hab aber schon so viel probiert, da war das einfacher.

von PWM-Laie (Gast)


Lesenswert?

Matthias S. schrieb:
> Alsdann ist es sinnvoll, die OC Werte in die CCABUF statt in CCA zu
> schreiben, damit beim nächsten Update die Werte sicher im CC Register
> stehen.

Verstehe ich nicht ganz. Wie soll ich vorgehen?

von PWM-Laie (Gast)


Lesenswert?

PWM-Laie schrieb:
> Matthias S. schrieb:
>> Alsdann ist es sinnvoll, die OC Werte in die CCABUF statt in CCA zu
>> schreiben, damit beim nächsten Update die Werte sicher im CC Register
>> stehen.
>
> Verstehe ich nicht ganz. Wie soll ich vorgehen?

Habs einfach probiert und siehe da, es geht!!!
Vielen Dank.
Ich poste gleiche ein Bild.

von Ingo L. (corrtexx)


Lesenswert?

PWM-Laie schrieb:
> Habs einfach probiert und siehe da, es geht!!!
Damit bin ich auch mal böse auf die Nase gefallen. Man sollte eigentlich 
immer die BUF-Register nutzen. Ein moderner Controller macht diese 
Spiränz'chen zum Glück automatisch...

von PWM-Laie (Gast)


Angehängte Dateien:

Lesenswert?

Sodelle, anbei mein Bild.
Jetzt läuft es perfekt.
Ich dachte schon, dass ich zu blöd für die Sache bin.
Nochmals vielen Dank für den Tipp.
Nun bin ich ein mal auf die Nase gefallen, jetzt weiß ich es.

von PWM-Laie (Gast)


Lesenswert?

Ingo L. schrieb:
> Damit bin ich auch mal böse auf die Nase gefallen. Man sollte eigentlich
> immer die BUF-Register nutzen. Ein moderner Controller macht diese
> Spiränz'chen zum Glück automatisch...

Warum macht der µC das eigentlich?
Wieso werden die Werte nochmals gepuffert?

von Ingo L. (corrtexx)


Lesenswert?

Du scheinst aber immernoch am Ende einer Schwingung bzw. Beginn der 
negativen Halbschwingung eine minimale Verzerrung zu haben!? Warum 
gerade 321 Werte in der Tabelle? Ist doch unsymmetrisch! Nimm 320 und 
mach:
1
if(step > 319)
2
    step=0; 
3
4
  if(step < 160) // 0..159 = 160
5
  {
6
    TCF0.CCA = sinustabelle32MHz[step];
7
  }    
8
  if(step >= 160) // 160... 319 = 160
9
  {
10
    TCF0.CCB = sinustabelle32MHz[step];
11
  }  
12
   step++;
Wenn du Speicher sparen musst, nimm nur ein Teil der Sinus Tabelle, z.B. 
0°-90°, den Rest kannst du dir daraus zurecht biegen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@  PWM-Laie (Gast)


>Und die Tabelle.

>onst unsigned int sinustabelle32MHz[321] ={
>  0,  // Zeit: 0 ms -> Step: 0
>  39,  // Zeit: 0,0625 ms -> Step: 1
>  79,  // Zeit: 0,125 ms -> Step: 2
>  118,  // Zeit: 0,1875 ms -> Step: 3

Wie kommt man auf die Schnapsidee, eine Tabelle derartig zu stukturieren 
und JEDE Zeile zu kommentieren?
Selbst wenn man das per Script generiert ist das einfach nur Unsinn.

https://www.mikrocontroller.net/articles/Sinus_Tabelle

von Falk B. (falk)


Lesenswert?

@PWM-Laie (Gast)


>> Damit bin ich auch mal böse auf die Nase gefallen. Man sollte eigentlich
>> immer die BUF-Register nutzen. Ein moderner Controller macht diese
>> Spiränz'chen zum Glück automatisch...

>Warum macht der µC das eigentlich?
>Wieso werden die Werte nochmals gepuffert?

Damit die neuen Werte IMMER EXAKT zum Beginn der PWM-Periode geladen 
weden und nicht irgendwann mitten drin.
Wenn man nämlich direket auf die aktiven Werte schreibt, kann man eine 
laufende PWM durcheinander bringen.
Denn dieser Wert wird bei jedem PWM-Takt mit dem PWM-Zähler verglichen 
und dementsprechend das Ausgangssignal HIGH oder LOW geschaltet.

Beispiel. PWM-Wert im Register = 128, 8 Bit PWM

Der Zähler ist bei 150, das PWM-Ausgangssignal ist also schon ein paar 
Takte LOW. Jetzt schreibt dein Controller plötzlich den Wert 250 ins 
direkt aktive Register. Damit wird das Pin wieder auf HIGH gesetzt und 
erst wenn der PWM-Zähler auf 250 angekommen ist, wieder auf LOW. Damit 
ist diese PWM-Periode gestört worden.

von PWM-Laie (Gast)


Lesenswert?

Ingo L. schrieb:
> Du scheinst aber immernoch am Ende einer Schwingung bzw. Beginn
> der
> negativen Halbschwingung eine minimale Verzerrung zu haben!? Warum
> gerade 321 Werte in der Tabelle? Ist doch unsymmetrisch! Nimm 320 und
> mach:if(step > 319)
>     step=0;
>
>   if(step < 160) // 0..159 = 160
>   {
>     TCF0.CCA = sinustabelle32MHz[step];
>   }
>   if(step >= 160) // 160... 319 = 160
>   {
>     TCF0.CCB = sinustabelle32MHz[step];
>   }
>    step++;
>
> Wenn du Speicher sparen musst, nimm nur ein Teil der Sinus Tabelle, z.B.
> 0°-90°, den Rest kannst du dir daraus zurecht biegen.

Der Speicher ist nicht das Problem. Aber prinzipiell hast du schon 
recht.
Ich schreib es mal um auf 320 Werte.

Falk B. schrieb:
> Wie kommt man auf die Schnapsidee, eine Tabelle derartig zu stukturieren
> und JEDE Zeile zu kommentieren?
> Selbst wenn man das per Script generiert ist das einfach nur Unsinn.

Es ist doch meine Lebenszeit die drauf geht, oder?
Ich hab alles mit EXCEL generiert, wo ist das Problem. Das dauert eine 
Sekunde.

von PWM-Laie (Gast)


Lesenswert?

Falk B. schrieb:
> Damit die neuen Werte IMMER EXAKT zum Beginn der PWM-Periode geladen
> weden und nicht irgendwann mitten drin.
> Wenn man nämlich direket auf die aktiven Werte schreibt, kann man eine
> laufende PWM durcheinander bringen.
> Denn dieser Wert wird bei jedem PWM-Takt mit dem PWM-Zähler verglichen
> und dementsprechend das Ausgangssignal HIGH oder LOW geschaltet.
>
> Beispiel. PWM-Wert im Register = 128, 8 Bit PWM
>
> Der Zähler ist bei 150, das PWM-Ausgangssignal ist also schon ein paar
> Takte LOW. Jetzt schreibt dein Controller plötzlich den Wert 250 ins
> direkt aktive Register. Damit wird das Pin wieder auf HIGH gesetzt und
> erst wenn der PWM-Zähler auf 250 angekommen ist, wieder auf LOW. Damit
> ist diese PWM-Periode gestört worden.

OK verstanden, danke.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich nehme bevorzugt diesen Tabellengenerator:

http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml

Copy&Paste und man hat eine gute Tabelle.

von PWM-Laie (Gast)


Lesenswert?

Matthias S. schrieb:
> Ich nehme bevorzugt diesen Tabellengenerator:
>
> http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
>
> Copy&Paste und man hat eine gute Tabelle.

Super Tool, danke.

von PWM-Laie (Gast)


Lesenswert?

Hallo nochmal.
Nachdem jetzt meine PWM-Erzeugung funktioniert, hätte ich noch eine 
Frage.
Muss dazu sagen, dass ich noch Fußgänger in Sachen Leistungselektronik 
bin.
Wahrscheinlich kann mir einer von euch die Frage sofort beantworten.

Ich steuere ja mit meinen zwei PWMs eine H-Brücke wie im oben erwähnten 
Wechselrichter-Projekt an. Gerade teste ich noch mit 30V 
Versorgungsspannung an der H-Brücke und meine Schaltung inkl. µC nimmt 
ohne Last und ohne den Sinusfilter 47 mA auf.
Wenn ich jetzt die Versorgungsspannung langsam erhöhe, dann steigt meine 
Stromaufnahme auf max. 150 mA bei 230V und die MOSFETs werden heiß.
Wie gesagt, ich hab keine Last an der H-Brücke (auch keinen Filter).
Zuerst kamen mir die Schaltverluste in den Sinn, aber ich habe ja keine 
Last ?!?
Ist das der Gate-Ladestrom, der die erhöhte Stromaufnahme generiert. Der 
müsste doch aber immer gleich sein, oder nicht?
Bitte helft mir.

Danke

von Falk B. (falk)


Lesenswert?

@  PWM-Laie (Gast)

>Ich steuere ja mit meinen zwei PWMs eine H-Brücke wie im oben erwähnten
>Wechselrichter-Projekt an.

Schaltplan?

> Gerade teste ich noch mit 30V
>Versorgungsspannung an der H-Brücke und meine Schaltung inkl. µC nimmt
>ohne Last und ohne den Sinusfilter 47 mA auf.

Ganz schön viel.

>Wenn ich jetzt die Versorgungsspannung langsam erhöhe, dann steigt meine
>Stromaufnahme auf max. 150 mA bei 230V und die MOSFETs werden heiß.

Da stimmt was nicht. Wahrscheinlich hast du keine Pausen bei der 
Ansteuerung der Halbbrücken und es leiten beide MOSFETs kurzeitig, 
wodurch ein großer Strom von VCC durch die MOSFETs nach GND fließt, aka 
shoot through current.

>Ist das der Gate-Ladestrom, der die erhöhte Stromaufnahme generiert.

Nein.

von PWM-Laie (Gast)


Angehängte Dateien:

Lesenswert?

Danke für deine Antwort.
Anbei der Schaltplan der H-Brücke und das Oszi-Bild des PWM.

von PWM-Laie (Gast)


Lesenswert?

Falk B. schrieb:
> Da stimmt was nicht. Wahrscheinlich hast du keine Pausen bei der
> Ansteuerung der Halbbrücken und es leiten beide MOSFETs kurzeitig,
> wodurch ein großer Strom von VCC durch die MOSFETs nach GND fließt, aka
> shoot through current.

Hab ich mir auch schon gedacht.
Aber ich meine das Oszi-Bild sieht gut aus, oder?

von PWM-Laie (Gast)


Lesenswert?

Ich hab gerade selbst etwas festgestellt.
Wenn ich den 10R Vorwiderstand an den FETs weg mache wirds besser. Dann 
nimmt meine Schaltung bei 30V nur noch 33 mA auf und wenn ich die 
Spannung auf 60V erhöhe, dann bleibt es dabei.
Wahrscheinlich haben die den Gate-Strom (Pulsstrom) so begrenzt, dass 
diese zu langsam durchgesteuert und wieder gesperrt haben.
Somit haben dann kurzzeitig beide geleitet.

Komischerweise sind diese Vorwiderstände im Datenblatt des IR2109 im 
Schaltbild mit drin.
Wiese machen die das? Um die Störungen zu reduzieren?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Der IR2109 hat 1. eine fest eingestellte Totzeit, die du von aussen 
nicht beeinflussen kannst und 2. nur ein recht geringe Treiberleistung 
von 120/250mA.
Dem gegenüber steht eine recht hohe Total Gate Charge beim IRFP460 mit 
etwa 210 nC. Bei deiner PWM Frequenz wirds da knapp mit einem zügigen 
Auf- und Entladen der Gates, so das die Highside noch leitet, wenn die 
Lowside anfängt zu leiten.
Die Wahl des IR2109 ist also falsch. Nimm dir einen IR2110 o.ä. und 
steuere in mit AWEX und dem DTI Block des XMega an. So hast du eine 
freie Auswahl der Totzeit und kannst das auf deine Schaltung optimieren.
Edit: Du kannst zwar den Gatewiderstand reduzieren, riskierst damit aber 
Überstrom im Treiber.

: Bearbeitet durch User
von Jens W. (jensw)


Lesenswert?

Hallo,

nein, das Bild reicht nicht aus. Das ist ja nur die Frequenz der 
gesamten Sinusschwingung.
Du musst in eine einzelne PWM Periode rein zoomen.
Hier ist es wichtig wie deine Mosfets getaktet werden. Ich nehme an 
alternierend. Das heißt, wenn der obere an ist, ist der untere aus. Und 
umgekehrt. Da kann es sein, dass beim Umschalten der Fets kurz beide an 
sind.

Grüße, Jens

von PWM-Laie (Gast)


Angehängte Dateien:

Lesenswert?

Jens W. schrieb:
> nein, das Bild reicht nicht aus. Das ist ja nur die Frequenz der
> gesamten Sinusschwingung.

Hier noch ein Bild.

von PWM-Laie (Gast)


Lesenswert?

Matthias S. schrieb:
> Du kannst zwar den Gatewiderstand reduzieren, riskierst damit aber
> Überstrom im Treiber.

Aha, ein kleiner Widerstand ist dann nicht schlecht.
Gerade fließt also das was meine 15V-Spannungsquelle hergibt. Den Strom 
könnte ich ja mal messen.
Ich schaue mir den IR2110 mal an.

Matthias S. schrieb:
> Dem gegenüber steht eine recht hohe Total Gate Charge beim IRFP460 mit
> etwa 210 nC.

OK. Ich versuche mal auszurechnen wie lange es bei dem Strom dauert das 
Gate zu laden.
Gibts da Faustformeln?

von Falk B. (falk)


Lesenswert?

@ PWM-Laie (Gast)


>Hab ich mir auch schon gedacht.
>Aber ich meine das Oszi-Bild sieht gut aus, oder?

Man sieht das Problem so oder so nicht bei dieser Messung. Dazu müßte 
man den Strom durch die einzelnen Zweige messen.

>Wenn ich den 10R Vorwiderstand an den FETs weg mache wirds besser. Dann
>nimmt meine Schaltung bei 30V nur noch 33 mA auf

Schon mal ein wichitger Hinweis.

>Wahrscheinlich haben die den Gate-Strom (Pulsstrom) so begrenzt, dass
>diese zu langsam durchgesteuert und wieder gesperrt haben.
>Somit haben dann kurzzeitig beide geleitet.

Ja.

>Komischerweise sind diese Vorwiderstände im Datenblatt des IR2109 im
>Schaltbild mit drin.

10 Ohm an 15V macht max. 1,5A, die dann mit einer RC-Kurve abfallen.

>Wiese machen die das? Um die Störungen zu reduzieren?

Damit der Stromkreis Gatetreiber - Gate -Source Gatetreiber bedämpft 
wird. Denn die Gatekapazität schwingt im Zusammspeil mit der 
INduktivität der Gatezuleitung. Der WIderstnad dämpft die Schwingung.
Wie sieht dein Aufbau mechanisch aus? Sind die Treiber NAH an den 
MOSFETs? viel mehr als 100mm sollten es nicht sein, eher weniger. Und 
die Zuleitungen zu Gate/Source müssen verdrillt sein.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

PWM-Laie schrieb:
> Gibts da Faustformeln?

Da gibts soger Formeln ohne Faust:
https://en.wikipedia.org/wiki/Coulomb
Gleich die erste:

Ladung = Strom * Anstiegszeit.
Bisschen Umstellerei und du kommst auf den benötigten Strom für die 
gewünschte Anstiegszeit.

: Bearbeitet durch User
von PWM-Laie (Gast)


Lesenswert?

Falk B. schrieb:
> Damit der Stromkreis Gatetreiber - Gate -Source Gatetreiber bedämpft
> wird. Denn die Gatekapazität schwingt im Zusammspeil mit der
> INduktivität der Gatezuleitung. Der WIderstnad dämpft die Schwingung.
> Wie sieht dein Aufbau mechanisch aus? Sind die Treiber NAH an den
> MOSFETs? viel mehr als 100mm sollten es nicht sein, eher weniger. Und
> die Zuleitungen zu Gate/Source müssen verdrillt sein.

Die Gate-Treiber sind sehr dicht dran. Max 20 mm. Wenn ich mir das 
Ansteuersignal ansehe, dann finde ich kein Schwingen. Das würde man doch 
auf Oszi sehen, oder nicht?
Meine Stromaufnahme steigt immer noch auf 50 mA wenn ich mit 230 V 
speise. Und die MOSFETS werden auch noch warm. Ich denke ich hab immer 
noch einen Querstrom.
Ich muss eventuell doch auf einen anderen Treiber. Hier wurde schon der 
IR2110 empfohlen. Gibts noch andere Erfahrungen?

Matthias S. schrieb:
> Da gibts soger Formeln ohne Faust:
> https://en.wikipedia.org/wiki/Coulomb
> Gleich die erste:

Ok danke.

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
Noch kein Account? Hier anmelden.