version 0.0 :
20 Mai 2017
rev 15/02/2020.
Test Servomoteur
avec PIC16F1847
Thermometre
Analogique (ou presque) 16F1847 + Servo + LM35DZ
SERVO Moteur
( de Radio commande):
Commande d'un servomoteur Graupner JR-C507 Tension d'alimentation : 4.8 à 6V Couple : 39 N.cm = 3.98 kg.cm Consommation électrique à vide : 8mA Consommation électrique max : 720mA Vitesse angulaire: 0.17s/40° Débattement : 2 x 45° Poids : 40g Dimension : 39x19x39mm jaune = signal Noir=0V rouge=+4.8V |
![]() |
Le PIC 16F1847 :
BUT: Verifier un servomoteur de radio commande
en connectique Dip18
Utilisé avec Fosc Interne =8Mhz ( sans PLL)
Available RAM: 1008 [bytes], Available ROM: 8192 [bytes])
Pinout & schema (rikiki)
Hardware :
// Fonctionnement :
// le Timer2 est calé sur 20mS, en mode interruption
// à chaque IT, il arme le timer1 pour un delai de 1 à 2mS
suivant la valeur contenue dans Cde_Servo
// et Met la pulse de commande Servo à 1 (pin RA4)
// le Timer1, en mode interruption , en fin de timing , remet à
zero la pulse servo, et reste en standby
// tout se passe dans les interruptions.
// la valeur de Cde_Servo peut provenir , soit de la mesure ADC
EA1 (pin 18)
// qui est moyenne sur 4 (ou 8 ) valeurs , pour avoir une
commande stable ( mais moins rapide)
// soit d'une commande Keyboard PC Terminal
// Theorie : Timer1 value= 64535 -> calé sur
1000µS , et avec Timer1 value = 63535 --> 2000µS
// Commande par POTAR (Potar=Potentiometre)
// le delta de valeur d'initialisation correspond à une gamme de
1 mS ( balaye donc de 1 à 2 mS)
// correspondant à la gamme , en points , de l'ADC 10 bits (1024
points), ici limité à 1000
// valeurs mesuree : 0 -> 1,004 mS 500 -> 1,500mS 1,004 ->
2,004 mS
// Pratical value , adjusted to get exactly 1,0 to 2,0 mS
// calibration 64545 au lieu de 64535 soit delta =10 pts / 64545
soit 0,015%
// Cde_Servo=64545- Average_T;
// Commandes via Keyboard :
// rajout traitement interruption UART RX :
// Permet le Rajout diverses options de commande
// mode 0 : par consigne Potar connecté sur EA1 (+Vref interne 4,096V)
alim MCU =4,8 à 5V
// mode 1 : par valeur tapée au clavier KEY0 à
KEY 1000 ( evolution pulse de 1 à 2mS)
// 3 position fixes , evoluant à une vitesse reglable par la
coammnde
// DLY0 à DLY255 => permet de definir la
valeur de reglage "Tempo" par pas de 1mS
// mode 2: par cde MINI valeur correspondnat à
1mS atteinte avec un pas evoluant toute les "Tempo" mS
delay de boucle programme
// mode 3: par cde CENTRE valeur correspondnat
à 1,5mS atteinte avec un pas evoluant toute les "Tempo"
delay de boucle programmemS
// mode 4: par cde MAXI valeur correspondnat à
2mS atteinte avec un pas evoluant toute les "Tempo"delay
de boucle programme mS
// mode BAVARD ou SILENCIEUX via cde VERBOSE=1
ou VERBOSE=0
// Attention : le mode bavard penalise le temps de reaction !
// le temps de reacftion en mode VERBOSE=0, DLY0 , POT .. est de
l'ordre de 700mS pour aller entre MINI et MAX
// avec un moyennage de 8 mesures sur ADC RA1
Signal sur scope (Tektronix
TDS2002C)
![]() |
![]() |
![]() |
MINI | CENTRE | MAXI |
Cette pulse se repete toutes les 20mS ( via Timer2
interrupt)
sur le terminal RS232 :
Le projet MikroC :
16F1847_ADC_Test_Servo_170521.zip
source MikroC:
_16F1847_UART_ADC_Test_Servo_JR_C507_170521.c
test ADC seulement
161847_LCD4x20_I2C_ADC_UART_150427.c
Application THERMOMETRE ANALOGIQUE avec servomoteur + LM35DZ
:
Mesure de temperature LM35DZ 10mV/°C 200mV at 20°C
Usage de +VREF=1,024 pour la gamme de mesure ADC
Ce qui donne 102,4°C pleine echelle
Moyennage sur 10 mesures accumulées => nouvelle pleine
echelle 102,40 °C
pour extirper le 1/100em de degré .
L'indicateur a une gamme de 14 à 30 °C .. cas extreme en
appartement ..
d'ou la relation 1400 à 3000 pour faire evoluer de 1,0 à 2,0mS
la consigne du servo moteur .
soit ((k-1400) *10)>>4 ...=> commande 0 à1000 pour le
servo.
Source precedent à modifier en ce sens ..ou à votre sauce.
Je propose ici , seulement l'indicateur .. en
image de synthese .
et 2 modules
La partie specifique init ADC :
La partie Lecture ADC et moyennage + affchage LCD
A vous de proposer la suite ...