Hallo liebe Freunde der µC Programmierung.
Ich möchte einen Sinus per pwm erzeugen. Das hat mittlerweile auch schon
soweit ganz gut geklappt, allerdings habe ich merkwürdige Überschwinger
auf meinem Sinus. Anbei die Bilder des Oszis. Das Ganze ist mit 10x
Tastkopf über einem RC-Glied 22k und 68nF (hatte grad nix anderes da)
abgenommen. Der µC ist ein MSP430G2452.
Evtl. sinds ja auch nur die diversen Störwellen der Pwm.
Hier noch der Code:
1 | #include <msp430g2452.h>
|
2 |
|
3 |
|
4 | int winkel=0;
|
5 |
|
6 | const int sinus_a[]={25, 33, 40, 45, 49, 50, 49, 45, 40, 33,
|
7 | 25, 17, 10, 5, 1, 0, 1, 5, 10, 17};
|
8 |
|
9 | void main(void)
|
10 | {
|
11 | WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
|
12 | DCOCTL = CALDCO_16MHZ;
|
13 | BCSCTL1 = RSEL3+RSEL2+RSEL1+RSEL0;
|
14 | BCSCTL2= 0;
|
15 |
|
16 | P1DIR = BIT2;
|
17 | P1SEL = BIT2; // timer output
|
18 |
|
19 | P1OUT = 0; // LED off
|
20 | CCTL0 = CCIE+OUTMOD_7 ; // CCR0 interrupt enabled
|
21 | CCTL1 = OUTMOD_7;
|
22 | TACTL = TASSEL_2 + MC_1; // SMCLK, up mode
|
23 | CCR0 = 50;
|
24 | CCR1 = 25;
|
25 |
|
26 | _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
|
27 | }
|
28 |
|
29 | // Timer A0 interrupt service routine
|
30 | #pragma vector=TIMER0_A0_VECTOR
|
31 | __interrupt void Timer_A (void)
|
32 |
|
33 | {
|
34 | TACCR1 = sinus_a[winkel];
|
35 | winkel = (winkel+1)%20; // index für sinustabelle
|
36 | }
|
Evtl. sinds ja auich nur die diversen Störwellen der pwm.
LG
Eddie