F8EOZ http://www.f8eoz.com Informatique - Electronique - Ham radio Thu, 11 May 2017 15:37:43 +0000 fr-FR hourly 1 http://wordpress.org/?v=3.5 Générateur HF 3MHz à 30MHz http://www.f8eoz.com/?p=4399 http://www.f8eoz.com/?p=4399#comments Tue, 09 May 2017 14:16:31 +0000 admin http://www.f8eoz.com/?p=4399 IMG_20170309_181716095-3Ce projet est né de mes nombreux échanges avec Michel F6FEO, pendant la fabrication du VEXIN, de la nécessité d’avoir un appareil de mesure simple répondant exactement au besoin le l’OM qui construit sa station. Voici en photo ci-contre, l’appareil réalisé par F6FEO. Je décris dans la suite de l’article la réalisation de ma version dont la partie électronique ne diffère que par les références de quelques composants pour raison de disponibilité.

1. Expression des besoins

L’une des étapes importantes de la réalisation d’un TRX est la conception des filtres. De la mesure de leurs caractéristiques, bande passante, réjection, atténuation, dépend le fonctionnement optimal de l’appareil. De même, la mesure du gain et de la linéarité de la chaîne d’émission driver et PA.

Voici en résumé quelques utilisations possibles de cet appareil :

  • déterminer les caractéristiques Fp et Fs des quartz,
  • Tester un filtre à quartz , tracer les caractéristiques des filtres passe-bande, passe-bas d’un transceiver décamétrique,
  • Mesurer le gain et la linéarité de la chaîne d’ émission driver et PA,
  • Analyser les antennes décamétriques à l’ aide d’ un pont de mesures.

2. Cahier des charges.

Notre générateur sera composé de 2 oscillateurs LC de type Hartley, l’un pour la bande de 3 à 9MHz (<10MHz), l’autre pour la bande 10 à 30MHz, suivi d’ un amplificateur feedback et d’un atténuateur calibré.

Amplificateur feedback: environ 10 dBm sous 50 Ohms

Atténuateur calibré : -10 db à -50 dB au pas de -10 dB

Affichage numérique interne ou externe de la fréquence de sortie.

Figure 1 - Schéma fonctionnel

Figure 1 – Schéma fonctionnel

3. Description de l’appareil

F6FEO, a retenu un montage de W7ZOI qui a servi de base au projet. En figure 1 ci-contre, le schéma fonctionnel réalisé avec Inkscape disponible ici. L’appareil se compose de 4 modules :

  • le générateur HF,
  • l’atténuateur sélectif ,
  • le fréquencemètre (optionnel peut être externe),
  • l’alimentation linéaire régulée.

4. Le générateur HF

En figure 2 ci-dessous le schéma original de F6FEO. Deux VFO à JFET J310, l’un pour la bande 3MHz à 9MHz, l’autre pour la bande 10MHz à 30MHz génèrent le signal. Chaque VFO est muni d’un RIT à varicap qui permet d’affiner le réglage de la fréquence et d’un filtre pour obtenir une bonne pureté du signal. Le choix de l’une ou l’autre bande se fait par commutation de l’alimentation et liaison par diode PIN à l’étage amplificateur suivant.

J’ai réalisé la bobine L1 du 1er VFO sur un mandrin LIPA de 8mm à noyau de fer réglable de récupération. Les 3 tours de couplage sur L1 prévus à l’origine sur le schéma me donnaient un signal déformé ont été ramenés finalement à 1 seul tour pour obtenir un signal correct.

La réalisation de la bobine L2 du 2nd VFO comme indiqué sur le schéma ne m’a pas permis d’obtenir une oscillation stable. J’ai obtenu un résultat correct en bobinant 15 tours de fil avec une prise à 4 tours sur un tore à poudre de fer T50-6. Un seul tour de couplage est nécessaire. Le dosage du couplage sur chaque oscillateur doit être soigné et ajusté empiriquement pour obtenir sur les 2 bandes le même niveau de tension.
Le modèle LTSPICE du 1er VFO, figure 3 montre la forme des signaux en divers point du circuit. Idem la figure 4 pour le 2nd VFO.

Le fichier de simulation LTSPICE est disponible ici.

Figure 2 - Schéma du circuit générateur

Figure 2 – Schéma du circuit générateur

Figure 3 - Générateur HF bande 3MHz à 9MHz - Simulation LTSPICE

Figure 3 – Générateur HF bande 3MHz à 9MHz – Simulation LTSPICE

Figure 4 - Générateur HF bande 10MHz à 30MHz - Simulation LTSPICE

Figure 4 – Générateur HF bande 10MHz à 30MHz – Simulation LTSPICE

5. L’atténuateur sélectif.

En figure 5 ci-dessous le schéma. Il comprend en série 1 atténuateur -10dB et 2 atténuateurs -20dB. Chaque atténuateur peut être shunté par un relais DPDT au moyen d’un commutateur rotatif 1 circuit 6 positions pour obtenir 0dB, -10dB, -20dB, -30dB, -40dB -50dB.

Pour les amateurs de simulation LTSPICE, j’ai réalisé un modèle de commutateur rotatif à partir du modèle fourni dans la documentation LTSPICE, voir encadré en bas de la figure 5. J’en explique le principe en quelques mots. La source de tension V2 génère une rampe avec la fonction Piecewise Linear. A chaque instant t la valeur de cette tension est transmise au sous-circuit rty_switch5 par la directive X5p rot1 51 52 53 54 55 rty_switch5 BRKF=0.01 dans laquelle

rot1= tension de la rampe à l’instant t,

51 à 55 : désignent les 5 plots du commutateur de-10dB à -50dB,

BRKF= espace de temps entre chaque transition.

Le sous-circuit en fonction de rot1 calcule la tension de chaque plot 51 à 55 = 12V ou 0V. Les plots commandent les diodes qui commandent les relais. Le chronogramme de la figure 5 montre les tensions obtenues en différents points du circuit avec une sinusoïde de 1V crête à 10MHz en entrée.

Le fichier de simulation LTSPICE est disponible ici.

Figure 5 - Générateur HF Atténuateur - Simulation LTSPICE

Figure 5 – Générateur HF Atténuateur – Simulation LTSPICE

6. Le fréquencemètre

Michel a opté pour un module acheté sur Ebay. J’avais 2 possibilités, soit construire une version de mon appareil décrite ici soit utiliser sa version externe décrite ici. J’ai préféré ce dernier choix.

7. L’alimentation linéaire régulée

Elle fournit 12V sous 500mA. Elle est construite autour d’un LM317 programmé pour obtenir 12V, schéma figure 6 ci-dessous. En cas d’utilisation d’un fréquencemètre interne prévoir la source de tension supplémentaire adaptée.

Le fichier de simulation LTSPICE est disponible ici.

Figure 6 - Alimentation linéaire régulée

Figure 6 – Alimentation linéaire régulée

8. Réalisation

Le générateur et l’atténuateur sont réalisés sur deux plaques époxy cuivrées double face d’environ 6,5×9,5 cm. L’alimentation sur une plaque époxy cuivrée simple face de 7×10,5cm. Les circuits sont réalisables entièrement à la main sans matériel particulier.

J’ai utilisé pour sa réalisation quelques feutres indélébiles de différentes pointes, un petit foret de 1 mm, une petite fraise pour évaser les trous, une perceuse à colonne, une boîte plastique provenant d’un emballage destiné à la poubelle pour le bain de perchlorure.

J’ai dessiné les circuits à main levée sur une page de cahier quadrillée 5x5mm. J’ai reporté le dessin obtenu sur une feuille de papier calque pour en obtenir le tracé miroir. Ce tracé a été ensuite reporté sur le cuivre à l’aide d’un papier carbone. Toutes les faces ont été étamées à chaud avec de la soudure.

Figure 7 - Générateur recto

Figure 7 – Générateur recto

Figure 8 - Générateur verso

Figure 8 – Générateur verso

Figure 9 - Atténuateur recto

Figure 9 – Atténuateur recto

Figure 10 - Atténuateurverso

Figure 10 – Atténuateurverso

9. Mesures

Après un temps de chauffage de quelques minutes le signal affiché sur le fréquencemètre reste stable. L’examen à l’oscilloscope du signal de sortie sur une résistance de 50 Ohms montre une sinusoïde parfaite figure 11 ci-dessous. La mesure de la la tension de sortie du 1er générateur sur une résistance de 50 Ohms donne environ 2V crête constant sur toute la bande de 3MHz à 9MHz. Le graphe de la figure 12 sur la bande 10MHz à 30MHz montre une tension crête de sortie quasi constante de 2V jusque 24MHz, cette tension diminue lentement à 1,3V à 30MHz.

Le graphe tracé avec Graph est disponible ici.

Figure 11 - Signal de sortie

Figure 11 – Signal de sortie

Figure 12 - Tension crête de sortie en fonction de la fréquence de 10 MHz à 30 MHz

Figure 12 – Tension crête de sortie en fonction de la fréquence de 10 MHz à 30 MHz

10. Montage

Le boîtier de base provient d’une alimentation de PC HS. La face avant a été découpée dans de l’alu de 2mm. Le circuit générateur est placé au dessus de l’atténuateur.

Figure 13 - Générateur HF face avant

Figure 13 – Générateur HF face avant

Figure 14 - Générateur HF intérieur

Figure 14 – Générateur HF intérieur

Index des articles de la catégorie labo-de-l-om

]]>
http://www.f8eoz.com/?feed=rss2&p=4399 2
CARTE QSL avec Inkscape http://www.f8eoz.com/?p=4360 http://www.f8eoz.com/?p=4360#comments Tue, 24 Jan 2017 11:27:26 +0000 admin http://www.f8eoz.com/?p=4360 qsl2_f8eozEn cette période d’échange des cartes de vœux de nouvel an, je vous propose la réalisation de votre carte QSL avec le logiciel libre Inkscape (GNU licence).

Le fichier comprend 6 calques que vous pouvez adapter à votre convenance:
calque#1 : photo de fond format 10×15 cm , « Ondankmeulen Boeschèpe Nord »
calque#2 : QRA locator « FRANCE JO10KQ »
calque#3 : indicatif « F8EOZ »
calque#4 : texte 1 « CONFIRMING QSO WITH »
calque#5 : informations techniques « RADIO, DATE, … »
calque#6 : texte 2 « 73 ».

Modifications possibles :
Photo,
Dimensions de la carte,
Couleur, police, taille des caractères,
Texte, emplacement des textes,
Ajout d’autres calques.

Le fichier est disponible ici.

Meilleurs vœux à tous. Gelukkig Nieuwjaar.

]]>
http://www.f8eoz.com/?feed=rss2&p=4360 1
ROS-mètre http://www.f8eoz.com/?p=4302 http://www.f8eoz.com/?p=4302#comments Fri, 25 Nov 2016 18:09:06 +0000 admin http://www.f8eoz.com/?p=4302 moulinmontagneWatten_0802Je vous propose la description de ce petit appareil simple à construire que j’utilise pour contrôler la puissance transmise à mon antenne. Le ROS mètre est décrit dans de nombreux documents. Je me suis appuyé sur les articles de Robert Berranger F5NB publiés dans Radio REF et disponibles aussi sur le blog du radio-club F6KRK.
J’ai repris le schéma du ROS-mètre avec transformateur de courant et transformateur de tension auquel j’ai ajouté un circuit simple d’affichage sur un galvanomètre.

1. Analyse du système de mesure

Le circuit se divise en 2 parties :

  • la mesure, qui est analysée ici,
  • l’affichage qui peut être au choix réalisé par un galvanomètre ou un affichage numérique.

Le circuit de mesure est composé de 2 transformateurs T1 et T2 et de 2 résistances de 50Ω.
T1 est un transformateur abaisseur de courant placé en série avec la source.
T2 est un transformateur de tension placé en parallèle à la charge.

1.1. Paramètres du système

Zc : impédance nominale le charge = 50Ω.
Pqro : Puissance maximum délivrée par la source de courant = 25W. C’est ma puissance maximum QRO.
Pqro = Uc²/2Zc où Uc = Tension crête,
On en déduit Uc = √(Pqro*2Z) = √(Pqro*100) = 10√(Pqro) = 10√25 = 50V.
Pour obtenir 50V crête sur 50Ω il faut I crête = 1A.
N: rapport de transformation de T1 et T2.
Je veux obtenir Ua=5V maximum à l’entrée de mon système d’affichage. Cette valeur est bien au-dessus du seuil de conduction des diodes Schottky 5v>>0,2V. J’ai aussi choisi cette valeur pratique et compatible avec une entrée ADC d’un microcontrôleur PIC ou autre (qui pourrait remplacer le galvanomètre).
On en déduit le rapport de transformation N = 50V/5V = 10.

Figure 1 - Circuit équivalent avec une charge de 50 Ohms

Figure 1 – Circuit équivalent avec une charge de 50 Ohms

1.2. Schéma équivalent

Le schéma équivalent modélisé sur LTSPICE figure 1 est constitué:

  • d’un générateur de courant I1 délivrant 1A/N crête qui représente T1,
  • d’un générateur de tension V2 = I1*Zc/N = 50V/N à la charge nominale qui représente T2,
  • d’une résistance R1 = 50Ω en parallèle à I1,
  • d’une résistance R2 = 50Ω en série avec V2.
1.3. Paramètres du modèle

Les éléments indiqués permettent d’adapter le système à votre cas de figure:

  • z : impédance de la charge entrée sous forme de liste de différentes valeurs en module,
  • Imax =1A : intensité du courant crête délivré par la source,
  • N =10 : rapport de transformation de T1 et T2,
  • v = (z*Imax)/N tension délivrée par le générateur de tension.
Figure 2 - Circuit équivalent avec une charge de 150 Ohms

Figure 2 – Circuit équivalent avec une charge de 150 Ohms

1.4. Mesures effectuées

Outre les graphes des tensions et courants du système, le modèle calcule:

  • Vm : tension crête au point M (tension réfléchie),
  • Vp : tension crête au point P (tension incidente ou directe),
  • ρ = Vm/Vp,
  • ROS = (1+ρ)/(1-ρ),

Attention à la polarité de I1 et V2. Les courants de I1 et V2 s’annulent. En cas d’inversion Vp et Vm sont inversés.
Les résultats sont enregistrés dans le fichier Error Log de LTSPICE.

Ci-dessus, figure 1 le résultat obtenu avec une charge de 50Ω. On obtient les valeurs nominales :

  • aucun courant dans R1, I1 ne débite pas,
  • IR2 = 0,1A (puissance moyenne dissipée dans R2 = 0,25W)
  • Vm = 0
  • Vp = 5V
  • ROS = 1

Figure 2, désadaptation importante avec une charge de 150Ω:

  • I1 débite du courant dans R1 = 0,1A
  • IR2 = 2A (puissance moyenne dissipée dans R2 = 1W)
  • Vm = 5V
  • Vp = 10V
  • ROS = 3

L’appareil ne doit pas être utilisé au delà de cette valeur.
Plus la désadaptation est grande, plus le courant augmente. Il y a risque de destruction de l’appareil en cas de branchement sans charge (Zc infinie).

Figure 3 - Schéma du circuit

Figure 3 – Schéma du circuit

2. Schéma du circuit

Figure 3, le schéma réalisé avec le logiciel libre KiCad disponible ici.

Remarque
Le circuit d’affichage est doublé pour alimenter les 2 canaux ADC d’un microcontrôleur (en prévision). Il peut être simplifié à un seul canal si on n’envisage pas ce montage en plaçant l’inverseur sur les points M et P.

2.1. Calcul des composants

Le ROS-mètre est calculé sur mesure avec ce cahier des charges :

  • 5W mini en QRP
  • 25W maxi en QRO
  • galvanomètre 100uA, avec cette échelle graduée jusqu’à 100 il est très facile de calculer le rapport de tension qui donne le ROS.

Les transformateurs T1 et T2 sont des FT50-43. Sur chacun, on bobine 10 tours de fil 0,6mm. La spire unique est constituée par la passage du câble coaxial RG58.

2.1.1. Calcul du potentiomètre de tarage

Pour obtenir la sensibilité maximum il faut que le potentiomètre de tarage Rv fasse dévier l’aiguille du galvanomètre à pleine échelle.
On calcule à 25W : Ia max = 100uA = 5V/Rv ou Rv=5V/0,1mA = 50kΩ.
Cependant il faut se prémunir contre une désadaptation importante et, puisque l’appareil est limité à un ROS de 3 qui donne une tension de mesure de 10V,
on calcule Rv = 10V/0,1mA = 100kΩ. On obtient à la valeur nominale une lecture pleine échelle à mi-course du potentiomètre.
A 5W En utilisation QRP, de la même façon on calcule Uc = 10√5 = 22,36V.
Avec le même rapport de transformation Ua = 22,36/10 = 2,23V qui reste encore au dessus du seuil de conduction des diodes Schottky.
On obtient 2,23/0,1 = 22,3kΩ pleine échelle soit 1/4 de tour de Rv.

3. Limites

En dessous de 1W, sauf à avoir un grande désadaptation de la charge, la tension réfléchie n’est plus mesurable.

Figure 4 - Courbe de puissance transmise

Figure 4 – Courbe de puissance transmise

4. Mesures

Plutôt que de parler de ROS, je préfère exprimer la puissance transmise P = Pi-Pr, figure 4.
On pose ρ = Vr/Vi.
Puisque ρ est un rapport de tension à la même impédance on peut écrire ρ² = Pr/Pi.
En ramenant à l’unité Pi si Pi ≠ 0 on écrit
P/Pi = 1-Pr/Pi = 1-ρ²

Exemple si Vr = 20 et Vi = 100 alors ρ=0,2.
P/Pi = 1-0,2*0,2 = 0,96 ou 96% et Puissance perdue = 4%.

Le fichier Graph est disponible ici.

Il n’est pas toujours possible d’obtenir un ROS de 1.
L’écart d’un point S correspond à un rapport de puissance de 4.
Si Vr/Vi= 0,5 (ROS = 3) alors la puissance transmise = 75%
Si nous sommes reçu S9 avec 100W émettre avec 75W se traduira par une baisse de 1/3 de point S.

Figure 5 - Courbe du rapport de transformation

Figure 5 – Courbe du rapport de transformation

5. Utilisation

Toujours connecter une charge.
Au départ inverseur sur Vref et potentiomètre au maximum de résistance.
Si tout va bien, inverseur sur Vdir. Tourner le potentiomètre jusqu’à avoir une lecture pleine échelle (100 sur mon galvanomètre).
Inverseur sur Vref. Calculer ρ = Vref/Vdir.

Pour changer le rapport de transformation utiliser le graphe ci-contre figure 5, disponible ici.

6. Montage

Le boîtier de base provient d’une alimentation de PC HS. Le circuit est réalisé en l’air (pas de gravure). Une petite plaque époxy cuivrée sert de support aux cosses sur lesquelles sont soudés les composants au plus court.
Les 2 transformateurs sont séparés par un écran fait d’une plaque d’époxy cuivrée double face, soudée perpendiculairement à la plaque de base.
Le blindage du RG58 doit être enlevé au plus court. Une seule extrémité est soudée à la masse, voir photos ci-dessous.

ROSmetre_1510

ROSmetre_1512

ROSmetre_1508

Index des articles de la catégorie labo-de-l-om

]]>
http://www.f8eoz.com/?feed=rss2&p=4302 0
Alimentation linéaire régulée ajustable 13,8V – 34V contrôlée en courant http://www.f8eoz.com/?p=4240 http://www.f8eoz.com/?p=4240#comments Fri, 18 Nov 2016 14:02:10 +0000 admin http://www.f8eoz.com/?p=4240 museeradioboeschepe_1587C’est une alimentation, construite principalement pour alimenter un amplificateur RF de puissance soit en QRP, soit en QRO. La tension de sortie peut être choisie, dans une plage comprise entre 13,8 V et 34 V. Je l’utilise aussi comme alimentation de laboratoire pour tester mes montages. Le courant maximal de sortie peut être choisi entre 2 valeurs: 3A ou 0,55A.

Elle est le fruit d’un travail commun avec Michel F6FEO qui m’a apporté son conseil éclairé pendant la réalisation.

1. Schéma

Ci-dessous figure 1, Le schéma de l’alimentation réalisé avec le logiciel libre KiCad. Il est le résultat de la fusion d’un schéma fourni par Michel F6FEO portant notamment sur le contrôle de l’intensité, et d’un autre paru dans le W1FB QRP Notebook page 27 figure 3-1 qui traite du bruit dans les alimentations.

Le coeur du montage est un régulateur de tension intégré de type LM338K,  version ancienne en boîtier TO-3 qui supporte 50W . Une version plus récente en boîtier TO-220 du LM3338T, supporte 25W.  Attention sur ebay circulent de fausses versions du lm338K. Les fichiers KiCad sont disponibles ici .

Figure 1 - Schéma de l'alimentation

Figure 1 – Schéma de l’alimentation

2. Le transformateur

J’ai opté pour une alimentation de type linéaire et non à découpage, l’abaissement de la tension secteur se fait grâce à un transformateur de type 230 V / 25 V provenant de Radiospare.
Le modèle Nuovem référence 0225P1-2-025,   torique a deux enroulements secondaires 2x25V à 112,5VA chaque. Les 2 enroulements du secondaire sont câblés en série (fils repérés par couleur voir daatasheet) pour être utilisés en redressement double alternance avec 2 diodes qui nécessite un point milieu. Ainsi  chaque secondaire pourrait supporter un courant théorique Imax=112,5/25=4,5A. Le transformateur est calculé large.

3. Redressement et filtrage

Chaque diode supporte la moitié du courant maximal de charge I=3/2=1,5A et supporte 2 fois la tension crête du secondaire = 25×1,414×2=71V.

Le filtrage pourrait être fait par un condensateur chimique de 6800 uF 63 V. Parce que je les avais en stock j’ai utilisé 2 condensateurs de 4700uF montés en parallèle. En règle générale on adopte une valeur comprise entre 1000 uF et 2000 uF par ampère, qui garantit une ondulation résiduelle assez faible en sortie.

4. Protection

Le primaire est relié à la terre. Il est protégé par un fusible à retard 2AT . Cela peut paraître beaucoup mais l’appel de courant pour la charge des condensateurs de filtrage est tellement fort à la mise sous tension que j’ai grillé bon nombre de fusibles avant de trouver la bonne valeur (merci Michel). Le secondaire est protégé par un fusible à retard 5AT. Tous les condensateurs ont une tension de service de 63V sauf les 2 condensateurs du primaire du transformateur qui ont une tension de service 1kV et les condensateurs en parallèle sur les diodes de redressement qui ont une tension de service de 100V.

Figure 2 - Courbe isopuissance 50W 25W

Figure 2 – Courbe isopuissance 50W 25W

5. Limites de fonctionnement

Si un tel régulateur permet de faire une construction simple, il faut en connaître les limites. Toutes les combinaisons tension, courant ne sont pas possibles. Il faut l’utiliser en connaissance.

Une partie de la puissance est dissipée par le régulateur en chaleur. Elle est égale au produit de la différence de tension entre son entrée et sa sortie (Vs-Ve) par le courant I qui le traverse. La tension présente à l’entrée du régulateur est ici fixe. On la calcule Ve=25Vx1,414 – 1.5V=34V (37V réellement mesuré à vide). Supposons une tension de sortie réglée à 14 V, la différence de tension entre entrée et sortie du régulateur est alors  34V – 14V=20V. Si le courant demandé en sortie est de 1A, la dissipation de puissance du régulateur est 20V x 1A=20W.  Cette puissance à dissiper est très grande, néanmoins elle est compatible avec le régulateur mais il faut un radiateur suffisant si on ne veut pas que le régulateur se bloque rapidement par protection contre la surchauffe. Avec un courant de 3A cela ne marcherait pas. Le régulateur LM338 possède une protection thermique, qui empêche l’utilisation du régulateur sous un courant  de 3 A avec une telle différence de tension entre entrée et sortie.

Attention au boîtier. La puissance dissipée maximale est de 25 W en boîtier TO220 ou de 50 W en boîtier TO3.

Pour connaître le domaine d’utilisation de l’alimentation j’ai tracé la courbe d’isopuissance à 50W et 25W, figure 2 ci-dessus.
L’équation qui donne la puissance maximum de 50W dissipée par le régulateur en fonction de la tension de sortie v et le courant i peut s’écrire:
50 = (34-v)i ou  encore v=f(i) = -50/i + 34. Définie pour i∈]0; 5A] et par construction pour v∈[13,8V ; 34V].

Ainsi la puissance dissipée par le régulateur sera < 50W pour v>-50/i + 34.
De même elle sera < 25W pour v>-25/i + 34.

Par exemple si i=2,5A il faudrait v>14V avec un régulateur supportant 50W à condition de dissiper toute la chaleur.

L’alimentation pourrait théoriquement débiter 3A à partir de 17,3V à condition que le régulateur LM338K soit refroidi suffisamment.
En résumé:

  • Tension d’entrée=34V
  • Puissance maximum dissipée par le LM338K: Pb max =50W
  • Puissance maximum dissipée par le LM338T: Pb max =25W
  • Intensité du courant maximum: Imax = 0.55A ou 3A
  • Puissance en entrée du LM338: Pe = 34 * I
  • Puissance en sortie du LM338: Ps = V * I si Pb < Pb max
  • Puissance absorbée par le LM338K: Pb = Pe – Ps < 50W
  • Puissance absorbée par le LM338T: Pb = Pe – Ps < 25W

Le fichier Graph est disponible ici.

6. Cablâge

A cette puissance, il est important d’utiliser du câble de forte section et d’étamer copieusement le circuit imprimé. J’ai utilisé du câble pour HiFi de 2,5mm² et 0,75mm².
Les connexions des résistances et condensateurs autour du régulateur doivent être faites au plus court et soudées au même point.

7. Réalisation

Le circuit a été scindé en 2 parties. La première est le redresseur, la seconde, la régulation.
Les bobines RFC1 et RFC2 ont été réalisées avec 2 grosses perles de ferrite provenant d’une alimentation de serveur HS. J’ai bobiné 10 tours de fil 0.9mm. L’inductance mesurée=100uH.
Deux galvanomètres, l’un pour la tension en parallèle sur la sortie, l’autre pour le courant en série avec la sortie, sont montés sur le boîtier.
L’alimentation est montée dans un boîtier métallique pour favoriser l’évacuation de la chaleur.
La base du boîtier provient d’une alimentation HS de PC. Le transformateur et le module redresseur sont placés dans le fond du boîtier.
Le module régulateur est placé sur une large cornière alu de 185x40x2mm fixée elle-même sur le panneau arrière.
Ci-dessous les photos montrant les étapes de fabrication.

alim100w_1566

alim100W_1568

alim100W_1594

alim100W_1590

Index des articles de la catégorie labo-de-l-om

]]>
http://www.f8eoz.com/?feed=rss2&p=4240 0
Le VEXIN SSB 40m http://www.f8eoz.com/?p=4037 http://www.f8eoz.com/?p=4037#comments Wed, 02 Nov 2016 12:06:15 +0000 admin http://www.f8eoz.com/?p=4037 bosquillonCassel_1606Je décris dans cette suite d’articles la réalisation de ma station construite autour du VEXIN.

Michel, F6FEO, le concepteur du VEXIN, m’a apporté son aide, et toute son expérience technique pour mener à terme ce projet démarré en février 2016.

Beaucoup d’émotion en fin de matinée du jeudi 22 septembre 2016. J’établissais sur 40 mètres mon 1er QSO phonie avec F6AWY, Patrick dans le Morbihan.

Si vous êtes passionnés par la technique, vous prendrez beaucoup de plaisir à construire et à utiliser ce petit appareil.

1. Description de ma station home-made

La station se compose des éléments suivants:

  • le transceiver VEXIN SSB 40m,
  • un PA de 5 à 20W,
  • une alimentation stabilisée linéaire fixe 13,6V pour le transceiver,
  • une alimentation stabilisée linéaire variable pour le PA,
  • un ROS mètre,
  • un coupleur d’antenne,
  • une antenne LEVY.

L’alimentation variable me permet de travailler en QRP sous 13,6V ou en QRO sous 18V à 30V.  Elle est équipée de 2 galvanomètres qui me donnent la tension et l’intensité. Connaissant par la mesure le rendement de mon PA, il m’est possible d’estimer et de contrôler simplement la puissance de sortie. Un contrôle d’intensité en limite le courant à 3A. Elle peut ainsi fournir 90W, ses possibilités dépassent largement celles de mon PA. Elle sera décrite dans un autre article.

Figure 1 - Schéma fonctionnel VEXIN (F6FEO)

Figure 1 – Schéma fonctionnel VEXIN (F6FEO)

2. Description du VEXIN

En figure 1 ci-contre, le schéma fonctionnel. En figure 2 ci-dessous, le schéma du circuit et la description extraits du site de F6EVT. Le VEXIN se compose de 7 modules :

  • l’ émétteur-récepteur,,
  • le RIT (qui n’apparait pas sur le schéma),
  • l’ amplificateur BF,
  • le S mètre,
  • le driver,
  • l’amplificateur de puissance RF et la commutation d’antenne,
  • la commutation et la distribution des tensions régulées.

Le travail le plus important consiste en la mise au point du super VXO, du BFO, des filtres à quartz. La dispersion des caractéristiques des quartz impose la fabrication sur mesure. Chaque élément est donc testé sur banc de test avant le montage définitif. En suivant ce principe, on obtient un fonctionnement optimal.

Figure 2 - Schéma du VEXIN (F6FEO)

Figure 2 – Schéma du VEXIN (F6FEO)

3. Le super VXO

Le super VXO (JA0AS (silent key), JH1FCZ) utilise 2 XTAL en parallèle de même fréquence nominale, ici 12096KHz (achetés chez  Jean-Michel F1JRK JMB-Electonique). On peut tirer la fréquence sur environ 140KHz tout en gardant une grande stabilité.
Ici la méthode de mise au point est empirique mais assez simple. L’oscillateur (se reporter au schéma) est monté à blanc sur une plaquette d’essais avec son condensateur variable de 50pF. On garde sous la main un jeu d’ inductances aux valeurs normalisées et l’on mesure de proche en proche, à l’aide du fréquencemètre la bande obtenue. En ce qui me concerne j’ai obtenu un bon résultat en plaçant en série 10uH+6.8uH. C’est un travail de patience mais l’on arrive à bout.

L’oscillateur fournit ainsi 11943kHz à 12090kHz soi Δƒ=147kHz.

Le second point consiste à vérifier la tension de sortie du VXO. Elle doit être suffisante et d’au moins 1V eff  (3Vcc) pour un fonctionnement correct du mélangeur. La tension d’alimentation a été fixée à 10V au lieu des 7V indiqués sur le schéma.

Figure 3 - Tableau des caractéristiques des quartz

Figure 3 – Tableau des caractéristiques des quartz

4. Le filtre à quartz

Elément essentiel du transceiver, il doit ne laisser passer en mode SSB qu’une des deux bandes latérales avec des flancs aussi abrupts que possible et une bande passante de 2,4kHz suffisante pour l’intelligibilité la voix, tout en ayant une atténuation aussi faible que possible.

La fréquence choisie est 4915kHz. Le filtre est constitué de 4 quartz aux caractéristiques les plus proches possibles. Son impédance = 1,2kΩ.

Sur un lot de 20 quartz (ou plus), voici les opérations à réaliser :

  • numéroter, mesurer et enregistrer les caractéristiques de chaque quartz,
  • classer, regrouper les quartz, extraire un groupe,
  • calculer le filtre théorique,
  • monter le filtre sur banc de test,
  • mesurer tracer la courbe de réponse du filtre.
4.1. Numéroter, mesurer et enregistrer les caractéristiques

J’utilise la méthode G3UUR que j’ai décrite dans un article précédent. Chaque quartz est numéroté de 1 à 20, monté successivement sur l’oscillateur puis mesuré avec et sans capacité en série. Le résultat est noté dans le tableau des caractéristiques des quartz OpenOffice.

4.2. Classer, regrouper les quartz, extraire un groupe

Le tableau est trié dans l’ordre croissant des fréquences. Pour faire ressortir les groupes, les lignes des quartz aux caractéristiques très proches sont coloriées. Des groupes de quartz aux valeurs voisines apparaissent ainsi. J’en ai tiré les n° 7, 10, 3, 13. D’autres séries sont possibles.

Figure 4 - Calcul du filtre 4 quartz

Figure 4 – Calcul du filtre 4 quartz

4.3. Calculer le filtre théorique

DISHAL de DJ6EV fournit un moyen simple et pratique de calcul des composants du filtre à quartz.

Caractéristiques :

  • nombre de  quartz (pôles) de 2 à 14,
  • couvre les filtres Butterworth et Chebyshev  (jusqu’à -3 dB d’ondulation en bande passante),
  • calcul précis des valeurs du filtre de type Cohn,
  • calcule une configuration Cohn avec une ondulation en bande passante très faible,
  • tous les quartz du filtre sont supposés avoir les mêmes paramètres (Fsérie, Lm, Cm, Co),
  • les quartz sont traités comme des résonateurs sans pertes.

Utilisation:
Mon filtre doit avoir les caractéristiques suivantes :

  • 4 quartz,
  • type Chebyshev avec -0,3db d’ondulation en bande passante acceptée (2),
  • bande passante 2400Hz (j’ai indiqué 2100Hz, nous verrons qu’en réalité la bande passante est un peu plus large),
  • Lm = 69,7mH (1),
  • Cm = 15,05130fF (calculé),
  • Fsérie = 4913,792KHz (1).

Ces valeurs sont entrées dans la première ligne en haut de la fenêtre sous le menu, figure 4 ci-dessus. En cliquant sur le bouton Calculate on obtient :

  • la courbe de réponse du filtre,
  • l’impédance du filtre = 1203,4Ω,
  • la fréquence centrale du filtre = 4915,442KHz,
  • les capacités Cs1=47,9pF, Ck23=47,9pF, Ck12=35,1pF du filtre figure 5, ci-dessous,
  • la fréquence de résonance parallèle Fp=4924,346KHz,
  • les bandes passantes à 6, 20, 40, 60, 80, 100dB qui renseignent sur la forme de la courbe.
Figure 5 - Filtre 4 XTAL

Figure 5 – Filtre 4 XTAL

Note (1) : DISHAL ne permet d’entrer que les paramètres d’un seul quartz de la série, j’ai donc choisi pour valeur de référence, le numéro 10 qui a la valeur médiane. Toutefois, si un quartz s’écarte un peu trop du quartz de référence, en cliquant dans le menu sur Xtal > Xtal Tuning, il est possible après calcul du filtre, de calculer le condensateur à placer en série avec le quartz.

Note (2): Pour obtenir l’impédance 1200Ω je commence par introduire une ondulation de 0.3dB que je diminue progressivement jusqu’à obtenir l’impédance souhaitée.

 
Figure 6 - Banc de test pour filtre - Schéma fonctionnel

Figure 6 – Banc de test pour filtre – Schéma fonctionnel

4.4. Monter le filtre sur banc de test

Le banc de test, figure 6 ci-contre, est nécessaire pour tracer avant montage la courbe de réponse du filtre. Eventuellement, retoucher la valeur des capacités. La platine de test, figure 7 ci-dessous, a été conçue par F6FEO. J’ai simplement remplacé le transistor 2n2369 par 2n2222. Le courant de collecteur du premier étage de la platine de test doit être ajusté (voir note ci-dessous) au moyen de la résistance variable du pont de base pour obtenir l’impédance de 50Ω à l’entrée de l’étage. Le générateur HF est le VCO décrit ici. Je l’ai reprogrammé en changeant son circuit LC pour qu’il se situe dans la gamme de fréquence du filtre (circuit LC enfichable). Le fréquencemètre associé au VCO est décrit ici. La sonde HF de mesure est constituée d’une diode schottky et d’une capacité de 100nF. On place en sortie de la platine de test une résistance de 50Ω pour la mesure.

Figure 7 - Platine de test pour filtre (F6FEO)

Figure 7 – Platine de test pour filtre (F6FEO)

Note : dans son schéma, Michel, utilise la formule Zin=26/0.6 où 26mV = Vth est la tension thermique et 0.6mA = Ic est le courant de collecteur de repos. La pente du transistor est gm = Ic / Vth . En base commune, la résistance d’entrée = 1/gm.

Figure 8 - Courbe de réponse du filtre 4 quartz

Figure 8 – Courbe de réponse du filtre 4 quartz

4.4. Mesurer tracer la courbe de réponse du filtre

Méthode de relevé des mesures
Mon VCO ne couvrant pas une large plage de fréquences, j’ai choisi de faire varier sa fréquence du mini au maxi et de relever la mesure de la tension de sortie chaque fois qu’elle est décelable et notable sur l’appareil de mesure.
Traçage
Pour tracer la courbe j’utilise le logiciel libre Graph. Les valeurs sont enregistrées dans une série en coordonnées cartésiennes (fréquence,gain). Le logiciel fait le reste par interpolation. Après avoir fait des essais avec différentes valeurs de capacité, j’en suis arrivé à la courbe de la figure 8 ci-contre. Le fichier Graph est disponible ici.

5. Le filtre de contour

Le VEXIN utilise en sortie du mélangeur un 1er filtre FI construit avec un quartz. Le filtre de contour, roofing filter, limite la bande passante et atténue les signaux forts qui, trop près de la bande passante, pourraient saturer l’étage FI suivant.

La méthode de mesure est la même. Le filtre est monté sur la platine de test. Le test est fait de façon empirique avec différents quartz voisins du groupe qui a servi à fabriquer le filtre à 4 quartz. Différentes valeurs de capacité sont testées. La difficulté est de choisir une combinaison qui croise au mieux les 2 filtres.

Finalement c’est le quartz n°15 avec 2 capacités de 22pF qui a donné le meilleur résultat figure 9, ci-contre. Le fichier Graph est disponible ici.

Figure 9 - Courbesde réponse des 2 filtres

Figure 9 – Courbes de réponse des 2 filtres

Figure 10 - Exemple LTSPICE FFT du modulateur

Figure 10 – Exemple LTSPICE FFT du modulateur

6. Le BFO

6.1. Produire les signaux B.L.U.

Un oscillateur à quartz (BFO) génère la porteuse destinée à être modulée (ou démodulée). La porteuse est appliquée à un modulateur équilibré à 2 diodes Schottky (appairées au multimètre) qui reçoit en outre les signaux BF provenant de l’amplificateur du microphone. Le modulateur  a la propriété de donner 2 bandes latérales modulées tout en atténuant fortement la porteuse. Le filtre à quartz suivant laisse passer la bande utile. On obtient ainsi une bonne suppression de la bande indésirée et une suppression supplémentaire de la porteuse.

Une simulation avec LTSPICE FFT montre figure 10, le spectre de fréquences obtenu en série de Fourier. Dans cet exemple le signal du BFO=4914kHz, le signal BF = 1kHz. On récupère à la sortie un signal de 4913kHz et un signal de 4915kHz, le signal porteur est atténué de 35dB environ. Le filtre à quartz gardera 4915kHz et augmentera l’atténuation du signal porteur pour l’élever à environ -50dB. D’où l’importance du bon réglage du BFO en tension et en fréquence. En tension, pour que les diodes qui ont une tension de seuil de 0,2V soient rendues conductrices. En fréquence, pour que la porteuse soit située du côté gauche et en dehors de la courbe de réponse du filtre à quartz pour ne laisser passer que le spectre des fréquences de la voix humaine (200 à 2500Hz) dans la fenêtre du filtre à quartz. Le fichier de simulation est disponible ici.

Le niveau BF en entrée du modulateur est aussi important, nous verrons au chapitre réglage comment procéder.

6.2. Méthode de mise au point

J’ai utilisé la même méthode que le VXO. Le BFO est monté à blanc sur plaquette d’essai. J’ai choisi dans ma liste le quartz n°9 parce qu’il se trouvait bien à gauche de la fréquence basse de mon filtre à quartz. Je n’avais pas comme sur le schéma de Michel une bobine à noyau réglable, j’ai donc utilisé un jeu d’inductances standards et un petit condensateur ajustable montés en série avec le quartz. Le but étant de tirer la fréquence sur quelques kHz pour pouvoir placer la porteuse à gauche et hors de la bande passante du filtre, suffisamment pour augmenter l’atténuation de la porteuse. Ici encore le réglage doit être fait sur mesure, de façon empirique. Voici la combinaison qui va bien avec ce quartz:

  • L=22uH+15uH
  • C=60pF
  • Variation Δƒ = 4913,648kHz à 4915,984kHz = 2,3KHz.

Contrairement à ce qui est indiqué sur le schéma, le BFO a été alimenté en 6V stabilisé. Notez aussi que Michel, pour donner plus de force au signal BF, a remplacé dans l’amplificateur du microphone la résistance du pont de base de 470kΩ par une 1MΩ et le potentiomètre ajustable du collecteur de 2,7kΩ par 4,7kΩ.

Figure 11 - cablâge du vexin

Figure 11 – cablâge du vexin

7. Réalisation du circuit imprimé principal

Le VEXIN tient sur une plaque époxy cuivrée double face plus petite que le format carte postale  (< 10x15cm). Le circuit est très dense. Michel l’a étudié au mm en faisant au plus court. Néanmoins il est réalisable entièrement à la main sans matériel particulier.

J’ai utilisé pour sa réalisation quelques feutres indélébiles de différentes pointes, un petit foret de 0,8mm, une petite fraise pour évaser les trous, une mini perceuse, une boîte plastique provenant d’un emballage destiné à la poubelle pour le bain de perchlorure.

J’ai dessiné le circuit à main levée en suivant au plus près le tracé de Michel figure 11 ci-contre. Je me suis aidé d’un papier calque pour vérifier qu’il ne manquait rien. Les 2 faces ont été étamées à chaud avec de la soudure.

vexinExicterVerso_1497

Vexin photo 1

Ci-dessous quelques photos montrant le recto, le verso en cours de câblage et son installation sur le châssis.

vexinExiterRecto_1495

Vexin photo 2


vexinMontage_1652

Vexin photo 3

 

Figure 10 – Exemple LTSPICE FFT du modulateur
Figure 11 - Ampli BF Elex

Figure 11 – Ampli BF Elex

8. Amplificateur audio

8.1. Description

Ce qui caractérise le VEXIN c’est l’absence de souffle. L’amplificateur audio ne dépareille pas : simplicité, efficacité. Construit avec des composants discrets, il alimente un casque audio. Le schéma d’origine de la revue disparue Elex figure 11 ci-contre, a été légèrement modifié pour donner le schéma figure 12 ci-dessous. Michel  a ajouté un transistor en entrée commandé par la tension E+ (Emission/Réception) qui fonctionne en commutateur. Si E+=0 (Réception) alors le transistor Q2 ne conduit pas et Vc=0. Les transistors complémentaires BC550B/BC560B sont des transistors  à faible bruit. Le fichier de simulation LTSPICE est disponible ici.

8.2. Réalisation
Figure 12 - Amplificateur audio - Schéma du circuit

Figure 12 – Amplificateur audio – Schéma du circuit

Il tient sur un petite plaque époxy cuivrée simple face de 5x5cm environ, figure 13 ci-dessous. Il y a de la place. La photo ci-dessous le montre en cours d’installation sur le châssis près du potentiomètre de volume.

Figure 13 - Amplificateur audio - Circuit imprimé

Figure 13 – Amplificateur audio – Circuit imprimé

Amplificateur audio

Vexin photo 4

Figure 14 - Driver - Schéma du circuit

Figure 14 – Driver – Schéma du circuit

 9. Driver

9.1. Description

Ci-contre figure 14, le schéma du circuit et le tracé par LTSPICE des tensions en différents points du circuit.

Il faut noter que les 2 transistors de sortie dissipent 1,6W chacun et nécessitent un bon radiateur. Leur courant de collecteur de repos Ic=130mA. La résistance R9 de 500Ω  dissipe plus de 250mW, prévoir 0,5W. La puissance fournie sur une charge de 50Ohms est d’environ 300mW. Celle-ci peut être réduite en plaçant un atténuateur entre le premier et le second étage.

La simulation LTSPICE montre que le gain est constant jusqu’à environ 10MHz. Le gain théorique maximum sans atténuateur est de 17dB pour le premier étage et 36dB pour l’ensemble. Ces résultats confirment les valeurs que Michel m’a indiquées.

Figure 15 - Driver - Courbe de réponse

Figure 15 – Driver – Courbe de réponse

Ci-dessous les tensions et courants en continu donnés par LTSPICE :

Name:       q3          q2          q1
Model:    2n2219a     2n2219a     2n2219a
Ib:       7.55e-04    7.55e-04    2.00e-04
Ic:       1.30e-01    1.30e-01    3.78e-02
Vbe:      7.84e-01    7.84e-01    7.43e-01
Vbc:     -1.12e+01   -1.12e+01   -6.31e+00
Vce:      1.20e+01    1.20e+01    7.05e+00
BetaDC:   1.72e+02    1.72e+02    1.89e+02
Gm:       3.92e+00    3.92e+00    1.32e+00
Rpi:      3.58e+01    3.58e+01    1.37e+02
Rx:       1.00e+01    1.00e+01    1.00e+01
Ro:       6.54e+02    6.54e+02    2.12e+03
Cbe:      1.66e-09    1.66e-09    5.83e-10
Cbc:      2.85e-12    2.85e-12    3.40e-12
Cjs:      0.00e+00    0.00e+00    0.00e+00
BetaAC:   1.40e+02    1.40e+02    1.81e+02
Cbx:      0.00e+00    0.00e+00    0.00e+00
Ft:       3.75e+08    3.75e+08    3.58e+08

Le fichier de simulation LTSPICE est disponible ici.

9.2. Réalisation
Figure 16 - Driver - Circuit imprimé (F6FEO)

Figure 16 – Driver – Circuit imprimé (F6FEO)

Le Driver est monté sur une petite plaque époxy cuivrée double face de 45x75mm, figure 16 ci-dessus. Il y a de la place. Je n’ai pas trouvé de radiateur suffisant pour ces transistors. Je les ai réalisés avec un bout de tuyau de cuivre souple de 8mm provenant d’un vieux robinet. Alésé légèrement, il s’adapte parfaitement au transistor avec un peu de graisse silicone. J’y ai soudé une aile en cuivre faite avec un bout de tuyau refendu. Le système est un peu encombrant mais efficace, photo ci-dessous.

driver_1530

Vexin photo 5

Figure 17 - Amplificateur RF de puissance (F6FEO)

Figure 17 – Amplificateur RF de puissance (F6FEO)

10. L’amplificateur RF de puissance

10.1. Description

Ci-contre figure 17, le schéma du circuit. Le schéma d’origine est construit autour de l’IRF510. Je l’ai remplacé par l’IRFZ24 qui donne un meilleur résultat. Il est intéressant d’examiner sa courbe caractéristique de transfert  Id-Vgs figure 18 ci-dessous.

Note : le modèle SPICE de l’IRFZ24 provient le la documentation VISHAY.

L’amplificateur travaille en classe AB. Concrètement cela signifie qu’un petit courant Id de repos circule dans le transistor et que son point de repos est situé en bas de la courbe caractéristique, encadré rouge sur la courbe de transfert. Pour un fonctionnement correct le courant de drain de repos doit se situer entre 70 et 100mA. Le régulateur de tension de 5V et le potentiomètre permettent ce réglage assez pointu. En effet, comme le montre la courbe, à partir de la tension de seuil, quelques dixièmes de volt font vite monter le courant Id. Comme la dispersion des caractéristiques de ces transistors est grande, le réglage doit être fait sur mesure. Le fichier de simulation LTSPICE est disponible ici.

Figure 18 - Courbe de transfert Id-Vgs

Figure 18 – Courbe de transfert Id-Vgs

Pour faire le réglage procéder ainsi :

  • avant la première mise sous tension prendre soin de faire Vg=0 en plaçant le potentiomètre au minimum,
  • placer temporairement un ampèremètre dans le circuit de drain,
  • monter tout doucement la tension Vg en tournant le potentiomètre jusqu’à atteindre le courant Id de repos.

Ci-dessous un test de simulation figure 19, avec différentes tensions d’alimentation Vdd, Vgs=3.69V  et 250mW en entrée. Voici la puissance théorique obtenue :
Vdd= 13,6V, Peff= 10W,
Vdd=18V, Peff= 19W,
Vdd= 20V, Peff= 23W.

En réalité voici ce que j’obtiens :
Vdd=13,6V,  Peff= 5W,
Vdd=18V, Peff=9 à 10W.
Rendement entre 62 à70%.
L’écart entre le résultat théorique et le résultat réel provient de la tension d’entrée réelle qui est plus faible.

Figure 19 - Amplificateur RF de puissance - Modèle LTSPICE

Figure 19 – Amplificateur RF de puissance – Modèle LTSPICE

10.2. Réalisation

Le PA est monté sur une petite plaque époxy cuivrée double face de 45x75mm. Il est muni d’un radiateur imposant. Il porte le relai d’antenne commandé par la tension de commutation E+ (voir circuit de commutation). Ci-dessous photos du montage. Ici un exemple de bobinage du tore binoculaire, donné par F6FEO au paragraphe PA.

vexinPA_1656

Vexin photo 6

vexinPA_1649

Vexin photo 7

 

11. Le S mètre

Ci-dessous le schéma, figure 19. Il a été monté sur une plaquette pastillée étamée double face et fixé directement derrière le galvanomètre sur le panneau avant comme le montre la photo ci-dessous. Ne disposant de générateur de niveau S pour l’instant (en projet) le réglage a été effectué à l’oreille en fonction des niveaux de report obtenus. Vérifier en entrée que la tension de CAG= 0 à -5V selon le niveau du signal reçu.

Figure 19 - S mètre (F6FEO)

Figure 19 – S mètre (F6FEO)

vexinmontage_1651

Vexin photo 8

12. Le RIT

Ci-dessous le schéma, figure 20. Utiliser une diode varicap à faible capacité résiduelle. Il a été monté sur une plaquette pastillée fixé en parallèle au condensateur variable d’accord directement derrière le potentiomètre de RIT sur le panneau avant, photo 8 ci-dessus. La variation de fréquence Δƒ≈1kHz.

Figure 20 - Schéma du RIT (F6FEO)

Figure 20 – Schéma du RIT (F6FEO)

13. Commutation et distribution des tensions régulées basse puissance

Ci-dessous le schéma, figure 21. Description du dispositif:

  • entrée: alimentation régulée stabilisée 13.6V basse puissance (hors PA),
  • fusibles de protection,
  • fournit l’alimentation régulée permanente 13,6V du TRX sauf PA (contrairement à ce qui est indiqué sur le schéma),
  • fournit l’alimentation régulée du VXO 10V (et non 9V comme indiqué sur le schéma),
  • fournit l’alimentation régulée du BFO 6V (ajouté un régulateur 6V, non prévu sur le schéma),
  • relai de commutation Emission / Réception qui fournit E+=13,6V et R+=13,6V,
  • prise PTT qui commande le relai ci-dessus.
vexin-commutation

Figure 21 – Schéma du circuit de commutation (F6FEO)

Le circuit est monté sur une plaquette pastillée étamée double-face, photo 8 ci-dessus.

14. Fabrication du boîtier

Le boîtier est monté autour d’un châssis construit façon Meccano fait de cornières métalliques perforés et assemblées pour former un cadre rigide. Dessus sont vissées des chutes de tôles alu de 1,5mm et un panneau avant et arrière en alu de 2mm. Ci-dessous, photos montrant les étapes de construction.

chassis_1609

Vexin photo 9

chassis_1610

Vexin photo 10

faceavant_1660

Vexin photo 11

15. Réglages

Récepteur
Régler au maximum de réception en milieu de bande, la capacité ajustable du circuit d’accord formé avec L1 en entrée sur la grille 1 du BF960.

Emetteur filtre passe bande
Ne pas connecter ni le driver ni le PA.
Mettre une résistance carbone de 50Ω en sortie Tx du vexin.
Placer sur cette résistance une sonde HF reliée à un multimètre analogique.
Injecter un petit signal BF de 1kHz dans l’entrée microphone.
Régler les condensateurs ajustables du triple filtre passe bande formé avec L3, L4,L5, au maximum de signal.

Emetteur modulateur
Régler la modulation en plaçant le potentiomètre ajustable de l’amplificateur du microphone  au maximum de modulation.
Descendre  doucement jusqu’au point ou le signal diminue.

Emetteur driver
Connecter le driver à une charge fictive de 50Ω.
Placer sur cette résistance une sonde HF reliée à un multimètre analogique.
Vérifier que la tension de crête = 8V soit environ 320mW sur 50Ω.
Si la tension est trop forte placer un atténuateur dans le driver entre les 2 étages (voir schéma).
La puissance délivrée doit être au minimum de 250mW (tension de crête = 7V environ).

Emetteur PA
Connecter le PA à une charge fictive. Se reporter au paragraphe PA pour le réglage et les valeurs de puissance à obtenir.

A suivre…

]]>
http://www.f8eoz.com/?feed=rss2&p=4037 7
PIC Microchip – Application du 16F88 – Le Bootloader http://www.f8eoz.com/?p=3904 http://www.f8eoz.com/?p=3904#comments Mon, 23 Nov 2015 11:41:18 +0000 admin http://www.f8eoz.com/?p=3904 chargePIC_1473Cet article s’inscrit dans le droit fil des précédents, l’utilisation et la programmation des microcontrôleurs. Le 16F88 à un avantage sur les microcontrôleurs que j’ai utilisés jusqu’ à présent, il dispose de la possibilité d’écriture de son propre programme (self-programming). Ce programme est chargé dans le PIC au moyen de deux autres programmes, l’un situé sur le PC, l’autre résident sur le PIC appelé Bootloader  qui communiquent entre-eux. Le programme résident nécessite d’être chargé une première fois, au moyen d’un programmateur.

1. Cahier des charges

1.1. Contraintes techniques

Si l’avantage de ce dispositif est de faciliter la mise au point des programmes en évitant de remettre sans cesse le microcontrôleur sur le banc du programmateur, il y a aussi des inconvénients.

Le premier tient au Bootloader lui-même. Le programme résident consomme un peu de l’espace mémoire du PIC et réduit d’autant l’espace disponible pour l’application. Les suivants sont inhérents à la technologie et au fonctionnement du PIC.

La configuration du microcontrôleur ne peut pas être changée dynamiquement ce qui implique de recharger le programme résident au moyen du programmateur lorsque la configuration ne correspond plus à l’usage.

La technique d’écriture en mémoire programme peut varier d’un microcontrôleur à l’autre. L’écriture en mémoire programme du 16F88 nécessite une phase d’effacement préalable (Erase). L’effacement est réalisé par bloc de 32 mots. Les 11 bits les plus forts de l’adresse pointent sur le bloc à effacer, les bits de poids faibles 4:0 sont ignorés. Quant à l’écriture, elle est réalisée en bloc de 4 mots. Un bloc à écrire consiste en 4 mots consécutifs dont les 2 bits 1:0 de poids faibles de l’adresse s’étendent de 00 à 11. Les mots sont placés en buffer d’écriture et l’opération d’écriture n’est effective qu’à l’application du mot 11. Cette séquence est réalisée automatiquement par le processeur. L’écriture en EEPROM se fait mot par mot de 8 bits sans effacement préalable. Tout ceci est fort bien expliqué dans la documentation technique du 16F88 de MICROCHIP au chapitre 3 « DATA EEPROM AND FLASH PROGRAM MEMORY ».

1.2. Solution

Le travail est réparti sur 2 programmes l’un sur le PIC, le Bootloader, appelé chargePIC16F88, l’autre sur le PC, appelé chargePIC.

1.2.1. Le Bootloader chargePIC16F88

Son rôle sera simplifié au maximum. Bien que son nom porte le suffixe 16F88, j’espère le généraliser à d’autres PIC du même type, mais c’est une autre histoire et je ne peux le vérifier sans faire de tests. A dessein, pour le rendre générique, il ne traite qu’une opération élémentaire à la fois envoyée par le PC :

  • connexion (login),
  • lecture d’un mot en mémoire programme,
  • lecture d’un mot en EEPROM,
  • effacement d’un bloc en mémoire (ici le terme bloc peut signifier 1 ou n mots selon le microcontrôleur),
  • écriture d’un mot en mémoire programme,
  • écriture d’un mot en EEPROM,
  • déconnexion (logout) et exécution de l’application.
Calcul

CRC (contrôle de redondance cyclique ou checksum) qui se résume à une addition et une opération logique. En cas d’erreur, l’opération est rejetée et un code est retourné au PC qui s’en arrange.

Configuration

La version proposée ici est une version basique avec oscillateur interne à 4MHz. qui utilise pour mes tests un minimum de composants. D’autres variantes avec oscillateurs externes seront disponibles en téléchargement.

Plan mémoire

Le Bootloader est réparti sur 2 segments mémoire :
l’un en tête, servant au reset et la redéfinition du plan mémoire pour l’application utilisateur (re-mapping),
l’autre, en fin de mémoire, le Bootloader proprement-dit.

Le Bootloader doit rester à l’abri de l’écriture. Pour les 16F88 ces segments sont calés sur des blocs de 32 mots au prix de la perte d’un peu de place.
Le plan mémoire ainsi défini pour le 16F88 et sa famille n’est pas figé pour s’adapter à d’autres microcontrôleurs et ne pas gaspiller la place mémoire. Au login, le PIC transmet au PC les propriétés du Bootloader.  Avec ces propriétés, le PC se construit  une image du plan mémoire.

Déclenchement

Au reset, à la mise sous tension, chargePIC16F88 attend un code de LOGIN. Au bout d’un temps réglable (login timeout), en l’absence de réception de ce code, LOGOUT/RUN est exécuté et l’application utilisateur est lancée. A réception du LOGIN le Bootloader retourne le code de LOGIN et les propriétés du Bootloader.  L’application hôte chargePIC est maintenant maître du PIC. Le Bootloader chargePIC16F88  se met en attente d’une commande de l’hôte.

1.2.2. L’application hôte chargePIC

Son rôle premier est de charger un fichier HEX (Intel) contenant les instructions de l’application utilisateur dans l’espace mémoire du PIC qui lui est réservée. Au prix d’un peu de code supplémentaire, je l’ai doté de fonctions de lecture pour faciliter le débogage et l’écriture séparée de l’EEPROM pour la mise à jour de paramètres. Pour atteindre ces buts, l’application dispose des fonctions suivantes :

  1. Se connecter au PIC et obtenir les propriétés du Bootloader
  2. Choisir dans une liste le µcontrôleur et ses propriétés,
  3. Charger le fichier HEX contenant l’application utilisateur, le traduire en liste d’instructions et en afficher le résultat
  4. Afficher le plan mémoire programme utilisateur et EEPROM
  5. Effacer écrire l’application utilisateur
  6. Relire vérifier l’écriture du programme utilisateur
  7. Lire la mémoire programme ou l’EEPROM
  8. Enregistrer l’historique du traitement dans un fichier journal (log)
  9.  Calculer SPBRG
  10. Calculer le délai de connexion

Le  logiciel dispose d’un catalogue des microcontrôleurs et de leurs propriétés qui pourra être enrichi.

L’application fonctionne sous Windows, testée sous Windows7 64 bits.

2. Choix des outils de développement

En tant qu’amateur j’utilise uniquement des outils gratuits ou des Open source.

2.1. Bootloader chargePIC16F88

Environnement de développement MICROCHIP: MPLAB IDE v8.92.
Langage de programmation: assembleur MPASMWIN v5.51 . Je reste fidèle à l’assembleur qui, pour moi, reste le moyen le plus simple et le plus clair d’obtenir la meilleure solution à ce type de problème.

2.2. Application hôte chargePIC

Environnement de développement MICROSOFT: IDE Microsoft Visual Studio 2015 pour Windows Desktop.
Langage de programmation: Microsoft Visual C# 2015 .

3. Choix du dispositif de communication

PC : Lignes de communication Emission/Réception : port série RS232.
Interface : Liaison série: asynchrone, convertisseur RS232 TTL MAX3232.
PIC : Lignes de communication Emission/Réception  UART: bornes TX et RX du PIC.

La trame UART est constituée des bits suivants :

  • un bit de start servant à la synchronisation du récepteur,
  • 8 bits de données,
  • pas de bit de parité,
  • un bit de stop.
Figure 1 - Diagramme fonctionnel

Figure 1 – Diagramme fonctionnel

4. Mise en oeuvre du Bootloader chargePIC16F88

La figure 1, ci-contre, montre le diagramme fonctionnel du dispositif. Comme vous pouvez le constater, il est le fils de usartELOADER décrit dans l’article précédent, implémenté de nouvelles fonctions. Le protocole de transmission a été revisité.

4.1. Initialisation

Le programme doit être chargé une première fois au moyen d’un programmateur. J’ai utilisé mon programmateur et l’excellent PICpgm. L’opération est sans souci. Le 16F88 s’insère sur le support ZIF de la même manière que le 16F84.

4.2. Test de bon fonctionnement

Le bootloader est fourni préchargé dans l’espace utilisateur avec un petit programme qui fait simplement clignoter une LED. Pour le faire fonctionner, connecter en série sur la broche 1 du PIC (port RA2) une résistance de 470 Ω et une LED. Sur le PC, activer chargePIC (qui sera décrit ci-après), cliquer sur Connecter (Login) puis sur Exécuter (Run). La LED doit clignoter, signe que tout va bien ! Ce petit programme sera naturellement détruit ensuite par le chargement de votre propre application.

4.3. Application utilisateur

Un exemple d’application est donné ci-dessous. Il faut veiller à rester dans les limites de la mémoire dédiée à l’application. Le logiciel chargePIC prévient tout effacement du Bootloader et signale les débordements.


__CONFIG    _CONFIG1, _INTRC_IO  & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
            & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

;-------------------------
; Programm Vector  Address
RESET_VECTOR	EQU	0x0000	; Address of RESET Vector
ISR_VECTOR      EQU	0x0004	; Address of Interrupt Vector
BANK0_RAM_DATA	EQU	0x0020	; 16 General Purpose registers (SRAM)
COMMON_RAM_DATA	EQU	0x0070	; 16 General Purpose registers (SRAM)
EEPROM_DATA     EQU	0x2100	; EEPROM address

;----------------------------------------------------------------------
; BOOTLOADER RESET SEGMENT RESERVED 32 WORDS
;----------------------------------------------------------------------
BLOADER_OFFSET    EQU 0x20

    ORG     RESET_VECTOR
    goto    RESET_VECTOR+BLOADER_OFFSET

; interrupt vector
    ORG     ISR_VECTOR
    goto    RESET_VECTOR+BLOADER_OFFSET+4

;----------------------------------------------------------------------
; END BOOTLOADER RESET SEGMENT RESERVED 32 WORDS
;----------------------------------------------------------------------

;----------------------------------------------------------------------
; USER APPLICATION SEGMENT
;----------------------------------------------------------------------

; Re-mapped Reset Vector
    ORG     RESET_VECTOR+BLOADER_OFFSET
UserReset
    goto    UserStart

; Re-mapped Interrupt Vector
    ORG     RESET_VECTOR+BLOADER_OFFSET+4
UserISR
    ;retfie
    goto    UserInterrupt

;----------------------------------------------------------------------
; USER PROGRAM STARTS HERE
;----------------------------------------------------------------------

UserStart
Main
#DEFINE LED    PORTA,2            ; LED

    banksel PORTA
    clrf    PORTA
    clrf    PORTB
    ; set up option register
    bsf     STATUS,RP0        ; Bank1
    movlw   B'00001000'
    ;         0-------  NOT RBPU: 0 = PORTB pull-ups are enabled by individual port latch values
    ;         -0------  INTEDG: 0 = Interrupt on rising edge of RB0/INT pin
    ;         --0-----  T0CS: 1 = Transition on GP2/T0CKI pin0=output
    ;         ---0----  T0SE: 1 = Increment on high-to-low transition on /T0CKI pin not used, MCLR and reset
    ;         ----1---  PSA: 1 = Prescaler is assigned to the WDT
    ;         -----000  PS2:PS0: 111= 1:128 prescaler
    movwf   OPTION_REG
    bcf     LED                ; TRISA output
    bcf     STATUS, RP0        ; Bank0

MainLoop
    bsf     LED                ; LED on
    call    delay
    bcf     LED                ; LED off
    call    delay
    nop
    nop

    goto    MainLoop    ; For Ever Loop------>

;-------------------------
; USER PROGRAM SUBROUTINES
;-------------------------
delay
    movlw   2
    movwf   cmpt3
delay3
    clrf    cmpt2
delay2
    clrf    cmpt1
delay1
    nop
    decfsz  cmpt1, f
    goto    delay1
    decfsz  cmpt2, f
    goto    delay2
    decfsz  cmpt3, f
    goto    delay3
    return

;------------------
; INTERRUPT MANAGER
;------------------
UserInterrupt
    ;save register
    movwf	ISRwreg  		; WREG
    swapf	STATUS,w		; STATUS without change Z
    movwf	ISRstatus		;
    ;restore register
UserInterrupt_end
    swapf	ISRstatus,w		; STATUS without change Z
    movwf   STATUS
    swapf   ISRwreg,f		        ; WREG without change Z
    swapf   ISRwreg,w
    retfie  				; return from interrupt set GIE

;----------------------------------------------------------------------
; EEPROM
;----------------------------------------------------------------------
	org 	EEPROM_DATA

;----------------------------------------
;              Month Day   Year  Vnum
EE_VERSION	DE D'11',D'20',D'15',1,0,0
EE_SETTING	DE "chargePIC_led: TEST ONE BLINK LED ON RA2 PORT"
;----------------------------------------------------------------------
; END USER APPLICATION SEGMENT
;----------------------------------------------------------------------

Download

Télécharger le programme source, le fichier .hex et tous les schémas.

5. L’application chargePIC

Comme indiqué dans le cahier des charges, c’est à chargePIC que revient le plus gros du travail.

Un mot sur la régionalisation. Visual studio offre une excellente prise en charge de la régionalisation. Le logiciel a été écrit pour être traduit. Il est fourni en 2 langues, français et anglais qu’il est possible de choisir dans l’onglet Setting, mais il est prévu pour supporter d’autres langues. Tous les textes sont mémorisés en anglais dans le fichier par défaut LocalStrings.resx  et traduit en français dans LocalStrings.fr-FR.resx. Comme d’habitude tous les sources seront disponibles en téléchargement. Pour les utilisateurs d’une autre langue, il suffit de créer son fichier LocalStrings.de-DE.resx  (Allemand par exemple) et de traduire les textes des boutons, labels, onglets, etc, de la fenêtre.  Il faut aussi modifier le constructeur de la classe HomeForm en y indiquant sa culture.

// Default language
if (settings.LanguageFrench)
Thread.CurrentThread.CurrentUICulture = FrenchCulture;
else
Thread.CurrentThread.CurrentUICulture = EnglishCulture;

Figure 2 - Fenêtre principale

Figure 2 – Fenêtre principale

5.1. Fenêtre principale MainForm

A l’ouverture, la première fenêtre, figure 2, affiche les éléments suivants:

- Le menu,
- La barre d’outils,
- Les propriétés du PIC en cours de programmation en hexadécimal et décimal,
- Les propriétés du Bootloader en hexadécimal et décimal,
- L’onglet Fichier Hex,
- Le journal (fichier log).

Le port par défaut est COM1, chez moi je n’ai que celui-là. Si vous en avez d’autres à vous de choisir dans la liste. Vérifier sur le journal que le port est bien ouvert.
Cliquer sur le bouton Login. Ceci a pour effet de charger les propriétés du Bootloader et de créer l’image mémoire.
Vérifier sur le journal que l’opération s’est bien passée.
Pour importer le fichier hex cliquer sur le bouton Importer fichier hex. L’onglet Fichier Hex  se divise en 3 parties:

  • à gauche la liste brute des articles du fichier hex,
  • au centre la liste des instructions après analyse du fichier hex,
  • à droite les valeurs de config1 et config2 et la plus haute adresse utilisée par le programme.

En cas de débordement sur le Bootloader un message erreur est écrit sur le Log.

Figure 3 - Mémoire programme

Figure 3 – Mémoire programme

5.2. Mémoire image

A ce stade du travail, les onglets Mémoire programme et EEPROM montrent l’état de la mémoire qui sera chargée dans le PIC. En rouge, l’espace protégé du Bootloader qui ne sera pas changé, en bleu, l’espace réservé à l’application utilisateur qui pourra être réécrit. La figure 3 ci-contre, montre en rouge,  le segment que j’ai appelé offset qui contient le vecteur de reset et de logout du Bootloader ainsi que les adresses qui redéfinissent le vecteur d’interruption et le vecteur de reset de l’application utilisateur. La figure 4 ci -dessous, montre la partie haute de la mémoire contenant le Bootloader proprement dit. La figure 5, montre l’EEPROM qui est exclusivement utilisée par l’application utilisateur. Cet espace étant en général utilisé pour conserver des paramètres de fonctionnements ou des résultats, cette fenêtre nous offrira un moyen de tracer nos programmes puisque chargePIC nous permet de le relire.

Figure 4 - Mémoire programme haute

Figure 4 – Mémoire programme haute

Figure 5 - EEPROM

Figure 5 – EEPROM

Download  Télécharger tous les programmes sources, hex, exe, et fichiers: Bootloader chargePIC16F88: avec petit programme démo. chargePIC16F88_led + chargePIC VISUAL C# 2010 projet complet avec sources et exe+Schémas Inkscape.

6. Utilisation de HI-TECH C Compiler

La version  picc_9_83 est disponible gratuitement sur le site de MICROCHIP  (choisir l’onglet Downloads Archive). L’installation est simple et rapide. Cocher la case version Lite pour une utilisation non professionnelle gratuite. Lorsque vous créez un projet qui utilise HI-TECH C et le Bootloader chargePIC16F88, il faut indiquer la taille de l’offset. Pour ce faire, quand le projet est créé, cliquer dans le menu sur Project>Build Options>Project. Choisir l’onglet Linker. Dans Linker options Codeoffset entrer 0×20 qui est la taille du premier bloc du Bootloader, voir Figure 6 ci-dessous. Cliquer sur OK pour terminer. Ci-dessous, le même programme écrit  et compilé avec HI-TECH C. Un petit coup d’oeil sur la map, figure 7 ci-dessous, pour voir que le vecteur de Reset et d’interruption ont été décalés de 0×20.

/*******************************************************************************
; File Name        : led16F88_test1.c
; Version          : 1.0
; Title:           : BLINK LED TEST and USART Bootloader
; Author           : F8EOZ Bernard DECAESTECKER http://f8eoz.com
; MCU              : Written and Tested on Microchip PIC 16F88 Microcontroller
; Compiler         : HI_TECH ANSI C Compiler V9.83
; IDE              : Microchip MPLAB IDE v8.92
; Programmer       : Home made
; Last Updated     : 17 December 2015
; *******************************************************************
; Hardware:
;  Tested with PIC16F88 at 4Mhz  internal oscillator.
;  USART use pin 8 as RX (RB2)
;  USART use pin 11 as TX (RB5)
; *******************************************************************
*/

#include    <pic.h>
#include    <htc.h>

//    __CONFIG    _CONFIG1, _INTRC_IO  & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO
//    __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

#if defined(_16F88) || defined(_16F87)
    //1st: CONFIG1
    __CONFIG (FOSC_INTOSCCLK & CP_OFF & CCPMX_RB0 & DEBUG_OFF & WRT_OFF & CPD_OFF & LVP_OFF & BOREN_ON & MCLRE_ON & PWRTE_ON & WDTE_OFF & FOSC_INTOSCIO & IESO_OFF & FCMEN_OFF);
    //next: CONFIG2
    __CONFIG (IESO_OFF & FCMEN_OFF);
#else
    #error Must be compiled for 16F88, or 16F87
#endif

#ifndef _XTAL_FREQ
    // Unless already defined assume 4MHz system frequency
    // This definition is required to calibrate __delay_us() and __delay_ms()
    #define _XTAL_FREQ 4000000
#endif
#define LED        RA2    //bit 2 of PORTA
#define TRISLED    TRISA2 //bit 2 of PORTA

void interrupt tc_int(void)
{
    return;
}

void main()
{
    TRISLED = 0; //Output
    PORTA = 0b00000000;    // clrf    PORTA
    PORTB = 0b00000000;    // clrf    PORTB

    OPTION_REG = 0b00001000;
    //              0-------  NOT RBPU: 0 = PORTB pull-ups are enabled by individual port latch values
    //              -0------  INTEDG: 0 = Interrupt on rising edge of RB0/INT pin
    //              --0-----  T0CS: 1 = Transition on GP2/T0CKI pin0=output,
    //               ---0----  T0SE: 1 = Increment on high-to-low transition on /T0CKI pin not used, MCLR and reset
    //                ----1---  PSA: 1 = Prescaler is assigned to the WDT
    //              -----000  PS2:PS0: 111= 1:128 prescaler

    LED = 0;
    while(1)
    {
        LED = 1;  // LED ON
        __delay_ms(100);// delay for 100 milliseconds
        CLRWDT();
        LED = 0;  // LED OFF
        __delay_ms(100);// delay for 100 milliseconds
    }
}

Figure 6 - HI-TECH C Paramètre Offset

Figure 6 – HI-TECH C Paramètre Offset

Figure 7 - HI-TECH C map

Figure 7 – HI-TECH C map

Download  Télécharger tous les programmes sources, hex, exe, et fichiers: Bootloader chargePIC16F88: avec petit programme démo. chargePIC16F88_led + led16F88_test1.c HI-TECH C + chargePIC VISUAL C# 2010 projet complet avec sources et exe + Schémas Inkscape.
A suivre…

Index des articles de la catégorie microcontroleur

]]>
http://www.f8eoz.com/?feed=rss2&p=3904 0
PIC Microchip – Manipulateur électronique 16F628 CW Keyer et son interface de liaison série http://www.f8eoz.com/?p=3792 http://www.f8eoz.com/?p=3792#comments Mon, 21 Sep 2015 09:38:20 +0000 admin http://www.f8eoz.com/?p=3792 keyer16F628_1447Cet article est une application de l’UART, une des techniques de communication disponibles sur les PIC. USART, aussi appelé SCI, Interface de Communication Série est un dispositif qui peut être configuré en mode asynchrone full duplex ou en mode synchrone half duplex, maître ou esclave, pour communiquer avec des terminaux CRT, des ordinateurs personnels ou d’autres périphériques. Il s’agit dans ce projet d’établir une liaison entre mon ordinateur personnel et une machine construite autour d’un PIC disposant de l’USART.

1. Description du projet

1.1. Postulat de départ

Le manipulateur électronique décrit dans l’article précédent servira de base au projet. Je prévois de porter le programme du 12F675 avec un minimum de modifications vers un processeur disposant de l’USART et d’un peu plus de mémoire pour pouvoir y télécharger des messages à partir de mon ordinateur personnel. Mon choix s’est porté sur le 16F628 que j’avais en stock. En plus de l’USART, il dispose de 2K de mémoire FLASH, d’une EEPROM de 128 mots, de 1 ADC (pas directement voir ci-dessous). Je pourrais donc réutiliser le petit clavier de 9 touches. Il me faut réaliser une application hôte sur le PC qui commandera le PIC, et une interface, sur le PIC client. L’interface logicielle côté PIC devra être conçue comme un module indépendant réutilisable, utilisant un protocole de communication simple et un minimum de ressources.

1.2. Composants

1.2.1. Liaison série: asynchrone, convertisseur RS232 TTL MAX3232.

1.2.2. usartELoader: interface de chargement de l’EEPROM.
L’interface résidente sur le PIC est conçue comme un Bootloader. Le 16F628 ne disposant pas des possibilités d’écriture de son propre programme (self-programming), l’interface se limitera à l’écriture en EEPROM et à sa lecture pour en afficher le contenu.

Environnement de développement : MPLAB IDE v8.92.

Langage de programmation : assembleur MPASMWIN v5.51 pour obtenir un code compact. Moins de 170 mots mémoire, les quelques variables utilisées (moins de 10) sont temporaires et peuvent êtres redéfinies par l’application utilisateur.

Implantation : l’interface est logée en fin de mémoire.

Lignes de communication Emission/Réception : bornes TX et RX du PIC.

1.2.3. keyer16F628: manipulateur électronique.
Programme keyer12F675 porté sur le 16F628. Voir description dans l’article précedent.

1.2.4. keyerELoader: application hôte de gestion des messages préenregistrés du manipulateur électronique.

Environnement de développement et langage de programmation : IDE Microsoft Visual Studio C# 2010 Express.

Lignes de communication Emission/Réception : port série RS232.

2. Description fonctionnelle.

Le schéma figure 1 ci-dessous montre la distribution des composants de l’application.

Figure 1: keyer16F628 Schéma fonctionnel

Figure 1: keyer16F628 Schéma fonctionnel

3. Protocole de communication

L’interface usartELoader est munie d’un protocole de communication simple fonctionnant en half-duplex, l’émetteur attend toujours une réponse avant d’envoyer le message suivant.

Déclenchement: au reset, à la mise sous tension, usartELoader attend un code de LOGIN. Au bout d’un temps réglable (login timeout), en l’absence de réception de ce code, LOGOUT est exécuté et l’application utilisateur keyer16F628 est lancée. A réception du LOGIN le client renvoi le code et l’adresse d’implantation de usartELoader. L’application hôte keyerELoader est maintenant maître du PIC. UsartELoader se met en attente d’une commande de l’hôte.

Format de la trame de transmission:
une trame de transmission (ne pas confondre avec la trame  UART qui sera décrite plus loin) est composée de n bytes de 8 bits sous la forme qqbbbb,.. où qq= query code identifiant la trame et bb = byte de donnée ou d’adresse. Dans ce qui va suivre le sens de la transmission est vu du côté PIC: TX = émission du PIC vers l’hôte, RX = réception en provenance de l’hôte. La trame TX se termine par 0A (new line).

LOGIN:
Format RX: « L »
Description: au reset, à la mise sous tension, attente de ce code pendant le temps de connexion
Format TX: « L »aaaa0A
Description: LOGIN accepté , aaaa = 16 bits adresse d’implantation de usartELoader.

LOGOUT:
Format RX: « X »
Description: sortie de usartELoader et exécution de keyer16F628, généré au timeout ou envoyé par l’hôte.

WRITE EEPROM:
Format RX: « E »aaaaddddck
Description: demande d’écriture, aaaa = 16 bits adresse , dddd = 16 bits donnée, ck = 8 bits de poids faible de la somme de contrôle.

WRITE ACK:
Format TX: « K »0A
Description: accusé de réception de l’écriture.

DATA ERROR:
Format TX: « ! »0A
Description: erreur d’écriture.

CHEKSUM ERROR:
Format TX: « ? »0A
Description: erreur de la somme de contrôle.

BOUNDARY ERROR:
Format TX: « $ »0A
Description: erreur d’écriture hors limite.

PRINT EEPROM:
Format RX: « P »aaaa
Description: demande de la donnée située à l’adresse aaaa = 16 bits adresse.

PRINT EEPROM:
Format TX: « P »dddd0A
Description: donnée dddd à afficher.

4. Structure d’une trame UART

Notre trame UART est constituée des bits suivants :

  • un bit de start servant à la synchronisation du récepteur,
  • 8 bits de données,
  • pas de bit de parité,
  • un bit de stop.

5. Interface usartELoader

5.1. Description

Le module usartELoader, figure 2 ci-dessous, démarre à la mise sous tension, au reset du PIC. Une première boucle attend la réception de la trame de LOGIN. En cas de non réception dans le délai fixé (timeout) une trame de LOGOUT est générée. A réception, s’il s’agit d’une trame de LOGIN, usartELoader traite le LOGIN, enclenche sa boucle principale et se met sous contrôle du programme hôte keyerELoader. S’il s’agit d’une trame non identifiée, une trame de LOGOUT est générée.

Figure 2: usartELoader

Figure 2: usartELoader

5.2. Paramètres d’installation

L’interface usartELoader a besoin des paramètres suivants:

  • EEPROM_SIZE: taille de l’EEPROM,
  • FLASH_PROG_SIZE: taille la mémoire FLASH,

Dans le cas du 16F628 qui a 2K de mémoire FLASH et 128 mots d’EEPROM:

  • EEPROM_SIZE = 7F,
  • FLASH_PROG_SIZE = 7FF.
5.3. Paramètres du TIMER

Le délai de LOGIN est réglé par les paramètres suivants:

  • ELOADER_TIMER1_OVF: nombre de débordement de TIMER1,
  • ELOADER_TIMER1: Base de TIMER1,
  • ELOADER_T1CKPS  valeur du prédiviseur.

Avec un oscillateur XTAL = 4 MHz, le délai est fixé à 25 s environ avec les valeurs suivantes:

  • ELOADER_TIMER1_OVF = 200,
  • ELOADER_TIMER1 = 0,
  • ELOADER_T1CKPS  = 2.

Bien entendu, d’autres combinaisons sont possibles pour obtenir le même résultat. Le logiciel keyerELoader décrit plus loin, fournit les outils pour calculer différentes combinaisons de TIMER1, TIMER1_OVF, T1CKPS en fonction de la fréquence d’horloge et du délai souhaité. Ce délai pratique pour le test, s’ avère assez long à l’usage courant, il est intéressant de la réduire à moins de 10s environ.

5.4. Paramètres de l’UART

Ces paramètres servent à régler les 2 registres d’émission TXSTA et de réception RCSTA:

  • SPBRG_VALUE: Baud Rate (nombre de bits/s),
  • SPBRG_BRGH: Haute ou basse vitesse pour le calcul de SPBRG.

Avec un oscillateur XTAL = 4 MHz et une vitesse de 9600 Bauds les valeurs sont:

  • SPBRG_VALUE = 25,
  • SPBRG_BRGH = 1 Haute vitesse.

Le logiciel keyerELoader décrit plus loin, fournit les outils pour calculer différentes valeurs SPBRG et le taux d’erreur. Attention cependant à bien prendre en compte les ordres de grandeur du temps. Avec les valeurs choisies,
le temps d’émission d’une trame UART = (1s / 9600 bauds) * 10 bits = 1042 us, temps 1000 fois plus long que la durée du cycle de base d’une instruction
avec une horloge à 4MHz = 4/4 = 1 us.

6. Application keyerELoader

6.1. Description

L’application keyerELoader permet d’enregistrer les messages du manipulateur dans le PIC. Elle fournit en outre l’affichage de l’EEPROM et des outils pour aider à paramétrer usartELoader. Elle utilise pour la liaison série la classe SerialPort. Un bon exemple d’application de cette classe est donné sur le site Microsoft Most Valued Professionals par Noah Coad dans le SerialPortTerminal. Visual Studio offre la prise en charge de la localisation des applications Windows, ainsi une option de keyerELoader permet de choisir le français ou l’ anglais.

6.2. Fenêtre principale – Onglet Edition

La fenêtre principale, figure 3 ci-dessous, permet:

  • d’entrer les paramètres de transmission,
  • d’ouvrir le port,
  • de se connecter au PIC (LOGIN) ou de se déconnecter (LOGOUT),
  • de saisir l’indicatif, les messages et leur propriété,
  • d’envoyer les messages au PIC,
  • de visualiser l’EEPROM,
  • de suivre les opérations sur le journal (LOG).
Figure 3: keyerELoader - Fenêtre principale

Figure 3: keyerELoader – Fenêtre principale

6.3. Fenêtre principale – Onglet Paramètres

La fenêtre, figure 4 ci-dessous, présente tous les paramètres de l’application. L’application est livrée avec les valeurs par défaut liées au 16F628. Ces valeurs peuvent être adaptées à un autre PIC. Pour prendre en compte les changements, enregistrer, quitter l’application et relancer.

Adresse EEPROM de départ:
Indiquer ici, en hexadécimal, l’adresse à partir de laquelle l’indicatif et les messages seront enregistrés. Important: usartELoader enregistre l’indicatif et les messages dans un buffer de l’EEPROM qui peut être placé librement dans l’EEPROM, adresse et dimension maximale définies par le programme utilisateur. A l’intérieur de ce buffer, l’indicatif et les messages sont de longueur variable. Les données de l’EEPROM extérieure à ce buffer ne sont pas modifiées. Ceci permet de garder des informations propres à l’application utilisateur.

Taille maximale du buffer EEPROM:
Indiquer ici, la longueur maximale du buffer des messages réservé dans l’EEPROM. Description du buffer:

  • indicatif n bytes = aaaa…aa00 où aa = caractère de l’indicatif, 00 = fin,
  • message n bytes = 02iiaaaa…aa0002 = en-tête,  ii = identifiant du message, aa = caractère du message, 00 = fin.

Longueur maximale du message:
Indiquer ici, la longueur maximale du texte du message qui pourra être saisi. Quelle que soit la longueur maximale indiquée, la longueur totale des messages+caractères d’entête et de fin+indicatif <= Taille maximum du buffer de l’EEPROM.

Identifiant du message:
L’identifiant n’est autre que le numéro du bouton qui commande l’émission du message. Se reporter à l’article précédent manipulateur électronique 12F675.

Intervalle de temps du timer:
Temps en ms de rafraichissement de la liste des ports disponibles. Ne pas modifier sauf si dysfonctionnement.

Figure 4: keyerELoader - Paramètres

Figure 4: keyerELoader – Paramètres

6.4. Outils

Le chapitre outils du menu offre 2 calculateurs pour aider à paramétrer usartELoader: l’un pour la vitesse transmission, l’autre pour le délai d’attente  à la connexion (Login timeout).

6.4.1. Calculateur de SPBRG

La fenêtre, figure 5 ci-dessous, présente le calculateur. On se reportera utilement au document de MICROCHIP qui explique le calcul.

Paramètres:

  • fréquence de l’oscillateur en Hz: 4 MHz par défaut,
  • taux d’erreur accepté en %: 4 % maximum,
  • la case cochée sert à garder les derniers paramètres.

Le Tableau présente les combinaisons possibles sur 7 colonnes:

  • SPBRG (SPeed  Baud Rate Generator),
  • Débit calculé en basse vitesse en Baud,
  • Taux d’erreur,
  • Débit désiré en basse vitesse en Baud,
  • Débit calculé en haute vitesse en Baud,
  • Taux d’erreur,
  • Débit désiré en haute vitesse en Baud.
Figure 5: keyerELoader - Calculateur du SPBRG

Figure 5: keyerELoader – Calculateur du SPBRG

6.4.2. Calculateur de délai d’attente de connexion

La fenêtre, figure 6 ci-dessous, présente le calculateur.

Paramètres:

  • fréquence de l’oscillateur en Hz: 4 MHz par défaut,
  • délai en seconde: 100 s maximum,
  • la case cochée sert à garder les derniers paramètres.

Le Tableau présente les combinaisons possibles sur 4 colonnes:

  • Prédiviseur du TIMER1,
  • Base de comptage de TIMER1, le compteur est incrémenté à partir de cette valeur,
  • Nombre de débordements de TIMER1,
  • Délai en seconde.
Figure 6: keyerELoader - Calculateur du délai d'attente de connexion

Figure 6: keyerELoader – Calculateur du délai d’attente de connexion

 

7. Migration du code du PIC 12F675 vers le PIC 16F628

7.1. Description

Le code est installé dans la mémoire du 16F628 au-dessus du code de usartELoader comme le montre la figure 1. Un premier coup de compilateur déroule une longue liste d’erreurs. C’est impressionnant mais pas vraiment méchant. Voici dans l’ordre les adaptations réalisées:

  • assignation des PORTS,
  • reprogrammation de l’ADC,
  • gestion des interruptions.
7.2. Assignation des PORTS
Figure 7: assignation des ports

Figure 7: assignation des ports

Où l’on vérifie l’efficacité de nos définitions. La table figure 7, ci-contre, montre la projection du 12F675 vers le 16F628. Il faut noter que l’ ADC consomme 2 broches. Ont été ajoutés, les liaisons UART pour usartELoader. Cette partie du travail a été réalisé facilement  par l’utilisation des #define.

7.3. Reprogrammation de l’ADC

Le 16F628 ne dispose pas directement de l’ADC mais comme je disposais du 16F628, j’ai fait avec ce que j’avais. Dans sa note AN700 MICROCHIP décrit comment câbler et programmer le Delta Sigma ADC. J’ai repris trait pour trait son schéma, mot pour mot le code. Un bon exemple d’application de la note AN700 est donné sur le site de SPRUT à l’article « PIC-Lernbeispiel: ADC mit Komparator aufbauen ».

Figure 8: Extrait figure 1 note AN700 MICROCHIP

Figure 8: Extrait figure 1 note AN700 MICROCHIP

La figure 8, ci-contre, montre le diagramme du circuit qui, transposé sur le PIC nécessite 2 ports: AN et CMP et un intégrateur. C’est un peu plus lourd que le 12F675 et aussi 1000 fois plus lent. Pour obtenir un résultat sur 10 bits, avec le 12F675 nous sommes dans l’ordre de la us, ici nous sommes dans l’ordre de la ms. Mais pour un clavier manuel cela est acceptable.
Le code de la routine ADC du 12F6275 est chargé de fournir les registres ADRESH et ADRESL à la routine keystroke. Le travail a consisté à remplacer le code de la routine par celui de la note AN700, les registres ADRESL et ADRESH qui n’existent plus dans le 16F628 ont été simplement ajoutés dans la RAM pour conserver la compatibilité avec le programme. Les premiers essais ayant montré un fonctionnement aléatoire des touches j’ai ajouté un bout de code pour prélever une série d’échantillons et ne garder que le résultat le plus grand. Avec cette méthode, j’obtiens un fonctionnement plus sûr. Les résistances du clavier, figure 9 ci-dessous,  sont toujours dans le même rapport 3:1 mais leurs valeurs ont été adaptées. Après essais, j’ai opté pour  3K et 1K.

Figure 9: Clavier et intégrateur

Figure 9: Clavier et intégrateur

Méthode d’étalonnage

Comme pour le 12F675, de la précision de l’étalonnage du clavier dépendra le fonctionnement précis du clavier. Le clavier a été ré-étalonné. Cela est fait facilement en utilisant keyerELoader, l’EEPROM, à l’oreille par l’écoute du signal différent émis à la pression de chaque touche. Le programme enregistre en EEPROM les valeurs obtenues à chaque pression de touche (#define __ADRES_TRON). Commencer par attribuer dans la table ADC_Vth_TABLE à chaque touche un intervalle assez large. Lire ensuite le résultat dans l’EEPROM en utilisant KeyerELoader. Retoucher et réduire l’intervalle. Peaufiner jusqu’à obtenir un intervalle qui marche à tous les coups. Désactiver (#define    __ADRES_TRON). Voici les nouveaux paramètres:

; Fitted after real analyze

#define KPAD_00_MAX (1016+16)  ;key 0,0 (maximum maximorum)
#define KPAD_00_MIN (1016-4)   ;key 0,0
#define KPAD_10_MAX (757+5)    ;key 1,0
#define KPAD_10_MIN (757-5)    ;key 1,0
#define KPAD_20_MAX (605+5)    ;key 2,0
#define KPAD_20_MIN (605-5)    ;key 2,0
; Row 1
#define KPAD_01_MAX (502+6)    ;key 0,1
#define KPAD_01_MIN (502-6)    ;key 0,1
#define KPAD_11_MAX (438+5)    ;key 1,1
#define KPAD_11_MIN (438-5)    ;key 1,1
#define KPAD_21_MAX (385+5)    ;key 2,1
#define KPAD_21_MIN (385-5)    ;key 2,1
; Row 2
#define KPAD_02_MAX (345+5)    ;key 0,2
#define KPAD_02_MIN (345-5)    ;key 0,2
#define KPAD_12_MAX (308+7)    ;key 1,2
#define KPAD_12_MIN (308-8)    ;key 1,2
#define KPAD_22_MAX (287+5)    ;key 2,2
#define KPAD_22_MIN (287-5)    ;key 2,2

; NO KEY
#define KPAD_FF_MAX 256        ; no key
#define KPAD_FF_MIN 0          ; no key

On se reportera à l’article précédent du 12F6275. A ce stade le clavier ne sait pas encore quelle fonction activer. Une liste d’assignation lie la touche à sa fonction. Le clavier peut ainsi être personnalisé. En cas de changement d’assignation de touche de message il faut aussi modifier le paramètre Identifiant du Message dans keyerELoader (voir ci-dessus).

7.4. Schéma

La figure 10, ci-dessous, montre le circuit recâblé avec le 16F628. Le MAX3232 n’y est pas représenté. Voir au paragraphe 8, ci-dessous, la connexion.

Figure 10: Schéma CW Keyer 16F628 RS232

Figure 10: Schéma CW Keyer 16F628 RS232

Download  Télécharger tous les programmes sources, hex, exe, et fichiers: usartELoader: interface de liaison série EEPROM Loader avec petit programme démo. + keyer16F628+usartELoader: CW keyer avec liaison série + keyerELoader VISUAL C# 2010 projet complet avec sources et exe+Schémas Kicad+Schémas Inkscape.

Figure 11: module MAX3232 DB9

Figure 11: module MAX3232 DB9

8. Liaison RS232

L’interface PC est le convertisseur TTL/RS232 MAX3232. Comme le montre la photo qui introduit l’article, j’utilise un petit circuit pas plus grand qu’un timbre-poste acheté sur Ebay pour moins de 1 euro frais de port inclus. Ce circuit est livré complet, câblé, prêt à l’emploi, avec le MAX3232, une petite LED témoin, la prise DB9 et 4 fils de liaison à enficher d’une vingtaine de cm. Le circuit est sérigraphié. Relier RX à l’entrée RX du PIC, TX à TX du PIC, GND à la masse, VCC à VDD = 5V.

9. Tests – Réglages

Le circuit a été monté sur platine d’expérimentation comme le montre la figure 12 ci-dessous. Le clavier, est réduit à ses parties essentielles: ses résistances, et un fil muni d’une pointe de touche qui joue le rôle de bouton (voir figure 9). A noter la liaison simple au module MAX3232 qui est alimenté en 5V comme le PIC. Il est relié au PC par un câble direct, récupéré sur un vieux modem mais une connexion avec les 3 fils utiles (broches 2, 3, 5 de la DB9) peut être réalisée.

Figure 12: keyer16F628 sur platine d'expérimentation

Figure 12: keyer16F628 sur platine d’expérimentation

A suivre..

 

Index des articles de la catégorie microcontroleur

]]>
http://www.f8eoz.com/?feed=rss2&p=3792 1
PIC Microchip – Manipulateur électronique 12F675 CW Keyer http://www.f8eoz.com/?p=3613 http://www.f8eoz.com/?p=3613#comments Tue, 16 Jun 2015 14:41:57 +0000 admin http://www.f8eoz.com/?p=3613 PIC12F675Keyer_1352Depuis plusieurs semaines je parcours la documentation technique des petits processeurs 12F6xx de MICROCHIP. Petits, mais richement dotés à en juger par l’étendue de la documentation qui les accompagne. Poussé par le désir de ne pas en rester à la connaissance purement théorique du sujet et aussi par l’envie de « manger » un peu de code, j’ai cherché un projet qui pourrait me permettre de concrétiser mes acquis. Mon choix s’est porté rapidement sur un manipulateur électronique, petite machine utile à la station. Générer les DIT et les DAH c’est bien mais ce n’est pas tout, moyennant un peu de programmation, quelques fonctions fort utiles peuvent être implémentées. Il est agréable de pouvoir envoyer automatiquement les messages de base CQ CQ CQ DE F8EOZ…  et aussi CQ DX et un autre pour les CONTEST. Trois messages enregistrés d’une manière simple au choix de l’utilisateur devraient suffire. Pas besoin de dizaines de mémoires. Il est intéressant d’avoir une écoute locale que l’on peut activer/désactiver ce qui permet d’utiliser le manipulateur pour l’entraînement ou d’utiliser le sidetone de son TRX. Changer la vitesse facilement pour s’adapter à celle de son correspondant est nécessaire. Choisir le mode iambique A ou B pourquoi pas. Enfin une dernière possibilité utile pour régler son antenne, générer une tonalité continue ou à pulsations très rapides.  Toutes ces fonction accessibles rapidement et directement par boutons-poussoirs, pas de menus et sous-menus sélectionnés par paddle.

1. Description du projet

1.1. Logiciel

MPLAB IDE v8.92. J’utilise avec satisfaction cet environnement de développement MICROCHIP. A peu de frais, avec mon programmateur maison, il me permet de faire tous les tests de simulation et de débogage.

MPASMWIN v5.51. A priori, je pensais utiliser le langage C. D’une part, j’aurais quand même dû y broder un peu de code assembleur, d’autre part, la taille limitée de la mémoire 1 ou 2K, ont donné la préférence à l’assembleur. Le programme ne comprend pas de calculs compliqués et il n’y a qu’une bonne trentaine d’instructions assembleur à assimiler. Elles sont les mêmes que celles que j’ai utilisées pour le fréquencemètre.

1.2. Matériel

MCU. Les processeurs de la série 12F6 sont dotés de 6 ports mais pas des mêmes possibilités. Je tiens à garder le port GP3 en fonction MCLR (reset) ce qui me laisse 5 ports. Le postulat émis en introduction d’avoir accès aux fonctions directement par boutons-poussoirs m’oriente vers un petit clavier connecté à un port ADC. Je dispose du 12F675 et du 12F683. Je pense que 1K de mémoire devrait suffire à tenir le code du programme et les 128 bytes de l’EEPROM suffisent pour les messages. J’opte finalement pour le 12F675.

Clavier. Les touches de fonctions sont regroupées sur un petit clavier 3×3 réalisé ex nihilo. L’assignation des fonctions est libre et indépendante de la place physique des touches. Cela permet à chacun de choisir la disposition qui lui convient. (personnalisation). L’assignation est faite par des définitions qui font le lien entre le numéro de touche et la fonction.

Ecoute locale. Elle est réalisée par un petit buzzer connecté à un transistor servant de buffer.

Commande du TX. Elle est réalisé par un transistor.

La figure 1 ci-dessous montre le schéma du circuit.

Figure 1 - Schéma du circuit

Figure 1 – Schéma du circuit

2. Analyse fonctionnelle

2.1. Expression des besoins

En introduction, l’expression fonctionnelle du besoin a permis de définir les  fonctions que la machine devra réaliser. Je les rappelle:

  • Générer le code Morse en mode Iambique ou Droit,
  • Envoyer 3 messages au choix,
  • Incrémenter, décrémenter la vitesse,
  • Choisir le mode iambique A ou B,
  • Choisir l’utilisation de l’écoute locale, BUZZER ON/OFF,
  • Générer pour le réglage d’antenne un signal, TUNE Pulse ou Carrier.
2.2. Schéma fonctionnel

Le schéma figure 2 ci-dessous montre le diagramme fonctionnel du manipulateur.

Figure 2 - Diagramme fonctionnel du manipulateur électronique

Figure 2 – Diagramme fonctionnel du manipulateur électronique

Chacun des blocs mis en évidence fera l’objet d’une description des fonctions principales et des données qu’elles manipulent dans la suite de l’article.

2.2.1. Organes de sortie

Buzzer via un buffer.
Fonction : écoute locale sur option, message de service.

Commutateur Tx: commutateur à transistor.
Fonction : émission en code Morse via le Tx, des messages préenregistrés en clair, émission de la manipulation.

2.2.2. Organes d’entrée

Clef Morse: Iambique (choix du mode A ou B), Droite détectée au setup si le DAH est à la masse.
Fonction : manipulation du message, le DIT sert à avorter (abort) un message préenregistré en cours d’émission.

Clavier matriciel 3×3: organe de commande personnalisable, accessible pendant les temps morts c’est à dire quand la clef Morse reste inactive plus d’une seconde (paramètre).
Fonction: un bouton, une fonction, soit 9 fonctions.

Reset  bouton de reset.
Fonction : setup.

2.2.3. Flux de données

Message de service: c’est un message local court destiné à informer l’utilisateur que la commande a été comprise. Il s’agit en général d’un caractère émis en code Morse à la vitesse courante. Il est destiné uniquement au BUZZER même quand celui-ci est OFF. Il est stocké en RAM et personnalisable.

Message préenregistré: c’est un message destiné au TX et au BUZZER s’il est ON. Il est de longueur variable (0 à n caractères),  sa limite physique est celle de l’espace disponible dans l’EEPROM compte-tenu de la place prise par les autres messages. Il est muni de 2 propriétés: un identificateur symbolique qui correspond simplement au numéro du bouton qui le commande, un facteur de répétition personnalisable (0 à ∞). Il peut être interrompu par un DIT de la clef Morse. Il est rédigé en clair et transformé en code Morse par la machine. Il est diffusé à la vitesse courante de la machine.

Message manipulé: c’est le message généré par la clef Iambique ou Droite destiné au TX et au BUZZER s’il est ON. Avec la clef Iambique, quand les 2 paddles sont pincés, la répétition automatique des DIT et DAH est commandée en mode A ou en mode B.

2.2.4. Organes internes

Les organes internes de l’automate réalisent les fonctions techniques. Leur conception autonome facilite leur développement et leur mise au point. Ils peuvent ainsi être réutilisés.

KEY INTERFACE: traduit les appuis de la CLEF en DIT et DAH. Le type de clef Iambique ou Droite est déterminé automatiquement au Setup (DAH à la masse = clef  Droite). Le mode Iambique A ou B est sélectionnable par une touche du clavier fonctionnant en bascule. L’interface commande l’accès au clavier blocage/déblocage de manière asynchrone par l’interruption TIMER1.

MORSE PLAYER ou PLAYER: joue DIT,  DAH et espace entre les mots (GAP) à la demande de la CLEF ou de l’ENCODER. Autrement-dit, il commande les ports de sortie BUZZER et TX au niveau haut et bas à la vitesse courante.
Remarque: le signal PULSE n’est qu’une série de DIT qui se prolonge indéfiniment jusqu’à interruption, CARRIER est un signal continu qui se prolonge indéfiniment jusqu’à interruption.
L’ interrupteur BUZF autorise ou non la sortie BUZZER, l’interrupteur TXF autorise ou non la sortie TX.
Paramètre : unité de temps = durée d’un point à la vitesse courante.

MORSE TIMER: donne l’unité de temps en ms (le point) en fonction de la vitesse (nombre de mots/mn). L’unité de temps peut être incrémentée ou décrémentée par touches successives du clavier. La valeur par défaut est fixée à 12 mots/mn. La dernière valeur utilisée est conservée en EEPROM et reprise ensuite à chaque SETUP.

KEYPAD INTERFACE: gère le clavier matriciel 3×3. L’interface utilise l’ADC du MCU.
Paramètres: description du clavier (assignation des touches aux fonctions), table des seuils de tension analogique, numérique (intervalle numérique réservé à chaque touche).

ENCODER: traduit un caractère, lettre, chiffre, ponctuation, procédure, en code Morse à destination du PLAYER.
Trois entrées possibles : un message préenregistré de l’EEPROM, un message de service stocké en RAM, un message provenant du déroulement du programme.
Le message peut être interrompu par un appui et un relâchement de la clef DIT.
Paramètre: règles de traduction du caractère.

3. Méthode de développement

L’option MPLAB SIM du Debugger de MPLAB IDE permet de vérifier efficacement le bon fonctionnement du programme. Mais le test réel révèle toujours des défauts à corriger. La difficulté est de n’avoir aucun moyen de visualiser, ni de tracer le programme. Quoiqu’ en y réfléchissant, nous avons 2 moyens: nos oreilles et l’EEPROM. L’envoi vers le BUZZER de signaux Morse aux endroits à étudier permet de suivre le programme. L’enregistrement en EEPROM de données partielles permet aussi d’obtenir des indications. Il suffit de replacer le MCU sur le programmateur. PICPgm va relire le contenu de l’EEPROM et l’afficher. Ces traces seront naturellement provisoires (utilisation de define) et disparaissent dans la version Release. Cette observation conditionne la chronologie de développement. J’ai d’abord commencé par produire les sons, ensuite les messages et le reste a suivi.

4. Le clavier matriciel 3×3 touches

4.1. Conception

Je me suis fondé sur le document « Two-wire, four-by-four-key keyboard  interface saves power »   de « Stefano Salvatori, University of Rome, and Gabriele Di Nucci, EngSistemi, Rome, Italy » paru dans la rubrique designideas de EDN Network.

Figure 3 - Schéma du clavier matriciel 3x3

Figure 3 – Schéma du clavier matriciel 3×3

Le clavier figure 3, ci-dessus, est une matrice 3×3 dans la quelle il est possible de calculer la tension Vout lorsque l’un quelconque des boutons est pressé en appliquant l’équation:
V(x,y) = Vref . Rb/( xRa + yRb + Rb) (1).
L’équation (1) peut s’écrire sous forme d’un rapport de résistances:
V(x,y)/Vref = Rb/( xRa + yRb + Rb) (2).
Posons Rb=Ra/p, l’équation (2) peut s’écrire:
V(x,y)/Vref =  (Ra/p)/( xRa + y(Ra/p) + (Ra/p))
ou en multipliant par (p/Ra)/(p/Ra)
on obtient le rapport diviseur de tension quel que soit la touche pressée:
r(x,y) = V(x,y)/Vref = 1 / ( 1 + x.p + y)  (3)
dans laquelle p = Ra/Rb représente le rapport entre les résistances de lignes et de colonnes.
On observe facilement que le ratio Rb/Ra<3 donne des doublons et ne convient pas. En prenant une résolution ADC N=10 bits et en choisissant une tolérance T=0,01 pour les résistances Ra et Rb, il est possible de distinguer avec une bonne marge de sécurité 9 valeurs de tension.
J’ai choisi Ra=11K 1% et Rb=33K 1% simplement parce que je les avais en stock. D’autres combinaisons de rapport 1/3 sont possibles : Ra=1,3K et Rb=3,9K ou Ra=1,2K et Rb=3,6K par exemple. Ces dernières valeurs étant, par ailleurs, meilleures que celles que j’ai utilisées car je me suis rendu compte que la documentation MICROCHIP conseille de ne pas dépasser 10K en entrée de l’ADC. En effet, la résistance intervient dans le temps d’acquisition.
Il est maintenant très facile de calculer les valeurs numériques de chaque bouton dans l’intervalle [0, 1023]
AD RESULT = 1023. r(x,y) (4).
On constate un resserrement des valeurs les plus basses mais encore très acceptable. Enfin, cette expression montre que le résultat dépend essentiellement de la qualité des résistances. Dans la réalité, j’ai fixé une petite fenêtre d’examen autour de cette valeur qui laisse une marge d’erreur.
Ces valeurs sont reportées sur la figure ci-dessus.  Notre schéma maintenant complet, le clavier peut être programmé et fabriqué.

4.2. Mise en oeuvre de l’ADC

Le clavier est connecté à l’entrée AN0. Cette entrée est lue cycliquement. Le résultat est placé dans un registre ADRES de 10 bits donnant une valeur numérique de 0 à 1023 qui correspond au niveau de tension de la touche pressée. Le clavier n’est qu’un diviseur de la tension Vdd, tension de référence.
Sa mise en oeuvre passe par l’initialisation de quelques registres. Les chapitres 6 et 7 de la documentation technique du 12F675 décrivent le Comparateur et l’ADC.

Le registre ADCON0:
Tout est dit dans le diagramme 7-1 figure 4, ci-dessous, extrait de la documentation.

Figure 4 - A/D BLOCK DIAGRAM (MICROCHIP)

Figure 4 – A/D BLOCK DIAGRAM (MICROCHIP)

Le registre ADCON0 met ce circuit en état de fonctionnement. Voici sa définition et son initialisation dans le programme:

;----------------------------------------------------------------------
; ADC Config
#define ADC_CON b'10000001'
#define ADC_AN0 b'00000000'
#define ADC_AN1 b'00000100'
#define ADC_AN2 b'00001000'
#define ADC_AN3 b'00001100'
;         		  1-------  ADFM: 1=right justified result
;         		  -0------  VCFG: 0=Vdd is voltage reference
;         		  --xx----  not implemented
;         		  ----00--  00=select channel 00 (AN0=GP0)
;				      01 	= Channel 01 (AN1=GP1)
;				      10	= Channel 02 (AN2=GP2)
;					  11 	= Channel 03 (AN3=GP4)
;         		  ------0-  GO/NOT DONE Status bit: 0=A/D conversion not started
;         		  -------1  ADON: Conversion Status bit 1=A/D converter module is operating

#define ADC_AN_KPAD ADC_AN0 ; assign Keypad to Channel 00

	; set up A/D converter
	banksel ADCON0
    movlw   ADC_CON | ADC_AN_KPAD
    movwf   ADCON0

Le registre ANSEL:
Sa fonction est de désigner les ports qui sont affectés au convertisseur et de fixer la fréquence de conversion du cycle A/D.  Choisir la fréquence ad hoc, ni trop, ni trop peu. TAD = A/D clock period. Le minimum TAD requis est de 1.6us, paragraphe 7-1-4 de la documentation technique,  à 4MHz avec Fosc=8 le minimum TAD = 4MHz/8 = 2us. Les valeurs Fosc inférieures ne conviennent pas puisque TAD<1,6us. La table 7-1 , ci-dessous, extraite de la documentation, résume cela.

Figure 5 - TAD vs. DEVICE OPERATING MIFREQUENCIES (MICROCHIP)

Figure 5 – TAD vs. DEVICE OPERATING FREQUENCIES (MICROCHIP)

Note importante: placer un port en entrée analogique enlève automatiquement les résistances internes de pull-ups. Il faut donc utiliser des résistances externes.

En résumé, voici son initialisation dans le programme:


	; set up A/D converter
    banksel ANSEL
    movlw   b'00010001'
    ;         x-------  not implemented
    ;         -001----  ADCS A/D Conversion Clock: 001=Focs/8 Conversion Clock
    ;         -101----  ADCS A/D Conversion Clock: 001=Focs/16 Conversion Clock
    ;         ----0---  ANS3:ANS0: Analog Select bits 0=digital I/O, GP4, Tx output
    ;         -----0--  ANS3:ANS0: Analog Select bits 0=digital I/O, GP2, DIT paddle input
    ;         ------0-  ANS3:ANS0: Analog Select bits 0=digital I/O, GP1, DAH paddle input
    ;         -------1  ANS3:ANS0: Analog Select bits 1=analog  I/O, GP0, analog input
    movwf   ANSEL

Echantillonage – Calcul du temps d’acquisition minimum:
Un cycle d’échantillonnage comprend 2 phases:

  • le temps d’acquisition ou TACQ qui commence après que le canal a été choisi ou qu’un cycle s’achève et que le condensateur interne commence sa charge,
  • le temps de conversion qui commence à fin du TACQ et quand le GO bit=1, qui s’achève après 11 TAD.
Figure 6: ACQUISITION TIME  (MICROCHIP)

Figure 6: ACQUISITION TIME (MICROCHIP)

La résistance d’entrée intervient dans le calcul du temps de charge TC du condensateur interne et par conséquent du TACQ minimum. Avec une résistance de 10K en entrée le TACQ = 19.2us. Comme j’ai utilisé une résistance un peu plus élevée de 33K je calcule
TC = 120 pF(1K+7K+33K)ln0.0004885 = 37.5us
ce qui donne pour TACQ = 40us environ. En y ajoutant 11 * 2us nous obtenons environ 62us. Ce temps est largement inférieur à mon temps de réaction et d’appui sur les touches du clavier… L’équation encadrée, ci-dessus, extraite de la documentation, résume cela.

Le registre CMCON:
Puisque le module comparateur n’est pas utilisé, on choisit l’option « Comparator off ». Voici son initialisation dans le programme:


	; set up comparator
    banksel CMCON
    movlw   b'00000111'
    ;         x-------  not implemented
    ;         -0------  COUT: Comparator Output bit: 0 = VIN+ < VIN- When CINV = 0
    ;         --x-----  not implemented
    ;         ---0----  CINV: Comparator Output Inversion bit 0=non-inverted output
    ;         ----0---  CIS: Comparator Input Switch bit When CM2:CM0 = 110 or 101
    ;         -----111  CM2:CM0: Comparator Mode bits 111=comparator off
    movwf   CMCON

4.3. Programmation

Description du clavier:
La programmation du clavier figure 7, ci-dessous, est réalisée en se fixant 2 objectifs: rendre le module KEYPAD INTERFACE réutilisable pour un autre projet, rendre le clavier personnalisable.

Figure 7 - Agencement du clavier

Figure 7 – Agencement du clavier

Les touches sont numérotées de 0 à 8 en fonction de leur position x,y, les fonctions liées à ces touches sont assignées ensuite. Pour personnaliser le clavier il suffit de changer l’assignation. J’ai choisi de placer les touches d’envoi des messages sur la première colonne, il serait possible de les assigner à une autre colonne ou une ligne, par exemple. La programmation n’en serait nullement affectée. Voici sa description dans le programme:

; Definition
KPAD_00	EQU 0
KPAD_10	EQU 1
KPAD_20	EQU 2
KPAD_01	EQU 3
KPAD_11	EQU 4
KPAD_21	EQU 5
KPAD_02	EQU 6
KPAD_12	EQU 7
KPAD_22	EQU 8
KPAD_FF	EQU 0xFF ; no key
; Assign key 3x3 push button
; This allows one to change keypad layout without change algorithm
; My Layout:
;    (y2)
;    (y1)
;    (y0)
;  (x2)	   (x1)	   (x0)
KPAD_SEND0		EQU KPAD_22
KPAD_SEND1		EQU KPAD_21
KPAD_SEND2	 	EQU KPAD_20
KPAD_SPEED_UP	EQU KPAD_12
KPAD_SLOW_DOWN 	EQU KPAD_11
KPAD_BUZ	 	EQU KPAD_10
KPAD_TUNEC		EQU KPAD_02
KPAD_TUNEP		EQU KPAD_01
KPAD_MOD		EQU KPAD_00

Définition des seuils de tension:
A chaque touche correspond un niveau de tension et un seul. Mais comme rien n’est parfait, il faut attribuer à chaque touche une fenêtre de visée. J’ai défini 9 intervalles [min, max[ disjoints (pas de chevauchement). Pour faciliter la mise au point, les limites min et max sont des paramètres. Voici la description dans le programme:

; Fitted after real analyze

#define VTOLPLUS 10 ; tolerance
#define VTOLMINUS 1 ; tolerance
; Row 0 (3069=1023*3)
#define KPAD_00_MAX (1023+VTOLPLUS)		    ;key 0,0 (maximum maximorum)
#define KPAD_00_MIN (1023-VTOLMINUS)		;key 0,0
#define KPAD_10_MAX ((3069/4)+VTOLPLUS)		;key 1,0
#define KPAD_10_MIN ((3069/4)-VTOLMINUS)	;key 1,0
#define KPAD_20_MAX ((3069/5)+VTOLPLUS)		;key 2,0
#define KPAD_20_MIN ((3069/5)-VTOLMINUS)	;key 2,0
; Row 1
#define KPAD_01_MAX ((1023/2)+VTOLPLUS)		;key 0,1
#define KPAD_01_MIN ((1023/2)-VTOLMINUS)	;key 0,1
#define KPAD_11_MAX ((3069/7)+VTOLPLUS)		;key 1,1
#define KPAD_11_MIN ((3069/7)-VTOLMINUS)	;key 1,1
#define KPAD_21_MAX ((3069/8)+VTOLPLUS)		;key 2,1
#define KPAD_21_MIN ((3069/8)-VTOLMINUS)	;key 2,1
; Row 2
#define KPAD_02_MAX ((1023/3)+VTOLPLUS)		;key 0,2
#define KPAD_02_MIN ((1023/3)-VTOLMINUS)	;key 0,2
#define KPAD_12_MAX ((3069/10)+VTOLPLUS)	;key 1,2
#define KPAD_12_MIN ((3069/10)-VTOLMINUS)	;key 1,2
#define KPAD_22_MAX ((3069/11)+VTOLPLUS)	;key 2,2
#define KPAD_22_MIN ((3069/11)-VTOLMINUS)	;key 2,2
; NO KEY
#define KPAD_FF_MAX VTOLPLUS				; no key
#define KPAD_FF_MIN 0						; no key

Remarque: les calculs dans les définitions peuvent réserver des surprises, c'est pourquoi j'ai simplifié la formule en multipliant 1023 par le facteur 3.

Une façon simple de gérer une liste de données, moyennant quelques précautions dans l'implantation mémoire, est d'implémenter une "Lookup Table". Voici sa description dans le programme:

ADC_Vth_TABLE
	movlw 	HIGH(ADC_Vth_KEYPAD); PCLATH = HIGH bit address
	movwf 	PCLATH 				;
	movf	ADCVthPointer,W		; for PCL
	addwf	PCL ,F ; Jump to character pointed to in W register
ADC_Vth_KEYPAD ; maximum voltage threshold for keypad: analog to digital convert

	; real digit value saved into EEPROM for analyze (use __ADRES_TRON to get result)
	; 	(2)   (1)   (0)
	; 8---- 7---- 6---- (2)
	; 01 18 01 34 01 58
	; 5---- 4---- 3---- (1)
	; 01 82 01 B8 02 01
	; 2---- 1---- 0---- (0)
	; 02 69 03 01 03 FF

	; -------xy: digit maximum voltage threshold 	: digit minimum voltage threshold
	DT	KPAD_FF,(HIGH KPAD_FF_MAX),LOW (KPAD_FF_MAX),(HIGH KPAD_FF_MIN),LOW (KPAD_FF_MIN)
	DT	KPAD_22,(HIGH KPAD_22_MAX),LOW (KPAD_22_MAX),(HIGH KPAD_22_MIN),LOW (KPAD_22_MIN)
	DT	KPAD_12,(HIGH KPAD_12_MAX),LOW (KPAD_12_MAX),(HIGH KPAD_12_MIN),LOW (KPAD_12_MIN)
	DT	KPAD_02,(HIGH KPAD_02_MAX),LOW (KPAD_02_MAX),(HIGH KPAD_02_MIN),LOW (KPAD_02_MIN)
	DT	KPAD_21,(HIGH KPAD_21_MAX),LOW (KPAD_21_MAX),(HIGH KPAD_21_MIN),LOW (KPAD_21_MIN)
	DT	KPAD_11,(HIGH KPAD_11_MAX),LOW (KPAD_11_MAX),(HIGH KPAD_11_MIN),LOW (KPAD_11_MIN)
	DT	KPAD_01,(HIGH KPAD_01_MAX),LOW (KPAD_01_MAX),(HIGH KPAD_01_MIN),LOW (KPAD_01_MIN)
	DT	KPAD_20,(HIGH KPAD_20_MAX),LOW (KPAD_20_MAX),(HIGH KPAD_20_MIN),LOW (KPAD_20_MIN)
	DT	KPAD_10,(HIGH KPAD_10_MAX),LOW (KPAD_10_MAX),(HIGH KPAD_10_MIN),LOW (KPAD_10_MIN)
	DT	KPAD_00,(HIGH KPAD_00_MAX),LOW (KPAD_00_MAX),(HIGH KPAD_00_MIN),LOW (KPAD_00_MIN) 	; 5V
	; don't remove line below
	retlw 0xFF	; high value = end of table
	IF ((HIGH ($)) != (HIGH (ADC_Vth_KEYPAD)))
    	ERROR "ADC_Vth_KEYPAD CROSSES PAGE BOUNDARY!"
	ENDIF;

Algorithme Keystroke:
Keystroke, figure 8 ci-dessous, est l'algorithme principal de l'interface KEYPAD. Il lance le cycle ADC, récupère son résultat, sélectionne la touche frappée et lance la fonction liée à la touche.

Figure 8 - Algorithme Keystroke

Figure 8 – Algorithme Keystroke

Le code présenté ci-dessous est volontairement abrégé. Il ne montre pas le détail des fonctions liées à chaque touche ni la routine de comparaison CMP_A_B. On se reportera au programme source disponible en téléchargement.

;-------------------------------------
; KPAD_Keystroke process
; Scan ADC KPAD channel until find key
; Execute command associated with key
KPAD_Keystroke

KPAD_GetADRES
	movlw	ADC_CON | ADC_AN_KPAD	; select channel Keypad
	call	KPAD_GetADCvalue
	BANK1					; store ADC result into compare register A
    movf	ADRESL,W       	; 8 bits low
	BANK0
	movwf	CmpAL
	movf	ADRESH,W        ; 2 bits High
	movwf	CmpAH

	; point to first ADC table item
	movlw	ADC_Vth_KEYPAD - ADC_Vth_TABLE - 1 -3 -3 	; W = value relative address - 3
	movwf	ADCVthPointer		; Hold pevious line address

KPAD_Lookup	; read one table item
	incf	ADCVthPointer		; skip min value of previous table item
	incf	ADCVthPointer
	incf	ADCVthPointer		; point to current table item
	call	ADC_Vth_TABLE		; lookup voltage scale to find key pressed
	movwf   KeyPadXYtemp       	; hold KeyPadXY byte

	incf	ADCVthPointer,f		; Point to next byte
	call	ADC_Vth_TABLE
 	movwf   CmpBH       		; hold MAX value high byte into compare register B

	incf	ADCVthPointer,f		; Point to next byte
	call	ADC_Vth_TABLE
   	movwf   CmpBL	       		; hold MAX value low byte into compare register B

 	call	CMP_A_B				; compare ADC : MAX value
	btfss	UCON1,A_LT_B		; is ADC value < MAX table value ? 	goto	KPAD_Lookup			; no: NEXT item------>

	; value is < MAX: then look for MIN value 	incf	ADCVthPointer,f		; Point to next byte 	call	ADC_Vth_TABLE  	movwf   CmpBH       		; hold MIN value high byte into compare register B 	incf	ADCVthPointer,f		; Point to next byte 	call	ADC_Vth_TABLE    	movwf   CmpBL	       		; hold MIN value low byte into compare register B  	call	CMP_A_B				; compare ADC : MIN value 	btfsc	UCON1,A_EQ_B		; is ADC value = MIN table value 	goto	KPAD_GetKey_Found	; yes: Key found------>
	btfss	UCON1,A_GT_B		; is ADC value > MIN table value
	goto	KPAD_GetADRES		; no: value out of voltage span, read again------>

KPAD_GetKey_Found
 	movf	KeyPadXY,W			; Hold previous key
	movwf	KeyPadXYPre
 	movf	KeyPadXYtemp,W		; Hold new key
	movwf	KeyPadXY

;-------------------------------
; only for analyze and benchmark
KPAD_Report
	ifdef __ADRES_TRON
 		; Report ADRES value into EEPROM for analyse
		addwf	KeyPadXY,W		; pointer = 2*KeyPadXY
		btfsc	STATUS,C		; carry set if key 0xFF
		goto	KPAD_Report_End	; >>>no report
		sublw	LOW(EE_ADRESL0); pointer to LSB
		BANK1
		movwf	EEADR			; into EEADR
		movf	ADRESL,W		; ADC value LSB into EEDATA
		movwf	EEDATA
		call	WriteEEPROM		; write one byte to EEPROM
		BANK1
		decf	EEADR,f			; pointer to MSB
		BANK0
		movf	ADRESH,W		; ADC value MSB into EEDATA
		BANK1
		movwf	EEDATA
		call	WriteEEPROM		; write one byte to EEPROM
		BANK0
	endif
KPAD_Report_End
;--------------

	; switch case KeyPadXY
	;
	; case: NO KEY
	movfw	KeyPadXY
	xorlw	KPAD_FF		; Check if no key
	btfsc	STATUS, Z		; Z=0: no next key
	goto	KPAD_Keystroke_End	; Z=1: yes, end key ====>
	;
	; case: KEY = PREVIOUS KEY
	movfw	KeyPadXY
	xorwf	KeyPadXYPre,W	; Check if equal
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_End	; end key ====>
	;
	; case: SEND0
	movfw	KeyPadXY
	xorlw	KPAD_SEND0	; Check if key Send0
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_Sendn	; yes, ====>
	;
	; case: SEND1
	movfw	KeyPadXY
	xorlw	KPAD_SEND1	; Check if key Send1
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_Sendn	; yes, ====>
	;
	; case: SEND2
	movfw	KeyPadXY
	xorlw	KPAD_SEND2	; Check if key Send2
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_Sendn	; yes, ====>
	;
	; case: BUZZER
	movfw	KeyPadXY
	xorlw	KPAD_BUZ		; Check if key Buz
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_Buz	; yes, ====>
	;
	; case: TUNEP
	movfw	KeyPadXY
	xorlw	KPAD_TUNEP	; Check if key Tune PULSE
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_TunP	; yes, ====>
	;
	; case: TUNEC
	movfw	KeyPadXY
	xorlw	KPAD_TUNEC	; Check if key Tune CARRIER
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_TunC	; yes, ====>
	;
	; case: MODEAB
	movfw	KeyPadXY
	xorlw	KPAD_MOD		; Check if key Mod
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_Mod	; yes, ====>
	;
	; case: SPEED UP
	movfw	KeyPadXY
	xorlw	KPAD_SPEED_UP	; Check if key Speed up
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_SpeedUp	; yes, ====>
	;
	; case: SLOW_DOWN
	movfw	KeyPadXY
	xorlw	KPAD_SLOW_DOWN; Check if key Slow down
	btfsc	STATUS, Z		; Z=0: no
	goto	KPAD_Keystroke_SlowDown	; yes, ====>
	;
KPAD_Keystroke_End ; End of keypad
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Send message #0,#1,#2 to Tx
;----------------------------
KPAD_Keystroke_Sendn
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Side Tone Buzzer ON/OFF
; Only for TX message
; Not for service message
;------------------------
KPAD_Keystroke_Buz
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Tune mode constant carrier
;---------------------------
KPAD_Keystroke_TunC
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Tune mode pulse 50% duty cycle dits
;------------------------------------
KPAD_Keystroke_TunP
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Toggle mode A or B
;-------------------
KPAD_Keystroke_Mod
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Speed up
;---------
KPAD_Keystroke_SpeedUp
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

; Slow down
;----------
KPAD_Keystroke_SlowDown
	...
	return	;>>>>>>>>>>>>>>>>END OF KEYPAD

;----------------------------------------------------------------------
; KPAD_GetADCvalue
; Convert analog voltage level to 10 bits number
; Input: WREG=AD config with channel number to read
; Output: 10 bit ADC value is read from the pin and returned justified right.
; Please refer data sheet Page 41 (Section 7.1.4) for the AD Conversion
; clock explanation.  The 10-BIT ADC in the PIC12F675 are request
; minimum Tad with 1.6uS, and the conversion time need 11 Tad, so the
; mininum conversion time is 1.6uS * 11Tad = 17.6uS.

KPAD_GetADCvalue
	movwf	ADCON0			; AD config channel ANx
KPAD_GetADCvalue_Go
	movlw	15 		; wait for Acquisition time
	call	Delay	; 15*5us=75us
	; A/D conversion cycle in progress
    bsf		ADCON0,GO_NOT_DONE	; Init GO_NOT_DONE
    btfsc	ADCON0,GO_NOT_DONE	;
    return

Réglages:
Pour m’assurer de la qualité de l’intervalle de mesure [min, max[ les résultats sont stockés provisoirement en EEPROM pour être visualisés a posteriori avec PICPgm. La section de code optionnelle encadrée par les étiquettes KPAD_Report et KPAD_Report_End disparaît en version Release. De même, le précieux espace réservé en EEPROM est récupéré en mettant en commentaire la définition     __ADRES_TRON . J'ai pu ainsi simplement vérifier que la théorie rejoignait la pratique.

Download  Télécharger le programme source, le fichier .hex et tous les schémas.

5. Encodeur morse – Gestion des messages

5.1. Messages préenregistrés

La quasi totalité de l'EEPROM est réservée à l'enregistrement des messages. Un indicatif et 3 messages peuvent être enregistrés. l'espace est distribué de manière dynamique. Chaque message de longueur variable s'insère dans la place restant disponible comme le montre l'extrait du programme ci-dessous.

;--------------
; MESSAGE BLOCK
;--------------
; Your call sign here
EE_CALLSIGN	; don't remove this label
;
	DE "F8EOZ" ; your call sign here CAPS LOCK ONLY
	DE _EOM ; end of call sign don't remove

;----------------------
; Prerecorded message#:
; A..Z CAPS LOCK ONLY
; @ alias for CALLSIGN
EE_MESSAGE ; don't remove this label
;
; message#0:
; CQ CQ CQ DE F8EOZ F8EOZ...
	DE _HOM,KPAD_SEND0,0x03 ; Head of message directive: message number (button assign), beacon time (0xFF=infinity)
	DE "CQ CQ CQ DE @ @ K "
	DE _EOM ; end of message#0
;
; message#1:
; CQ DX CQ DX CQ DX DE F8EOZ F8EOZ...
	DE _HOM,KPAD_SEND1,0x03 ; Head of message directive: message number (button assign), beacon time (0xFF=infinity)
	DE "CQ DX CQ DX CQ DX DE @ @ K "
	DE _EOM ; end of message#1
;
; message#2:
; CQ CQ F8EOZ F8EOZ TEST ...
	DE _HOM,KPAD_SEND2,0x03 ; Head of message directive: message number (button assign), beacon time (0xFF=infinity)
	DE "CQ CQ @ @ TEST "
	DE _EOM ; end of message#2
;----------------------------------------
;----------------------------------------
;----------------------------------------

L'indicatif: il est traité comme un texte pour être inséré dans les messages au moyen d'un alias. Il doit être placé après l'étiquette EE_CALLSIGN. La directive de fin de message _EOM le termine.

Les messages sont placés à la suite de l'indicatif après l'étiquette EE_MESSAGE.

Le message: se compose de 3 parties : l'entête, le texte du message, la fin.

L'entête:  comprend les données suivantes:

  • directive _HOM  (head of message),
  • le nom symbolique du bouton qui l'active,
  • le facteur de répétition (beacon time) [0, hFF] où FF = infini sachant qu’un message en cours peut toujours être interrompu par un DIT.

Le texte: c’est une chaîne de caractères ASCII et de codes procédure (prosign).
Caractère ASCII: [h20 (espace), h5A (Z)], portion de table comprenant les signes de ponctuation, les chiffres, les lettres majuscules. Les minuscules et tous les autres caractères ne sont pas utilisés.
Le caractère @ est utilisé comme alias de l’indicatif. L’encodeur le reconnaît et effectue son expansion.
Le caractère Espace est utilisé comme espace entre les mots (Word Gap).
Les codes de procédure sont situés dans l’intervalle [h80,hFF]. Les codes _AR,_BT,_SK peuvent être insérés simplement en fractionnant le texte. Exemple:

...	DE "TEXTE",_BT,"SUITE..."

La fin du message: directive _EOM (End of Message)

5.2. Messages de service

Le principe reste le même que les messages préenregistrés à la différence que les messages sont stockés dans une table de la RAM. Chaque message est placé derrière l’étiquette qui correspond à l’événement déclencheur.
Personnalisation : dans ma version, le message est constitué d’un seul caractère mais il pourrait être aussi un texte. Pour rendre muet le message il suffit de le remplacer par un espace. L’alias @ ne peut être utilisé. Voici la description de la table:

MSG_TABLE
	movlw 	HIGH(MSG_DATA) ; PCLATH = HIGH bit address
	movwf 	PCLATH 			;
	movf	TabPointer,W	; for PCL
	addwf	PCL ,F 			; Jump to character pointed to in W register
SERVICE_MESSAGE
;
; SERVICE MESSAGE
;
IAMBIC_MSG		; iambic key
	DT "I",_EOM
STRAIGHT_MSG	; straight key
	DT "S",_EOM
SPEED_UP_MSG	; signal for speed change up
	DT "U",_EOM
SLOW_DOWN_MSG	; signal for speed change down
	DT "D",_EOM
MOD_A_MSG		; signal for mode A change
	DT "A",_EOM
MOD_B_MSG		; signal for mode B change
	DT "B",_EOM
BUZ_MSG			; signal for sidetone buzzer on/off
	DT _AR,_EOM
ERROR_HM_NOT_FOUND	; signal for error header message not found
	DT _ERR,_EOM
;
	IF ((HIGH ($)) != (HIGH (SERVICE_MESSAGE)))
    	ERROR "MSG_TABLE CROSSES PAGE BOUNDARY!"
	ENDIF;

5.3. L’encodeur

Le diagramme figure 9 ci-dessous, montre le processus d’encodage.

Figure 9 - Diagramme du processus d'encodage

Figure 9 – Diagramme du processus d’encodage

Registres:

  • BitFrame: 8 bits comprenant le code Morse et une clé.
  • ControlTape: bande pilote de 8 bits qui commande de gauche à droite l’émission du code Morse (1= émission, 0=fin de code).
  • MorseCode: 8 bits de gauche à droite qui représente le code Morse (1 = DAH, 0=DIT).

ControlTape et MorseCode sont en correspondance biunivoque : ControlTape[b8]<->MorseCode[b8],…, ControlTape[b0]<->MorseCode[b0]

Entrée: un caractère ASCII ou un prosign.

Processus:

1) Transcodage:

  • Phase 1 : au moyen de la table RAM ENC_BIT_FRAME_TABLE, le caractère ASCII [h20,h5A] est transformé en BitFrame, le prosign passe ce premier filtre sans changement.
  • Phase 2 : Le prosign est transformé en Bit Frame. Les prosigns spéciaux passent ce second filtre sans changement.

2) Séparation:

Le BitFrame au moyen de sa clé, est divisé en 2 parties de 8 bits, MorseCode et ControlTape.

3) Encodage:

Enfin, l’encodage du signal morse est réalisé en faisant glisser vers la gauche la bande pilote (rotation gauche avec bit C) qui commande l’émission du signe Morse qui lui est relié.

Download  Télécharger le programme source, le fichier .hex et tous les schémas.

6. Le manipulateur électronique

La boucle principale du programme figure 10 ci-dessous, inclut l’interface de la clé Morse. Au démarrage ou au Reset, le Setup restaure  les dernières options de la machine à partir de l’EEPROM :

  • le registre UCON (User Control Register)
  • la vitesse de manipulation en mots/mn.

La détection du type de clé, Iambique ou Droite, est réalisée au Setup en examinant le port DAH. Voici la description du registre UCON.


;----- UCON Bits -----------------------------------------------------
IAMBIC_KEY 	EQU 0x00	; StraightKey=0 Iambic= 1
BUZE	 	EQU 0x01	; = 1 if side tone buzzer enable
TXF 		EQU 0x02	; Tx flag = 1 if message sending to Tx
MSGF		EQU 0x03	; msg flag = 1 if send message running
KPADF		EQU 0x04	; = 1 if keypad unlocked
MOD_B		EQU 0x05	; = 1 if keyer mode B, 0 mode A
BUZF		EQU 0x06	; buzzer flag = 1 if message sending to buzzer

;----- DEFAULT Options --------------------------------------------------
; Iambic Key + Buzzer on
#define UCON_DEFAULT (1<<IAMBIC_KEY) | (1<<BUZE) | (1<<BUZF)

L’accès au clavier est commandée de manière asynchrone par l’interruption TIMER1 (délai d’une seconde fixé par les paramètres TMR1_INIT  et TMR1_OVF_INIT) qui, elle même, est commandée par l’appui sur la clé du maniulateur.

Figure 10 - Boucle principale

Figure 10 – Boucle principale

Download  Télécharger le programme source, le fichier .hex et tous les schémas.

7. Réalisation

7.1. Clavier 3×3
Figure 11 - Clavier face avant

Figure 11 – Clavier face avant

Le circuit est réalisé  sur une plaque PCB FR4 pastillée étamée à trous métallisés double face de 5x7x0,16 cm. Le MCU et les composants qui l’entourent sont placés sur une seconde plaque identique, placée en dessous et qui s’enfiche à la première plaque. Il y a beaucoup de place. Les boutons poussoirs 6x6x9mm ont été achetés sur Ebay chez Electronics-Salon  qui propose des composants d’excellente qualité. L’utilisation d’une plaque double face est très pratique dans ce genre de circuit qui comprend surtout du fil! L’implantation des composants suit exactement le schéma théorique.

Vérification: avant de le connecter au MCU, s’assurer de son fonctionnement sous tension (problème de soudure). Pour ce faire, le relier seul à l’alimentation 5V, connecter le voltmètre à sa sortie, appuyer successivement sur chaque bouton et noter la tension.

Download  Télécharger le programme source, le fichier .hex et tous les schémas.

7.2. Carte principale
7.2.1. Prototype
Figure 12 - Prototype Carte principale

Figure 12 – Prototype Carte principale

Le prototype a été réalisé à l’aide du logiciel fritzing. C’est la première fois que je l’utilise. Sa prise en main est facile. Fritzing offre une protoboard dont les dimensions sont réglables. Je n’ai pas trouvé dans sa bibliothèque le 12F675. Qu’à cela ne tienne! l’éditeur de composants permet facilement de créer le sien à partir d’un modèle générique. Trois fichiers SVG sont nécessaires: breadbord.svg (platine d’essai), schematic.svg (schéma), pcb.svg (circuit imprimé). Si vous êtes curieux où si vous souhaitez peaufiner un peu, ces fichiers sont manipulables sous Inkscape. Attention cependant, au préalable, installer les polices de caractères OCR-A et Droid Sans qui sont utilisées par fritzing.

7.2.2. Carte câblée

Les 2 photos ci-dessous, montrent la carte principale cablée. Une diode de protection 1N4001 a été ajoutée en entrée du régulateur 5V. Le clavier s’embroche par dessus. L’ensemble est maintenu par des entretoises coupées dans de simples chevilles en plastique et 4 vis de 3mm provenant de la quincaillerie la plus proche.

Pour conclure, la mise en oeuvre du 12F675 est aisée mais n’oubliez pas: RTFM!

keyer12F675_1370

keyer12F675_1364

Download  Télécharger le programme source, le fichier .hex et tous les schémas et fichiers Inkscape et fritzing.

 

Références

Two-wire, four-by-four-key keyboard  interface saves power by Stefano Salvatori, University of Rome, and Gabriele Di Nucci, EngSistemi, Rome, Italy

Index des articles de la catégorie microcontroleur

]]>
http://www.f8eoz.com/?feed=rss2&p=3613 1
PIC Microchip – Adaptateur pour programmer la série des PIC 12F629/675/683 et 12F1822/1840 http://www.f8eoz.com/?p=3577 http://www.f8eoz.com/?p=3577#comments Mon, 06 Apr 2015 09:36:46 +0000 admin http://www.f8eoz.com/?p=3577
Figure 1 - Schéma de l'adaptateur 12F

Figure 1 – Schéma de l’adaptateur 12F

Le programmateur sur port parallèle a été réalisé initialement pour charger le firmware du fréquencemètre sur PIC 16F84. Le PIC s’insère dans le connecteur ZIF pour cette opération. Pour programmer la série des petits processeurs 12F il me faut maintenant un adaptateur ad hoc. C’est tout naturellement que l’adaptateur va s’insérer en lieu et place du 16F84. La figure 1 ci-contre montre le schéma de l’adaptateur. Les 5 connexions nécessaires à la programmation sont : Vdd (+5V), Vss (ground), Vpp (tension de programmation +13V), CLOCK, DATA. Pour s’assurer de la bonne connexion de l’adaptateur j’ai ajouté une petite LED et sa résistance de 1K sur Vdd.

1. Réalisation

Le circuit est réalisé  sur une plaque PCB FR4 pastillée étamée à trous métallisés double face de 4x6x0,16 cm. D’une face, figure 2 ci-dessous, sont soudées 2 barrettes sécables mâles droites de 4 pôles au pas de 2,54mm destinées à s’enficher sur le connecteurs ZIF sur les broches 4 à 7 et 12 à 15 du 16F84.

Figure 2 - Adaptateur face ZIF

Figure 2 – Adaptateur face ZIF

De l’autre face, figure 3 ci-dessous, sont soudées 2 barrettes de connexion sécables femelles rondes de 4 pôles au pas de 2.54mm destinées à recevoir le PIC 12F683 etc..

Figure 3 - Adaptateur face 12F...

Figure 3 – Adaptateur face 12F…

Comme vous pouvez le constater il reste beaucoup de place sur cette petite plaque qui pourra être utilisée pour s’adapter à une autre série de PIC. La dernière photo montre le programmateur en action muni de l’adaptateur.

Figure 4 - Programmateur + adaptateur 12F...

Figure 4 – Programmateur + adaptateur 12F…

2. Gestion de l’algorihme « Vpp before Vdd »

Pour programmer le 12F683, la tension Vpp doit être appliquée au moins  5us avant Vdd dans le cas de l’utilisation du mode INTOSC et du mode internal MCLR. Ce choix est fait en sélectionnant les bits du registre de configuration CONFIG. On se reportera utilement à la documentation de Microchip 41204G et particulièrement au chronogramme figure 3-1 du chapitre 3.

Mon programmateur a été conçu à l’origine pour le 16F84 du fréquencemètre et ne gère par cette séquence. Il est possible de programmer une première fois le 12F683. Il est ensuite impossible de le reprogrammer. Impossible me direz-vous ! Je ne connais pas ce mot (il me semble que quelqu’un à déjà dit cela avant moi…). En cherchant, j’ai trouvé une astuce pour reprogrammer le PIC sans changer de programmateur. Lorsque je mets sous tension mon programmateur portant le 12F683 qui a déjà été programmé dans le mode INTOSC et MCLRE_OFF, PICPgm regimbe et me dit qu’il ne connaît pas mon programmateur et du même coup ne peut identifier le PIC. Voilà comment je procède pour franchir l’obstacle. Tout en laissant connecté et sous tension mon programmateur, je fais croire à PICPgm que j’utilise un programmateur OLIMEX PIC-PG3 (28 pin – 40 pin) en le sélectionnant dans la liste des programmateurs disponibles. PICPgm se laisse faire et reconnaît le PIC. Je lance uniquement la séquence Erase. Bien entendu pas question d’aller plus loin, il refuse de charger le programme, mais cette étape est suffisante. Je sélectionne ensuite mon programmateur qui est bien reconnu ainsi que le PIC. Je peux exécuter le chargement du programme.

Bien entendu si on utilise l’option MCLR_ON, le 12F683 se reprogramme simplement comme d’habitude.

That’s all folks!

Download  Télécharger le fichier Inkscape du schéma.

Index des articles de la catégorie microcontroleur

]]>
http://www.f8eoz.com/?feed=rss2&p=3577 0
PIC Microchip – Installation de la nouvelle version WinPICPgm 1.8.3.0 http://www.f8eoz.com/?p=3560 http://www.f8eoz.com/?p=3560#comments Mon, 06 Apr 2015 08:07:48 +0000 admin http://www.f8eoz.com/?p=3560 PICPgm - Menu

PICPgm – Menu

On ne change pas une équipe qui gagne. Pour programmer les PIC je reste fidèle au duo programmateur sur port parallèle et WinPICPgm de Christian Stadler.  Jusqu’ici j’utilisais WinPICPgm sur un ordinateur fonctionnant sous W2K. Cet ordinateur portable que j’utilisais sans ménagement dans mon petit atelier depuis plus de 10 ans est au bout du rouleau. Il est temps de passer sur mon ordinateur principal plus récent. Une grande tour équipée de nombreux ports comme je l’aime, qui dispose encore d’un port parallèle fonctionnant sous W7 64 bits. Certes pas très esthétique mais efficace. J’en profite donc pour installer la dernière version de WinPICPgm. Comme son site web le présente à juste titre, il est « a free and simple PIC Development Programmer Software for Windows and Linux ». Son installation est simple est rapide. Son utilisation est toute aussi aisée. Voici la procédure :

  • télécharger la dernière version,
  • décompresser le fichier,
  • éxécuter winpicpgm_1.8.3.0.exe,
  • suivre la procédure d’installation.

1. Décrire le programmateur

Pour que le programmateur soit reconnu, s’il ne figure pas dans la liste de WinPICPgm, ajouter sa description dans le fichier pgmifcfg.xml confer l’article in situ.

2. Exécuter en tant qu’administrateur

A priori c’est terminé… Pas tout-à-fait peut-être? W7 peut vous demander d’élever vos droits. Si WinPICPgm demande que vous disposiez de droits d’administrateur alors que vous êtes déjà administrateur de l’ordinateur, cliquez avec le bouton droit sur l’icône du raccourci, puis cliquez sur Exécuter en tant qu’administrateur.
Si vous voulez éviter cela à chaque exécution du programme vous pouvez mémoriser ce droit, cliquez avec le bouton droit sur l’icône du raccourci, puis cliquez sur Propriétés, puis cliquez sur le bouton Avancé…, puis dans la fenêtre qui vient de s’ouvrir cocher la case Exécuter en tant qu’administrateur, puis  OK.

Bonne programmation!

PICPgm - Exécution avec droits d'administrateur

PICPgm – Exécution avec droits d’administrateur

Index des articles de la catégorie microcontroleur

]]>
http://www.f8eoz.com/?feed=rss2&p=3560 1