Hallo, Ich wünsche mir jemand mir zu helfen. ich will ein DC motor über PWM auf Keil kontroller LPC2378 steuern. aber mein Code funktioniert nicht. Hier ist den Code . kann mir jemand sagen was noch zu tun ist??(ich habe noch nie, was mit Microkontroller zu tun gehabt). ein Beispiel code vorschlag wäher auch gut. ich würde ,das das Motor sich dreht. Kanke /*********************************************************************** ****** * pwm.c: main C entry file for NXP LPC23xx/24xx Family Microprocessors ************************************************************************ ******/ #include "LPC23xx.h" /* LPC23xx/24xx definitions */ volatile unsigned match_counter1; /*********************************************************************** ******* ** Function name: PWM_Init ************************************************************************ ******/ unsigned long PWM_Init( unsigned long ChannelNum, unsigned long cycle ) { if ( ChannelNum == 2 ) { match_counter1 = 0; //PWM PINSEL4 = 0x00000080; //set 7:6 P2.3 PWM1.4 ->pin 100 FIO2DIR = 0x00000080; /* P2.3 defined as PWM1.4 Outputs */ FIO2CLR = 0x00000080; // //OUTPUT motor PINMODE3 = 0; // P1.16-P1.31 push pull (default) FIO1MASK = 0; // all pins are affected by FIOSET,FIOCLR,FIOPIN (default) FIO1DIR = 0x90000000; // Pin P1.31 and P1.28 are Motor output FIO1SET = 0x80000000; /* Set P1.31 on high for Forward Motro Direction*/ //FIO1SET = 0x40000000; /* Set P1.31 on high for Backward Motro Direction*/ PCONP |= ( 1 << 6) /* Enable PWM1 clock */ | ( 0 << 0) /* Disable counter */ | ( 1 << 1); /* Reset PWM */ PWM1TCR = 0x00000008; /*bit 3 -> Enable PWM1*/ PWM1PR =72000000/64; /* count frequency:Fpclk */ PWM1CTCR = (0x00 << 0); /* Counter uses prescaler */ PWM1MCR =(1 << 0)|(1 << 1); /* Bit 0 and 1:->interrupt on PWMMR0, reset on PWMMR0*/ PWM1MR0 = cycle; /* set PWM cycle-rate */ PWM1MR1 = cycle * 5/6 ; /*Set rising edge for PWM1*/ PWM1MR2 = cycle * 2/3 ; /*Set falling edge for PWM1 */ //PWM1MR3 = cycle cycle * 1/2 + offset; /*Set */ /* all PWM latch enabled */ PWM1LER = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6; } return (1); } /*********************************************************************** ******* ** Function name: PWM_Set ************************************************************************ ******/ void PWM_Set( unsigned long ChannelNum, unsigned long cycle, unsigned long offset ) { if ( ChannelNum == 2 ) { PWM1MR0 = 0,50 ; /* set PWM cycle */ PWM1MR1 = cycle * 5/6 + offset; /*Set rising edge for PWM1*/ PWM1MR2 = cycle * 2/3 + offset; /*Set falling edge for PWM1 */ PWM1LER = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4 | 1 << 5 | 1 << 6; } return; } /*********************************************************************** ******* ** Function name: PWM_Start ************************************************************************ ******/ void PWM_Start( unsigned long channelNum ) { if ( channelNum == 2 ) { //bit 4 ->PWM1.4 ist generated for PINSEL4 PWM1PCR = 1<<4 |1 << 9 | 1 << 10 |1 << 11; // enable PWM1.2, PWM2, PWM3 //PWM1PCR = 0x00005454; //PWM1.2,PWM1.4 and PWM1.6 are generated for PINSEL4 PWM1TCR = 0x00000001 | 0x00000008; /* counter enable, PWM enable */ } return; } /*********************************************************************** ******* ** Function name: PWM_Stop ************************************************************************ ******/ void PWM_Stop( unsigned long channelNum ) { if ( channelNum == 2 ) { PWM1PCR = 0; PWM1TCR = 0x00; /* Stop all PWMs */ } return; } /*********************************************************************** ******* ** Main Function main() ************************************************************************ ******/ int main (void) { unsigned long cycle = 1200, offset = 0; PWM_Init( 2, 0 ); PWM_Set( 2, cycle, offset ); PWM_Start( 2 ); /*Loop for ever*/ while ( 1 ){ } // PWM_Stop( 2 ); // return 0; }
Hallo, dieser Code sagt uns leider nicht besonders viel, wenn man den Schaltplan dazu nicht hat. >ich habe noch nie, was mit Microkontroller zu tun gehabt Wäre es dann nicht besser, zunächst an einigen einfacheren Controllern zu üben? Ein Arm ist nicht besonders einfach für den Einstieg. >auf Keil kontroller LPC2378 steuern. Der genannte Controller ist von NXP semiconductor. Ich gehe davon aus, dass du meinst, dass du einen Keil Compiler zum Programmieren verwendest. Bitte poste den Schaltplan. Viele Grüße, Peter
>
1 | PWM1MR0 = 0,50 ; /* set PWM cycle */ |
Hoppla! Und solche Code Schnipsel sind gerade für den ARM etwas dürftig. Wenn du ein Programm hast das nicht läuft können selbst Leute die über entsprechende Hardware verfügen das nicht ausprobieren.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.