Un petit article rapide sur l’utilisation du module (OC) des « PIC » pour controler des servo-moteur de modélisme.

Pour contrôler des servo-moteur/contrôleur brushless de modélisme, j’utilise le module « OUTPUT COMPARE (OC) » en mode PWM du PIC32 pour générer un signal PPM.
Par exemple pour :

  • 0° il faut une impulsion d’environ 1ms
  • 90° – > ~1,5ms
  • 180° -> ~2ms

Code

#include
#include
#include 

#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1
#pragma config FPBDIV = DIV_1
#pragma config POSCMOD = HS, FNOSC = FRCPLL
#pragma config FWDTEN = OFF

#define SYS_FREQ 	(80000000L)
#define	GetSystemClock() 			(80000000ul)
#define	GetPeripheralClock()		(GetSystemClock()/(1 - OSCCONbits.PBDIV))
#define	GetInstructionClock()		(GetSystemClock())

#define PPM_PERIOD 0x1388 //GetPeripheralClock()/PS(64)/5000 = 250Hz = 4ms

#define PB_CLOCK_1MS GetPeripheralClock()/1000
#define PB_CLOCK_1_5MS (15*GetPeripheralClock())/10000
#define PB_CLOCK_2MS (2*GetPeripheralClock())/1000

#define VAL_PPM_MAX PB_CLOCK_2MS/64
#define VAL_PPM_CENTER PB_CLOCK_1_5MS/64
#define VAL_PPM_MIN PB_CLOCK_1MS/64

void initOC(){
     OpenTimer3(T3_ON | T3_PS_1_64,PPM_PERIOD);
     OpenOC1(OC_ON | OC_TIMER3_SRC | OC_TIMER_MODE16 | OC_PWM_FAULT_PIN_DISABLE, VAL_PPM_MIN, VAL_PPM_MIN);
}

int main(void){
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);

    /* Pour changer la durée de l'impulsion et faire bouger
        le servo-moteur, il suffit de changer la valeur du registre OC1RS
        Exemple:
        OC1RS = VAL_PPM_CENTER; // Pour centrer le servo-moteur */

    while(1);
    return 0;
}
There are no comments.

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.