Mesure distante capteur ultrason - pic18f45k50 » Historique » Version 1
Romain CHAMBELLON, 22/11/2022 14:57
1 | 1 | Romain CHAMBELLON | h1. Mesure distante capteur ultrason - pic18f45k50 |
---|---|---|---|
2 | |||
3 | Le programme récupère une distance avec un capteur ultrason, on utilise la carte de synthèse avec un PIC18F45K50 |
||
4 | |||
5 | Le but d'allumer une led quand on est trop prêt, donc quand on est inférieur à une certaine distance. |
||
6 | |||
7 | Ceci permet de simuler une détection d'obstacle avec un capteur ultrason. |
||
8 | |||
9 | Voici le code de ce programme : |
||
10 | |||
11 | #include <stdio.h> |
||
12 | #include <stdlib.h> |
||
13 | |||
14 | #if defined(__XC) |
||
15 | #include <xc.h> /* XC8 General Include File */ |
||
16 | #elif defined(HI_TECH_C) |
||
17 | #include <htc.h> /* HiTech General Include File */ |
||
18 | #elif defined(__18CXX) |
||
19 | #include <p18cxxx.h> /* C18 General Include File */ |
||
20 | #endif |
||
21 | |||
22 | #if defined(__XC) || defined(HI_TECH_C) |
||
23 | #include <stdint.h> /* For uint8_t definition */ |
||
24 | #include <stdbool.h> /* For true/false definition */ |
||
25 | #endif |
||
26 | |||
27 | // Definition de l'oscillateur comme oscillateur externe |
||
28 | #pragma config FOSC = INTOSCIO |
||
29 | |||
30 | // Desactivation du WATCHDOG |
||
31 | #pragma config WDTEN = OFF |
||
32 | #pragma config MCLRE = OFF |
||
33 | #pragma config LVP = OFF |
||
34 | |||
35 | // determination de la frequence |
||
36 | #define _XTAL_FREQ 16000000L |
||
37 | |||
38 | ///////////////////////////////// ULTRASON ///////////////////////////////////// |
||
39 | |||
40 | int calcul_distance() |
||
41 | { |
||
42 | // Declaration des variables |
||
43 | |||
44 | int distance = 0; |
||
45 | int timer = 0; |
||
46 | TMR1H = 0; |
||
47 | TMR1L = 0; |
||
48 | |||
49 | LATBbits.LATB0 = 1; // Impulsion de 10 us sur le trigger |
||
50 | __delay_us(10); |
||
51 | LATBbits.LATB0 = 0; |
||
52 | |||
53 | while(PORTBbits.RB1==0); // Mesure de la durée entre l'envoi et la réception du signal |
||
54 | T1CONbits.TMR1ON = 1; |
||
55 | while(PORTBbits.RB1==1); |
||
56 | timer=TMR1; |
||
57 | T1CONbits.TMR1ON = 0; |
||
58 | |||
59 | distance=timer/17; // Calcul de la distance en cm |
||
60 | return distance; |
||
61 | } |
||
62 | |||
63 | //////////////////////////////////////////////////////////////////////////////// |
||
64 | //////////////////////////////// FONCTION MAIN ///////////////////////////////// |
||
65 | //////////////////////////////////////////////////////////////////////////////// |
||
66 | |||
67 | int main() |
||
68 | { |
||
69 | // Declaration et configuration des broches |
||
70 | |||
71 | TRISDbits.TRISD7 = 0; // Broche D7 = LED témoin, ultrason |
||
72 | ANSELDbits.ANSD7 = 0; |
||
73 | LATDbits.LATD7 = 0; |
||
74 | |||
75 | PORTD = 0; // PORTD initialisé à 0 |
||
76 | |||
77 | TRISBbits.TRISB0 = 0; // Broche B0 = trigger ultrason |
||
78 | ANSELBbits.ANSB0 = 0; |
||
79 | PORTBbits.RB0 = 0; |
||
80 | |||
81 | TRISBbits.TRISB1 = 1; // Broche B1 = echo ultrason |
||
82 | ANSELBbits.ANSB1 = 0; |
||
83 | PORTBbits.RB1 = 0; |
||
84 | |||
85 | // Configuration du timer |
||
86 | T1CKPS0 = 0; |
||
87 | T1CKPS1 = 0; |
||
88 | T1CONbits.TMR1CS = 0; // L'horloge locale est l'horloge source |
||
89 | |||
90 | //////////////////////////////////////////////////////////////////////////// |
||
91 | //////////////////////////* PROGRAMME PRINCIPAL */////////////////////////// |
||
92 | //////////////////////////////////////////////////////////////////////////// |
||
93 | |||
94 | /**/ |
||
95 | while(1) |
||
96 | { |
||
97 | |||
98 | __delay_ms(10); |
||
99 | |||
100 | int dist = calcul_distance(); |
||
101 | |||
102 | |||
103 | |||
104 | if (dist<10){ // valeur de distance de détection à définir en cm |
||
105 | LATD7=1; |
||
106 | } |
||
107 | else { |
||
108 | LATD7=0; |
||
109 | } |
||
110 | |||
111 | } |
||
112 | |||
113 | return 0; |
||
114 | } |
||
115 |