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é 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