ninja01  0.1
Utilizzo di PIC4431 per pilotaggio motori DC in PWM LAP
 Tutto File Funzioni Definizioni
motors.c
Vai alla documentazione di questo file.
1 
12 #include <p18cxxx.h>
13 #include "motors.h"
14 
15 void initMotors(unsigned int period){
16 
17 // Power Timer Control
18  PTCON0 = 0b00000000; // 1:1 postscaler, 1:1 prescale, free running
19  PTCON1 = 0b10000000; // PWM time base ON, count up
20  PTPERH = (unsigned char) (period >> 8);
21  PTPERL = (unsigned char) (period);
22 
23 // PWM Control
24  PWMCON0 = 0b00110000; // 011 = PWM0, PWM1, PWM2 and PWM3 I/O pins enabled for PWM output complementary
25  PWMCON1 = 0b00000000; // 1:16 postscaler, updates abilitati, override asincrono
26 
27  DTCON = 0b00010000; // Quarzo=10Mhz; prescaler=Fosc/2 dead time 3.2uSec... 10000 = 32
28 
29 // Output Override
30  OVDCOND = 0b00111111; // L'output è controllato dal DutyCycle e TimeBase
31  OVDCONS = 0b00111111; // Tutti i pin sono INACTIVE quando in override
32 
33 // Fault Configuration
34  FLTCONFIG = 0x00; // Fault A e B disabilitati
35 
36  return ;
37 }
38 
39 unsigned char setMotor(unsigned char motor, unsigned char enable, int dc){
40  unsigned int period;
41  int dutycycle;
42 
43 // Controlla se i parametri sono corretti
44  if ((motor < 0 ) || (motor > 2)) return MOTOR_NUMBER_ERROR;
45  if ((dc > (PWM_LIMIT)) || (dc < -(PWM_LIMIT))) return MOTOR_PWR_ERROR;
46 
47 //Gestisce il segnale Enable da inviare al driver di potenza.
48  if(enable){
49  switch ((unsigned char) motor){
50  case MOTOR_ALL : EN_MOT1 = ENABLE;
51  EN_MOT2 = ENABLE;
52  break;
53  case MOTOR_1 : EN_MOT1 = ENABLE;
54  break;
55  case MOTOR_2 : EN_MOT2 = ENABLE;
56  break;
57  }
58  }else{
59  switch ((unsigned char) motor){
60  case MOTOR_ALL : EN_MOT1 = DISABLE;
61  EN_MOT2 = DISABLE;
62  break;
63  case MOTOR_1 : EN_MOT1 = DISABLE;
64  break;
65  case MOTOR_2 : EN_MOT2 = DISABLE;
66  break;
67  }
68  }
69 
70 // legge la frequenza di lavoro per calcolare la risoluzione
71  period = ((unsigned int)(PTPERH) << 8) + PTPERL;
72 
73 // calcola il dutycycle da applicare in base alla precisione
74  switch ((unsigned int) period){
75  case PWM_10K : dutycycle = 2048 + dc;
76  break; // 12 bit (4096)
77  case PWM_20K : dutycycle = 1024 + (dc / 2);
78  break; // 11 bit (2048)
79  case PWM_40K : dutycycle = 512 + (dc / 4);
80  break; // 10 bit (1024)
81  }
82 
83  // Aggiorna i registri relativi al motore interessato
84  switch (motor){
85  case MOTOR_ALL : PDC0H = dutycycle >> 8 ;
86  PDC0L = dutycycle;
87  PDC1H = dutycycle >> 8 ;
88  PDC1L = dutycycle;
89  break;
90  case MOTOR_1 : PDC0H = dutycycle >> 8 ;
91  PDC0L = dutycycle;
92  break;
93  case MOTOR_2 : PDC1H = dutycycle >> 8 ;
94  PDC1L = dutycycle;
95  break;
96  }
97  return 0;
98 }