2016-02-17 1 views
0

Je tente de créer un code c intégré pour contrôler un moteur cc avec le microcontrôleur PIC32MX460F512L. Ive Configurer l'horloge du système à 80 MHz et l'horloge périphérique à 10 MHz, Am en utilisant la minuterie 1 pour pulser le PWM avec un rapport cyclique donné, et la minuterie 2 pour mesurer le temps de fonctionnement du moteur. J'ai un fichier d'en-tête (includes.h) qui contient des informations de configuration du système, par exemple clock. J'ai créé la plupart des fonctions, mais certaines sont un peu difficiles. Par exemple, en initialisant les LEDS et les fonctions pour les mouvements vers l'avant, vers l'arrière et l'arrêt, je voulais que le moteur à courant continu fonctionne 4 secondes à 70%, puis s'arrête pendant 1 seconde puis marche arrière pendant 3 secondes à 50% cycle, puis arrêtez pendant 1 seconde, puis avancez à nouveau pendant 3 secondes à un cycle de travail de 40%, arrêtez pendant 1 seconde et enfin avancez pendant 5 secondes à un cycle de service de 20%. Toutes les suggestions pour l'avant, arrêter et inverser les fonctionsCode C intégré pour contrôler un moteur CC avec un microcontrôleur PIC

#include <stdio.h> 
#include <stdlib.h> 
#include <includes.h> 

void main() 
{ 
    // Setting up PIC modules such as Timers, IOs OCs,Interrupts, ... 
    InitializeIO(); 
    InitializeLEDs(); 
    InitializeTimers(); 

    while(1) { 
     WaitOnBtn1(); 
     Forward(4.0,70); 
     Stop(1.0); 
     Backward(3.0,50); 
     Stop(2); 
     Forward(3.0,40); 
     Stop(1.0); 
     Backward(2.0,20); 
     LEDsOFF(); 
    } 
    return; 
} 

void InitializeIO(){ 
    TRISAbits.TRISA6 = 1; 
    TRISAbits.TRISA7 = 1; 
    TRISGbits.TRISG12 = 0; 
    TRISGbits.TRISB13 = 0; 
    LATGbits.LATB12 = 0; 
    LATGbits.LATB13 = 0; 
    return; 
} 

void InitializeLEDs(){ 
    //code to initialize LEDS 
} 

void InitializeTimers(){ 
    // Initialize Timer1 
    T1CON = 0x0000; // Set Timer1 Control to zeros 
    T1CONbits.TCKPS=3; // prescale by 256 
    T1CONbits.ON = 1; // Turn on Timer 
    PR1= 0xFFFF; // Period of Timer1 to be full 
    TMR1 = 0; // Initialize Timer1 to zero 
    // Initialize Timer2 
    T2CON = 0; 
    T2CONbits.TCKPS = 7; // prescale by 256 
    T2CONbits.T32 = 1; // use 32 bits timer 
    T2CONbits.ON = 1; 
    PR2 = 0xFFFFFFFF; // Period is set for 32 bits 
    TMR2 = 0; 
} 

void WaitOnBtn1(){ 
    // wait on Btn1 indefinitely 
    while(PORTAbits.RA6 == 0); 

    // Turn On LED1 indicating it is Btn1 is Pushed 
    LATBbits.LATB10 = 1; 
    return; 
} 

void Forward(float Sec, int D){ 
    int RunTime = (int)(Sec*39000); // convert the total 
    time to number of Tics 
    TMR2 = 0; 
    //LEDs 
    LATGbits.LATG12 = 1; // forward Direction 
    LATBbits.LATB12 = 0; 
    LATBbits.LATB13 = 0; 
    LATBbits.LATB11 = 1; 
    // Keep on firing the PWM as long as Run time is not 
    elapsed 
    while (TMR2 < RunTime){ 
     PWM(D); 
    } 
    return; 
} 

void PWM(int D){ 
    TMR1 = 0; 
    int Period = 400; 
    while (TMR1< Period) { 
     if (TMR1 < Period*D/100){ 
      LATGbits.LATG13 = 1; 
     } 
     else{ 
     LATGbits.LATG13 = 0; 
    } 
} 
+1

Suggestions? D'abord poser une question. –

+1

1) C ne supporte pas _methods_. 2) Apprendre [demander] 3) Formater et indenter votre code correctement. 4) Utiliser des déclarateurs de fonctions de type prototype. – Olaf

+0

Je suis désolé à ce sujet, je voulais dire des fonctions; Je vais essayer de mieux formater mon code à l'avenir mais en attendant des suggestions – Chogo

Répondre

0

fonctions, non pas des méthodes, pour être précis.

Alors, quelle est exactement la question?

Ce que je peux dire, d'un rapide coup d'oeil sur un code source:

initialisation LED doit être fait comme vous l'avez fait en fonction InitializeIO(). Réglez simplement les bits TRISx appropriés sur 0 pour configurer les broches de LED en sortie. Pour les fonctions PWM et de commande de moteur, vous devriez prendre un peu de temps et essayer de comprendre le fonctionnement du périphérique PWM intégré. C'est une partie de OC (Output Compare) et il est très facile à utiliser. S'il vous plaît, prenez regarder le lien suivant http://ww1.microchip.com/downloads/en/DeviceDoc/61111E.pdf

et celui-ci pour la mise en œuvre minimale en utilisant les bibliothèques périphériques BUILTIN https://electronics.stackexchange.com/questions/69232/pic32-pwm-minimal-example

Fondamentalement, vous devez configurer les registres OC à « faire » le module OC agit comme PWM. Vous devez allouer l'un des minuteurs pour travailler avec le module OC (il sera utilisé pour la fréquence PWM de base) et c'est tout. Tout ce dont vous avez besoin après cela est de régler la valeur du rapport cyclique PWM en réglant le registre PRx du temporisateur, vous n'avez pas besoin d'échanger des bits comme dans votre routine PWM.

Pour l'arrêter simplement, arrêtez simplement la minuterie.

Pour le redémarrer, exécutez la minuterie.

Pour changer de direction (cela dépend de votre pilote pour le moteur) Je suppose que vous avez juste besoin de basculer direction goupille.

J'espère que ça aide ...

+0

Désolé pour le mélange avec des méthodes et des fonctions; Je suis accro à Java. En tout cas merci pour l'information. Laissez-moi étudier le détail et voir ce qu'il en adviendra – Chogo