DC-Motor mit PWM auf LPC23xx controller

OP #1063592
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;
}
Gast #1063675
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
Gast #1063784
>
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.