Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avBarbro Öberg
1
William Sandqvist william@kth.se PWM Sinusoidal Hur tillverkar man en sinusformad spänning? En PWM-signal kan ge en sinusapproximation. Efter filtrering liknar det sedan en sinusvåg.
2
William Sandqvist william@kth.se Algoritm för sin + cos x = 0; y = 64; x += y/8; y -= x/8; x sinusvärden, y cosinusvärden. Perioden är 54 iterationsvarv. Algoritmen lämpar sig väl för 8-bitarsdatorer som saknar multiplikations och divisions -instruktioner. ( tex. PIC midrange ). 54
3
William Sandqvist william@kth.se Algoritm för sin + cos …
4
William Sandqvist william@kth.se En period innehåller 54 sinus och cosinus värden. -64 … 0 … +64.
5
William Sandqvist william@kth.se Ex. PWM-sinus 50 Hz Efter varje fullbordad PWM-puls blir det ett interrupt. I interruptrutinen beräknas nästa PWM- värde och det laddas till CCPRL registret. Med 4 MHz processorklocka blir pseudosinusfrekvensen 49,78 Hz ( 50 Hz ).
6
William Sandqvist william@kth.se interrupt int_server( void ) { int_save_registers PORTA.1 = x.7; /* the sign is used as PWMGND */ tmp = y; if(y.7) tmp = -tmp; /* negative => make positive */ tmp = tmp/8 ; if(y.7) tmp = -tmp; /* back to negative */ x += tmp; /* x is the sine value */ tmp = x; if(x.7) tmp = -tmp; tmp = tmp/8 ; if(x.7) tmp = -tmp; y -= tmp; /* y is cosine value, not used */ /* update PWM, invert if negative */ if(x.7) CCPR1L = x + 93; else CCPR1L = x; /* return from the interrupt */ TMR2IF = 0; int_restore_registers } Interrupt som beräknar nästa PWM- värde. Kod för CC5x-kompilatorn …
8
William Sandqvist william@kth.se Tabellmetoden Vanligare än att man beräknar nästa PWM-värde med en algoritm är att man ”slår upp” det i en tabell. char sinvalue(char n) { skip( n); #pragma return[] = 0, 8, 15, 22, 29, 36, 42, 48, 53 \ 57, 60, 62, 63, 64, 64, 63, 62, 60 \ 57, 53, 48, 42, 36, 29, 22, 15, 8 \ 0, -8,-15,-22,-29,-36,-42,-48,-53 \ -57,-60,-62,-63,-64,-64,-63,-62,-60 \ -57,-53,-48,-42,-36,-29,-22,-15, -8 } Kod för CC5x-kompilatorn …
9
William Sandqvist william@kth.se interrupt int_server( void ) { int_save_registers PORTA.1 = x.7; // the sign is used as PWMGND x = sinvalue(n); /* update PWM, invert if negative */ if(x.7) CCPR1L = x + 93; else CCPR1L = x; n++; n%=54; /* return from the interrupt */ TMR2IF = 0; int_restore_registers } Tabellmetoden. Interrupt som ”slår upp” nästa PWM-värde. Kod för CC5x-kompilatorn …
10
William Sandqvist william@kth.se Lab-uppkoppling
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.