DC-Motor mit PWM auf LPC23xx controller

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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.