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;
}
Previous Post
[VTOL-DRONE] IHM (Interface Homme Machine)
Next Post