Forum: Mikrocontroller und Digitale Elektronik DC-Motor mit PWM auf LPC23xx controller


von Mueller B. (frankyfarell)


Lesenswert?

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;
}

von Peter Diener (Gast)


Lesenswert?

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

von Karsten (Gast)


Lesenswert?

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