SINUS, COSINUS et ARCSINCERCLE_TRIGOUS en Assembleur PIC

1 Quelques rappels de trigonométrie
1.1 Introduction
1.2 Les relations trigonométriques
1.3 Les fonctions nécessaires
1.4 Méthode et Temps de calcul SINUS
2 SINUS et COSINUS
2.1 Le programme et la table
3 ARC SINUS
3.1 Le principe de base
3.2 La méthode pratique
3.3 ARC COSINUS
4 Conclusions

Si vous arrivez directement sur cette page par un moteur de recherche, vous pouvez avoir accès à la table des matières et à chaque article, en page d'accueil.    L'accès se fait par l'un des deux liens en tête de colonne de droite ----->


Avant propos

Cet article n'est pas une obsession mathématique, mais seulement une nécessité en prévision de la future reprise du pilotage (à l'aide d'un PIC), de mon panneau solaire en poursuite du soleil.

A ce jour c'est un petit PC et un programme en TURBO PASCAL IV qui assure ce positionnement. Il est souhaitable, bien que la consommation ne soit que d'une trentaine de Watts, de faire quelque chose de moins "gros" avec une interface directe sans repasser par le port // LPT d'un PC

Pour ceux qui ont déjà lu ce premier article (voir cet article), ils savent qu'il n'y a pas de poursuite du soleil fiable avec un asservissement analogique.
Les nuages, les paramètres "auxiliaires" comme les "crottes d'oiseaux sur les cellules", les araignées sur les cellules de butées fin de course etc…sont autant de problèmes qui conduisent à un fonctionnement très aléatoire, voire parfois à quelque catastrophe...

Il n'y a donc qu'une seule solution fiable pour piloter un asservissement solaire, qui est le calcul à partir des équations solaires.

Ce calcul fait appel aux fonctions trigonométriques de base, sinus, cosinus, et arc sinus etc…Bref ce n'est pas trop compliqué, mais c'est juste un peu lourd et embêtant. Il faut pourtant y passer !

Outre les bricoleurs et les simples curieux, l'explication peut revêtir "un tantinet" de discours pédagogique, qui démontrera que les mathématiques APPLIQUÉES sont réellement intéressantes car elles permettent de résoudre des problèmes "un peu délicats".

Démontrer la loi d'Ohm ou démontrer quelque théorème "fumeux" ne m'intéresse pas vraiment. Je laisse cela aux champions de l'abstraction "style MP à la fac de sciences". (Attention, cela a son utilité, mais pas pour moi et mes applications !)
Moi, j'aime le concret, et ces derniers éléments théoriques n'en font pas partie.

Alors on y va pour du pratique 100% ?

1 Quelques rappels de trigonométrie

1.1 Introduction

Tout "tourne" autour de PI et du fameux cercle trigonométrique dont le rayon est par définition de 1.

Pi est un nombre décimal comportant un nombre infini de chiffres qui permet des relations entre la longueur d'une circonférence (un cercle), et son diamètre ou son rayon, mais aussi des projections sur les différents axes qui sont les Sinus, Cosinus, Tangente et Cotangente.

La valeur de Pi est approximativement 3.1415926535897930... Si mes vieux cours sont encore d'actualité, mais nous ne parlerons que de 3.1416 qui est la valeur la plus couramment utilisée, voire même tout simplement 3.14. (On remarquera au passage que 3.1416 multiplié par 10 000 donne 31 416 ce qui est un nombre "qui tient" sur 16 bits, alors que 3.14 *100 est aussi un nombre qui tient sur 2 octets…donc autant tout prendre !)
Le cercle est une figure simple, connue depuis la nuit des temps.

Au niveau de la terre et de l'espace les cercles sont nombreux ou du moins par le cas plus général des ellipses. (Le cercle étant une ellipse particulière dont les deux foyers sont confondus).

Toute la mécanique céleste fourmille de fonctions sinusoïdalesSINUS_1 qui s'entrechoquent et se percutent, donnant des courbes et des valeurs souvent assez compliquées. (Il n'y a qu'à regarder très simplement les phénomènes des marées avec des courbes irrégulières en dos de chameau). (Courbes simplement tracées à partir des tables des marées, courbe ci-contre)

Le sinus représente la valeur de la projection d'un point du cercle trigonométrique sur l'axe des Y. Il est positif ou négatif suivant l'angle et le cadran (cadran= ¼ de cercle soit 90°).

Le cosinus représente la valeur de la projection d'un point du cercle sur l'axe des X. De même il est positif ou négatif.
Les autres rapports trigonométriques sont la tangente et la cotangente qui nous intéresseront moins.
Pour nous, ce sera différent, car on ne veut (et on ne peut) réaliser que des calculs simples, car en assembleur PIC, il n'y a rien, ou très peu (Je n'ai en réalité rien trouvé de réellement remarquable pour faire de tels calculs en routines de base assembleur PIC).

Bien entendu il faudrait passer en PIC BASIC ou autre langage plus évolué, mais ce n'est pas mon choix, car je reste délibérément en assembleur….

1.2 Les relations trigonométriques

Je crois qu'il faut se référer au dessin de tête d'article et de l'avoir toujours sous les yeux, car il est très facile de se tromper, et j'ai du recommencer mon programme, car conçu un peu trop rapidement et avec des cas à n'en plus finir. Bref un bon organigramme met toujours de l'ordre à cette précipitation.

Cet organigramme n'est pas "présentable" tant c'est un brouillon mais je vais le décrire en quelques mots.

Multiplier les degrés par 100 et ajouter les fractions de 1/100 de degrés.
Si le nombre est négatif ajouter 36000 et boucler sans contrôle
Le nombre obtenu est-il supérieur à 36000 ? Alors retrancher 36000 et boucler sans contrôle
Le nombre est-il > 27000 si oui set Sinus - Cos + Angle =36000-valeur, aller à BRANCHCOM
Sinon, Le nombre est-il > 18000 si oui Sinus - cos -  angle= Valeur-18000, aller à BRANCHCOM
sinon,  le nombre est-il > 9000 si oui Sinus + cos - Angle= 180-valeur aller à BRANCHCOM

:BRANCHCOM
Calcul du degré de base et si partie fractionnaire, alors faire l'interpolation. Appliquer le signe et complémenter éventuellement 
Calculer l'angle complémentaire et obtenir le cosinus appliquer le signe et complémenter éventuellement.

Les relations les plus simples sont utilisées pour calculer les rapports pour tous les angles. Seuls les cadrans seront importants pour déterminer les signes initiaux des sinus et cosinus.

Voici les relations de base :

sin a = sin (pi—a)
cos a =-cos (pi-a)
sin a = cos (pi/2-a)
cos a = sin (pi/2-a)
sin (-a) = - sin(a)

1.3 Les fonctions nécessaires

Pour suivre ou poursuivre le soleil, voici les équations de base qui sont impératives, mais nous y reviendrons en détails le moment venu dans l'article qui y sera spécialement consacré.

Sin d = 0.4 Sin (0.986 * (J-82))   ou d= 23.5 sin(2pi*d/365)

Sin o*cosd = sina * cosh

cosh*cos a = cos o *cos d *sin t- sin d * cos t

sin h = sin d * sin t + cos o* cos d *cos t

Avec bien entendu une importante FONCTION INVERSE qui est d'obtenir un angle à partir d'un sinus ou d'un cosinus, qui seul peut nous permettre d'asservir le panneau. (Il n'est pas possible de piloter directement de façon simple par un sinus ou un cosinus à cause du manque de linéarité)
Aussi la fonction ARCSIN (ou ARCCOS) permet de retrouver l'angle dont un des rapports trigonométrique est connu (sinus ou cosinus respectivement).

En résumé en assembleur, nous serons obligés de calculer des sinus, des cosinus, des arcs sinus. Les autres rapports sont déductibles facilement si nécessaire.

En assembleur et sans l'utilisation de nombres réels mais seulement d'entiers, il est difficile d'aller vers des carrés et d'extraire des racines carrées. Aussi j'éviterai soigneusement le théorème de Pythagore qui conduit à trop de difficultés de calcul en assembleur (et d'imprécisions).

Certes la précision de positionnement d'un panneau solaire n'est pas un critère premier, car même un écart de 10° n'affecte le rayonnement que de 2%.
Mais il y a de nombreux facteurs et calculs en cause et avoir une mauvaise précision sur chaque facteur, conduit à avoir une précision finale déplorable. Il faut donc être vigilant tout de même sur les valeurs de base pour ne pas avoir quelque chose qui devienne inexploitable.

Le problème du temps de calcul ne devrait pas être crucial, car le soleil ne se déplace pas trop vite (Excusez moi, la terre ne tourne pas trop vite !).
Néanmoins, plus vite on trouvera la position mieux ce sera, car sur l'instant où j'écris ces quelques lignes, je ne sais pas encore le temps exact qu'il faudra pour tous ces calculs.

1.4 Méthode et Temps de calcul SINUS

Trouver les rapports trigonométriques par des suites ou des formules alambiquées n'est pas facilement réalisable en assembleur PIC sur 8 bits et en valeurs entières.
Alors j'ai pensé un instant rentrer tous les rapports Sinus, cosinus et les radians dans une TABLE pour éviter les calculs…Certes cela prend de la place à raison de 2 octets par rapport…
Et puis en regardant de plus près, je me suis rappelé que dans la "mécanique solaire", les angles >180° sont tout à fait possibles, alors on peut toujours passer par les relations trigonométriques que l'on verra d'ici peu, mais dans ce cas cela impliquera tout de même de calculer…

J'ai également pensé simplifier au maximum les équations solaires, mais la déclinaison changeant tous les jours, il fallait encore dépasser cette limite de 255 "en traînant" 2 octets pour le jour, (365 Jours) et que dire du signe qu'il va falloir gérer puisque ces valeurs sont tantôt positives, tantôt négatives !

J'ai également pensé à travailler sur une seule sinusoïde pour obtenir hauteur et azimut en déplaçant simplement suivant Y une droite // à l'axe des X pour corriger journellement la déclinaison. Seul problème cette courbe n'est plus une sinusoïde, car elle intègre produit et somme de fonction sinusoïdales. (Voir la courbe du pyranomètre sur l'article de la nouvelle régulation solaire)

Après avoir bien retourné le problème et examiné tous les avantages et inconvénients, je me suis résolu à utiliser une UNIQUE TABLE des SINUS allant de 0 à 90° (91° au réel).

Chaque entrée dans la table correspondra à 1°, et pour balayer toute valeur d'angle, les rapports trigonométriques simples donneront les valeurs manquantes pour la totalité des angles sur 360° ou des angles négatifs.
Les unités retenues sont le degré et les centièmes de degrés, car cela se prête parfaitement au calcul 8 bits. Les radians (nombres réels) souvent nécessaires seront simplement obtenu par le calcul si besoin est.

Les grades plus faciles à manier que les degrés, sont-ils encore largement utilisés ? Je n'en sais rien, mais je pense que c'est un peu en voie d'abandon, ne serait-ce qu'à cause des calculettes qui travaillent aussi bien dans toutes les bases.
Après réflexion, cela pourrait tout de même présenter un petit avantage par le simple fait de réaliser des opérations "par 10", mais on a tout de même beaucoup d'habitudes, difficiles à éliminer.

En réalité je généraliserai pour tous les angles dont la valeur ne dépassera pas une valeur sur 16 bits signés, soit + - 32767 °

Cette table sera pourtant limitée à 90° (En réalité 91° pour les problèmes d'interpolation)
De cette table on tirera sans difficulté SINUS en direct, et COSINUS par les relations des angles complémentaires (90°) et supplémentaire (180°)
Les fractions de degrés seront exprimés en 1/100 de degrés et seront obtenus par interpolation linéaire entre les 2 valeurs d'encadrement des degrés exacts.

NOTA : Les centièmes de degrés sont exprimés à part des degrés également sur un octet simple (non signé) 

L'intérêt de cette table est très important, car celle-ci servira également à obtenir les ARCS SINUS (Et COSINUS), par consultation inverse. (On y reviendra, car ce sujet est étroitement lié)

Il est utile de représenter les divisions élémentaires en degrés exacts, l'obtention des radians sera effectuée par le calcul. La précision des valeurs est faite sur 4 digits, (parfois par excès, suivant les tables d'époque "Lebossé et Hémery".
Ainsi, 2 octets représenteront le SINUS des degrés de 0 à 90° en table. Le signe du SINUS de la table sera toujours positif puisqu'il sera toujours celui du premier cadran.
L'angle est directement représenté par l'entrée d'adresse en table et va donc de l'adresse 0 à l'adresse 90 (91 réel).
L'incrément d'angle pour progresser d'un degré nécessitera seulement une double incrémentation.
Les sinus sont donc représentés par 2 octets car ce sont des nombres multipliés par 10 000 et ne dépassant pas cette valeur positive de 10000 accessible par 16 bits.

Pour rappel Sinus et cosinus sont au maximum égaux à 1, puisque le cercle trigonométrique à un rayon de 1 par définition. (Le sinus "interne" maximum sera donc de 10 000)
Ces valeurs de table sont donc déjà multipliées pour pouvoir travailler en entiers. Des divisions seront réalisées lorsque l'on monte trop haut en nombre de bits, mais seulement dans les formules.

En ce qui concerne le temps de calcul, on voit bien que cela va être assez rapide puisque c'est le temps d'accéder à l'entrée de table avec cependant des calculs préalables de cadrans et de positionnement des signes.
Il sera aussi nécessaire de ramener tous les angles à la portion 0 à 90° par les relations trigonométriques.
Le traitement des angles > 360° se réalise par soustraction simple et pour de grands angles (Très peu fréquents) cela peut durer un peu…

De même les angles négatifs sont acceptés et traités pour devenir des angles positifs par les biais des relations trigonométriques. Attention dans ce cas aux compléments fractionnaires de degrés qui "peuvent aussi se complémenter". (Ainsi 33/100 peuvent se "retourner" en 67/100)

Au temps de calcul général et d'accès en table, il va falloir ajouter le temps de calcul par interpolation si les degrés sont exprimés en degrés et 1/100, ce qui sera vraisemblablement le cas. Il faudra donc accéder non pas à 2 octets mais à 4, faire la soustraction des 2 rapports et appliquer la "règle de trois" pour traiter les 1/100.

Mais à cela, attention, car tous ces calculs seront impérativement réalisés en 1/100 de °, à cause des valeurs fractionnaires qui seront souvent complémentées. (Les degrés sont multipliés par 10000 pour être exprimés en 1/100 et additionnés aux 1/100 de la partie fractionnaire)

Encore une dernière précision…Le signe des degrés d'un calcul est seulement exprimé sur l'octet de poids fort des deux octets représentant les degrés entiers. La partie fractionnaire suivra toujours ce signe, (Comme dans un nombre signé normal).
Attention, j'ai dit préalablement que les degrés pouvaient tenir sur 8 bits  ? Erreur ? NON, car la table ne comporte que 91 entrées de degrés (donc 8 bits suffisent), mais l'expression des degrés À TRAITER (Dont on veut obtenir un sinus) peut aller jusqu'à 32767 degrés. Après réduction par les différentes propriétés trigo, on arrive effectivement à avoir un sinus à partir d'une entrée limitée de 0 à 90° (L'erreur est donc fausse !)

Au niveau des temps de calculs, on optimisera, en évitant de calculer le sinus du degré suivant s'il n'y a pas de partie fractionnaire, et l'interpolation sera également évitée dans ce cas.

2 SINUS et COSINUS

A partir des relations de base, de la table et de l'interpolation, on peut obtenir le Sinus directement.
En utilisant l'angle complémentaire, on gagne le temps de tous les contrôles et des réductions angulaires, pour obtenir le cosinus depuis la table des sinus. Cela évite aussi de créer la table spécifique des cosinus, et on calculera ainsi les deux rapports trigonométriques sur un seul appel.

Obtenir Sinus et cosinus à partir de radians nécessitera obligatoirement un calcul de conversion de radians en degrés.

N'aurais-t-on pas pu directement mettre des radians en table ? C'est beaucoup plus difficile car la progression n'est pas unitaire et les radians sont des nombres réels alors que les degrés sont des entiers qui ont l'incommensurable avantage de tenir sur 8 bits de 0 à 90°.
Ces degrés représentent donc directement l'index de la table des Sinus. En réalité ce sont simplement les adresses de table, ce qui aurait été impossible avec les radians sans créer une deuxième table accolée et des calculs compliqués ou une deuxième table à comparer par valeur.

Doit-on ajouter une entrée de table pour les radians ? Bien que "je l'eusse" pourtant préparée, je ne le pense pas, car cela compliquerait sérieusement les tables avec les frontières à 256 possibles avec les RETLW. (Nous en sommes à 180 +2 octets de table sinus)
La simple règle de 3 suffira donc à faire les conversions, dans un sens comme dans l'autre.

Autre remarque…Pour un angle donné, il n'y a toujours qu'une seule valeur de sinus et de cosinus et il n'y a aucune indétermination. (Ce ne serait pas le cas pour la tangente qui tend vers l'infini lorsque l'angle tend vers 90°)

Pour établir cette table automatiquement, j'ai scanné et travaillé en ROC le tableau des Sinus de mon vieux bouquin de 4ème, puis la "mamaille" avec CALC et le traitement de texte ainsi que quelques ultimes corrections m'ont généré directement les valeurs "dt" de la table RETLW des Sinus.

Cette table des SINUS occupe donc 180+2 positions et tient donc dans un espace de 256, traitable sans problèmes de frontières, par RETLW, en mémoire programme.

2.1 Le programme et la table

Le programme fait appel à plusieurs routines de calculs 16 ou 24 bits qui ne seront pas développées ici, mais qui sont généralistes. Certaines de ces routines donnent les résultats sur plusieurs couples de valeurs pour des raisons de facilités.
Ce programme a été construit rapidement à partir du programme de régulation solaire pour PIC 16F et aux initialisations près, devrait fonctionner sur toute la lignée des PIC 16F.

L'ensemble avec les commentaires et lignes vierges représente environ 1000 lignes (Hors routines mathématiques de calcul 8, 16 ou 24 bits (Pas de calculs 32 bits)

Vous pouvez télé-charger cet ensemble SINUS_ASM.DOC si vous le souhaitez. (Pour le SINUS)

3 ARC SINUS

La question de base se pose ainsi : Quel angle a un sinus de 0.3746 (ou 3746) ? …---> 22°

Prenez tout de suite l'image de base et voyez qu'il n'y a PAS qu'une seule solution mais une infinité (Si l'on considère tous les angles possibles). Si on se limite à l'étendue 0 à 360°, il y a alors deux possibilités.

Si l'on ne regarde que la valeur absolue (Sans s'occuper du signe) il y a alors 4 possibilités !

On ne pourra donc pas déterminer LA seule et unique solution. C'est pour cela qu'il y aura le plus souvent des relations annexes qui permettront de déterminer le seul et unique angle possible. (Cet angle dépendra du contexte)

3.1 Le principe de base

C'est cette même table qui va de nouveau servir à retrouver l'angle cherché. On la balayera le plus habituellement depuis les valeurs faibles d'adresses (d'angles) vers le maximum.

Pour les valeurs exactes, il n'y a pas de problème puisque l'on devra toujours trouver une correspondance exacte. Pour les valeurs intermédiaires de Sinus entre deux valeurs, il faudra procéder autrement et rechercher non plus la simple égalité, mais le premier dépassement de valeur.

A ce stade, le dépassement représente le degré supérieur. Il faudra donc revenir en arrière pour avoir la valeur minimum, puis de réaliser l'interpolation en 1/100 de degrés cette fois (Si nécessaire).
(En réalité on évitera cette opération de retour arrière en stockant les valeurs précédentes)
C'est le principe retenu.

Voulez vous télécharger le fichier assembleur ARCSIN_ASM ? format .DOC. (Ce fichier nécessite également la table qui figure au premier programme SINUS).

3.2 La méthode pratique

Pourtant on voit immédiatement que si l'on part de Sinus 0 pour rechercher l'angle dont le sinus est 0.9998, on va devoir balayer toute la table pour rien.
Le balayage indirect reste tout de même rapide, mais je pense qu'il faut faire mieux, d'autant que ce sont des opérations sur 16 bits ne l'oublions pas !.

Il serait possible de traiter par moitié de valeurs en encadrant petit à petit la valeur finale. Cela est possible, mais le propre des sinus est d'avoir peu de variation vers les valeurs qui tendent vers 90°, et cela deviendra vite une boucle qui va durer assez longtemps

Plusieurs éléments vont nous aider dans ce souci d'aller rapidement au résultat :

- La valeur du sinus en table mémoire est séparée en deux parties de 8 bits, dont l'octet de Poids Fort (PF) varie de 0 à 39 (10) ou 27 (Hexa) et ne représente que 6 bits de l'ensemble. On voit parfaitement le tassement des valeurs vers les angles les plus proches de 90°.

- Il serait donc intéressant de procéder à un premier encadrement de valeurs sur la base des Poids Forts (PF) du Sinus connu. Ce calcul d'encadrement ne devra cependant pas consommer trop de temps pour représenter un gain. Aussi on gardera seulement 6 zones différentes dont 4 en recherche de simple égalité et 2 en calcul linéaire simple.

- Une loi d'accès aux premières valeurs à explorer ne devra utiliser que des opérations simples d'addition de soustraction ou d'incrémentation. La division par 2 ou 16 est aussi possible car elle se résoudra par un décalage ou un SWAP. Une comparaison sur 8 bits est rapidement effectuée par une simple instruction de soustraction.

Chaque début de zone de table ne pourra commencer que sur une nouvelle valeur de PF. Ainsi il y aura 6 zones spécifiques qui iront de :

0 à 50° par la relation D = N + N/2
51 à 67° par la relation D = N + N/2 + N/16 + 5
68 à 90° en comparaison directe sur les 4 poids forts de sinus de 24 à 27 (Hexa)

Le nombre d'itérations sur la recherche du seul Poids Fort (8 bits) ne devrait pas déSINUS_LOIpasser 9.
Le nombre d'itérations sur la comparaison de la valeur complète du Sinus (16 bits) ne dépassera pas 10 comparaisons au maximum (Tranche de 77° à 86°). Cette tranche angulaire sera la plus défavorable au niveau des temps de traitement.

Voici donc les règles utilisées pour limiter les recherches en fonction de la valeur du PF du Sinus, avec N qui représente le point d'entrée en table ou finalement l'angle minimum à atteindre (Angle de début de recherche sur la valeur d'un sinus).

Chacune de ces équations simples permettra d'atteindre au plus vite la zone la plus proche de l'angle recherché.

Pour comprendre, ce principe, il faut regarder le tableau joint (Le rendu de l'image n'est pas très bon et il est préférable de télécharger ce fichier) et en début de zone, l'accès est rapide, puis augmente jusqu'à la fin d'une zone. (télécharger SINUS_LOI.PNG)

Dans une même zone on arrive à peu près à l'endroit désiré, toujours par valeur inférieure. Il faut ensuite rechercher le premier PF donnant l'égalité. (Une égalité PF est toujours possible)
Il faut enfin rechercher cette fois sur la totalité du sinus (16 bits)  pour trouver le 1er dépassement.

Dans ce tableau, la colonne écart possible indique le nombre de balayage des PF maximum.
La colonne limite de cycles représente le nombre maximum de comparaisons sur 16 bits.

Dans ce genre de sujet, il est souvent préférable de vérifier toutes les combinaisons, car les surprises ne sont jamais rares…
Aussi pour la fonction ARCOSINUS, cela a été réalisé totalement avec le simulateur et la RS232 qui débite les valeurs  dans un fichier.

Ce fichier a ensuite été importé dans OPEN_OFFICE et tracé avec CALC. La moindre erreur aurait engendré un trait anormal sur la courbe, ce qui n'a pas été le cas. (Il y a tout de même 10000 valeurs à contrôler, ce qui n'est pas réalisable à la main).

On remarquera un fait important car il peut y avoir 2 valeurs de sinus contiguës et différentes pour un même angle interpolé. (Cela ne concerne que les 1/100 de degrés heureusement)

Cela est dû aux divisions dont on abandonne le reste. L'erreur ne dépasse jamais 1/100 de degré d'angle, cela étant indiqué dans CALC.
Ainsi pour un sinus de 0.0007 ou 0.0008, l'angle unique sera de 0° et 4/100 de degrés
Cela apparaît sur le graphique de début, par de petits traits verticaux.
Par opposition en fin de courbe vers les valeurs maximum de SINUS, on constate qu'il n'y a plus aucun double mais on distingue clairement les interpolations linéaires entre deux valeurs exactes de sinus.

La colonne "double" recense là où il y a un même angle pour deux sinus adjacents.
Voici la courbe relevée suivant ce protocole.
(Voulez vous Télé-charger le fichier CTRL_ARCSIN pour vérifier les valeurs et les courbes ?)

Attention…Ne pas oublier de lever le doute (si nécessaire) sur la valeur réelle de l'angle, ainsi qu'on l'a vu en début de §.

3.3 ARC COSINUS

Je ne l'ai pas réalisé, mais il s'obtient facilement par l'angle complémentaire de l'ARC SINUS, suivant les formules

Arc cos x = p/2 - Arc sin x

   Ou en degrés

Arc cos x = 90 – Arc sin x

Ainsi l' Arc Cosinus s'obtient par une simple soustraction, sans repasser par la routine de calcul de l' Arc Sinus.

4 Conclusions

Voilà quelques petites "absences mathématiques" comblées pour la bibliothèque des routines assembleur PIC.

Cela devrait plaire aux étudiants en automatismes dont les projets sont maintenant assez souvent dans les énergies renouvelables. Cela devrait aussi intéresser les spécialistes de la puissance en régime linéaire qui pourront commander des transistors de puissance par une superbe sinusoïde numérique et non pas en MLI.

Je ne pense pas, que vu la précision restreinte à 4 chiffres significatifs, celle-ci soit suffisante pour les observateurs du ciel, mais on ne sait jamais, car un préréglage pourrait s'avérer utile.

Par contre, pour piloter un panneau solaire thermique ou photovoltaïque, aucun problème, la précision devrait être suffisante...!

Un dernier élément issu de l'application réelle dans un programme, est le problème des entiers signés, avec lesquels il est compliqué de réaliser des calculs de multiplications ou divisions, aussi, le plus souvent il est nécessaire de regarder si le nombre est négatif, de mémoriser le signe, de complémenter à 2, puis d'effectuer les calculs en valeur absolue et d'appliquer ensuite le signe au résultat en faisant de nouveau le complément à 2.

Ce sujet est sans fin, car suivant les opérations il faut ou non le signe, aussi c'est dans chaque cas qu'il faudra évaluer le fait de garder la forme absolue ou signée dans ces séquences, voire de "tirer" le signe indépendamment.

Parallèlement, il faut se souvenir qu'avec un angle on peut obtenir  tous les rapports trigonométriques EXACTS, mais que la fonction inverse (ARC_SINUS par exemple) est entachée d'une incertitude  pour l'angle complémentaire, supplémentaire, positif ou négatif...

Pour plus d'informations voir ASTERIX et la Zizanie avec "Savancosinus".....!!!!!

_____ ( retour en début d'article ) ____

_____ ( retour accueil lokistagnepas ) ____
_____ ( retour accueil bricolsec ) ____