Guten Abend,
ich möchte einen H-Brücke aufbauen und nutze dafür zwei IR 2104 MOSFET
Treiber. Der angeschlossene Motor soll die Drehrichtung ändern können.
Der Betrieb ist wie folgt gedacht: Einer der unteren (abhängig von der
gewünschten Drehrichtung) MOSFETs ist dauerhaft an. Hierfür muss SD high
und IN low sein (PWM Signal aus). Eine Seite der H-Brücke schaltet dann
im Wechsel den HS - und LS MOSFET (abhängig von der gewünschten
Drehzahl).
Mir reicht also ein PWM Signal, welches ich auf zwei unterschiedlichen
BIT's ausgeben könnte. Ich nutze einen MSP430 G2553 - dieser kann auf
P1.2 & P1.6 das (PWM) TA0.1 Signal ausgeben. Via Befehl möchte ich
zwischen den Ausgängen umschalten:
Einmal soll bspw. an BIT6 das PWM Signal anliegen und BIT2 soll low
sein.
Für einen Drehrichtungswechsel kehrt sich die eben genannte
Konstellation um.
1 | //Der Wert von "y" wird via Taster geändert
|
2 | switch(y)
|
3 | {
|
4 | case(0):
|
5 | {
|
6 | P1DIR &= ~BIT6; // P1.6 Input
|
7 | P1SEL &= ~BIT6; // P1.6 Option select
|
8 | delay_ms(10);
|
9 | P1DIR |= BIT2; // P1.2 Output
|
10 | P1SEL |= BIT2; // P1.2 Option select
|
11 | lcdSetText("Drehrichtungs-",0,0);
|
12 | lcdSetText("wechsel",0,1);
|
13 | delay_s(2);
|
14 | lcdClear();
|
15 | }
|
16 | break;
|
17 |
|
18 | case(1):
|
19 | {
|
20 | P1DIR &= ~BIT2; // P1.2 Input
|
21 | P1SEL &= ~BIT2; // P1.2 Option select
|
22 | delay_ms(10);
|
23 | P1DIR |= BIT6; // P1.6 Output
|
24 | P1SEL |= BIT6; // P1.6 Option select
|
25 | lcdSetText("Drehrichtungs-",0,0);
|
26 | lcdSetText("wechsel",0,1);
|
27 | delay_s(2);
|
28 | lcdClear();
|
29 | }
|
30 | break;
|
31 | }
|
Testweise habe ich keinen Motortreiber sonder 2 Led's angeschlossen.
Leider musste ich feststellen, dass auf P1.2 ein geringer (bislang noch
nicht gemessener) Strom fließt. Die LED leuchtet glimmt. Der elektrische
Aufbau ist auf einem Steckboard erfolgt und wurde mehrfach überprüft.
Auch habe ich gesondert versucht die PWM einzeln auf die Bit's auzugeben
und komme zu selbigen Resultat.
Folgend:
Aufbau auf Steckboard. LED an P1.2 und P1.6 mit dem Launchpad verbunden
und im Wechsel mit BIT2 und BIT6 debuggt. LED an P1.2 glimmt wenn kein
PWM Signal anliegt. Lege ich das PWM Signal auf P1.2 und ist das
Tastverhältnis 0, erlischt auch die LED
1 | #include "msp430g2553.h"
|
2 |
|
3 | unsigned long duty_cycle=0;
|
4 | void main(void)
|
5 | {
|
6 | WDTCTL = WDTPW + WDTHOLD; // stop WDT
|
7 |
|
8 | TACTL=TASSEL_2 + TACLR; // SBCLK + TA Reset
|
9 | P1DIR |= BIT6; // P1.2 -> output
|
10 | P1SEL |= BIT6; // P1.2 option select
|
11 | TACCR0 = 1023; // CCR0 -> cycle time (10ms)
|
12 | TACCR1 = duty_cycle; // CCR1 -> duty cycle
|
13 | TACCTL1 = OUTMOD_7; // reset/set
|
14 | TACTL |= MC_1; // up-mode
|
15 |
|
16 |
|
17 | // ADC configuration,V+ref=3V,V-ref=0V,Channel=A0
|
18 |
|
19 | ADC10CTL0 = ADC10ON + ADC10IE;
|
20 |
|
21 | ADC10AE0 |= INCH_0; // channel A0
|
22 |
|
23 | ADC10CTL0 |= ENC + ADC10SC; // Start Conversion
|
24 |
|
25 | _BIS_SR(LPM0_bits +GIE); // Go to LPM0,interrupts enabled
|
26 | }
|
27 |
|
28 | // interrupt
|
29 |
|
30 | #pragma vector = ADC10_VECTOR
|
31 | __interrupt void adc10_interrupt(void)
|
32 | {
|
33 | __delay_cycles(5);
|
34 | ADC10CTL0 |= ENC + ADC10SC; // Start Conversion again
|
35 | duty_cycle=(unsigned long)ADC10MEM;
|
36 | TACCR1=duty_cycle;
|
37 |
|
38 | }
|
Ist ein Fehler im obigen Code oder woran könnte es liegen?
Vielen Dank.