Wednesday, 15 February 2017

Déplacement Moyenne Microcontrôleur

LED LYT Meter: LED, PIC Microcontroller et Moyenne Moyenne Bonjour à tous, je vous remercie d'avoir vérifié mon premier Instructable. J'ai aimé voir vos créations au fil des ans et j'adore ce que vous apportez tous. Ce projet est un spin off d'un que j'ai récemment vu ici et je dois donner un cri à Bot1398 parce qu'il m'a démontré dans son Instructable que vous pouvez utiliser une LED pour détecter les changements dans l'intensité lumineuse dans l'environnement et l'utiliser pour Allumer ou éteindre une autre diode. Je savais que si vous fournissiez un peu de puissance à une LED, elle émettrait de la lumière. Je n'ai jamais pensé qu'il pourrait être utilisé l'inverse. Après que j'ai vu son Instructable: Light Sensing LEDs il faisait sens mais je voulais voir cela fonctionne réellement pour moi-même. J'écris ce Instructable parce que Bot1398 a utilisé un Arduino et Ive jamais utilisé. Je n'ai rien contre eux, cependant, quand j'ai commencé à utiliser des microcontrôleurs il ya environ 3 ans, je cherchais de la vitesse et de la puissance pour une application spécifique. Je me suis installé sur la série PIC Microcontroller par Microchip. C'est incroyable ce que vous pouvez faire avec les microcontrôleurs, vous pouvez laisser votre imagination tourner sauvage et avec un peu de programmation créative atteindre exactement ce que vous voulez. Il ya un certain nombre de langages de programmation là aussi, mais quand j'ai commencé je voulais de la vitesse et de savoir exactement ce qui se passait à chaque étape, donc, j'ai choisi Assembly Language, car il ressemblait beaucoup à BASIC que j'ai appris sur le IBM PC Jr. dans les années 1980, quand j'étais grandissant. C'est ce que ce Instructable implique: Microcontrôleurs PIC et langage d'assemblage pour utiliser une diode électroluminescente (LED) pour détecter la quantité de lumière ambiante et afficher la mesure numérique de cette lumière avec un bargraphe sur un écran LCD. J'ai produit la première version de ce dispositif de détection de lumière basé sur LED qui a fonctionné, le problème que j'ai remarqué était que les valeurs ont sauté autour un peu. Par conséquent, j'ai cherché une solution à ce problème, j'ai pensé à la moyenne des valeurs, mais comment mathématiques binaires est un peu difficile, mais il ya toujours un moyen de le faire. Comme je cherchais des solutions, je suis tombé sur une grande page sur les moyennes mobiles et la façon de le faire le plus efficacement de sorte que même les microcontrôleurs 8 bits peut le gérer avec facilité. Le lien vers la page est ici: Moyennes mobiles facilement calculables et cela fonctionne très bien. Cette implémentation affiche la moyenne mobile des 256 dernières lectures de lumière et affiche cette valeur ainsi qu'un bargraphe sur l'écran LCD. Le code de la moyenne mobile empêche les valeurs lues de la LED de sauter autour de beaucoup et vous donne un meilleur résultat, beaucoup plus précis. Lorsque nous attachons une LED à un microcontrôleur, nous faisons habituellement cela pour l'allumer. Dans ce cas, cependant, nous appliquons en fait une tension positive à l'extrémité négative de l'électrode. C'est pour que nous puissions profiter de quelque chose appelé capacité parasite. L'application de cette tension positive permettra d'accumuler une petite charge (les ressources sur Internet dire dans environ 100-200 nanosecondes) dans cette capacité parasite de la LED que nous utilisons. La capacité réelle n'est pas très important, mais les ressources en ligne disent qu'il est autour de 10-15 pF. Nous allons alors commuter la broche du microcontrôleur attachée à l'extrémité négative de l'électrode d'une SORTIE à une ENTREE et attendre que la charge se draine. Lorsque la charge est suffisante, la broche va maintenant lire un niveau logique 0 ou Low où nous allons éteindre la minuterie et utiliser cette valeur pour calculer la moyenne mobile et afficher les résultats à l'écran. Nous prendrons alors plus de lectures et les afficherons à l'écran à l'intervalle qui est écrit dans le code d'assemblage. Dans le code fini, je l'ai mis à prendre une lecture environ toutes les microsecondes environ 20. Cela se produit 50 fois de sorte qu'un résultat mis à jour est affiché à l'écran environ chaque seconde environ. Le temps qu'il faut pour obtenir une lecture variera un peu parce qu'il prend plus de temps pour la charge de drainer dans un environnement sombre et cela se produit plus rapidement dans des environnements lumineux. La vitesse de décharge de la capacité de LED est en quelque sorte directement liée au nombre de photons ou à la quantité de lumière frappant les éléments de génération de lumière à DEL. Neat n'est-il pas. ) Maintenant que nous savons comment cela fonctionne, passez à l'étape 1. Étape 1: Rassemblez les composants et assemblez le circuit Montrez tous les 5 images Récupérez d'abord les éléments suivants que vous aurez besoin pour construire le compteur LED LYT METER: PIC (j'ai utilisé le Maintenant, vous devriez être en mesure de suivre le schéma pour assembler le circuit sur une planche à pain ou toute autre manière que vous souhaitez mettre vos circuits ensemble. Celui-ci est assez facile et a des parties minimales. J'ai joint deux schémas différents, l'un a la LED de mesure de la lumière connectée à deux broches de microcontrôleur différentes et l'autre a cette diode avec la cathode (ou l'extrémité négative) connectée à une broche de microcontrôleur et l'anode (ou l'extrémité positive) de la LED connectée à la masse. Cela semble à l'envers mais, rappelez-vous, nous n'utilisons pas la LED pour produire de la lumière, mais pour la mesurer à la place. C'est pourquoi il est relié de cette façon. Dans mes images, vous verrez que la LED est connectée à deux broches du microcontrôleur. C'est parce que je voulais être en mesure d'utiliser la LED pour produire de la lumière aussi, afin de vérifier pour s'assurer qu'il fonctionne lorsque le programme est démarré. Si vous choisissez de connecter la LED à 2 broches du microcontrôleur, vous devrez garder cela à l'esprit pour qu'il fonctionne. Je ne pouvais pas trouver ce documenté n'importe où donc il a fallu un peu d'expérimentation pour le faire fonctionner. Afin d'être en mesure d'allumer la LED, les deux broches du microcontrôleur devront être réglées comme OUTPUTS. Ensuite, pour faire briller la LED, vous réglez l'anode (ou l'extrémité positive) de la LED de sorte que le courant passe à travers la LED pour produire de la lumière. Au début j'ai pensé que j'aurais besoin de placer la cathode (ou l'extrémité négative) de la LED comme un INPUT mais ceci n'a pas fonctionné. Maintenant que vous avez les composants, les mettre ensemble sur la planche à pain en suivant le schéma que vous souhaitez suivre. Une fois assemblé, il devrait ressembler un peu aux images ci-dessous. J'utilise un régulateur de 5 volts pour fournir 5 volts pour alimenter le circuit. J'utilise une verrue murale qui fournit environ 9 volts au régulateur. L'écran LCD que j'utilise est un écran Newhaven Display NHDC0220AZFSWFTW COG (ChiponGlass) Module d'affichage à cristaux liquides. J'ai utilisé pour utiliser le HD44780 écrans LCD que beaucoup d'autres personnes utilisent. Vous pouvez definiately utiliser les écrans HD44780 sans aucun problème et il ya beaucoup plus de code source là-bas pour les faire fonctionner. L'affichage Newhaven n'avait pas de code source, mais assis avec la feuille de données et en utilisant le code source HD44780, je suis venu avec le code pour le faire fonctionner parfaitement. J'aime l'affichage pour quelques raisons. Le contraste est très facile à régler et jusqu'à présent je n'ai pas eu à le changer du tout pendant les différentes saisons, il reste toujours clair et très facile à lire. Il a également une empreinte plus petite et était exactement ce que j'avais besoin pour un projet énorme sur lequel je travaille lorsque l'espace disponible est à une prime. Il est plus petit et que le HD44780 affiche et affiche toujours 20 caractères sur chacune des deux lignes. Enfin, il est moins coûteux que le HD44780 affiche ainsi. J'ai choisi un couple de ces jusqu'à Digikey et à seulement un prix de 10,25 chacun. Découvrez-les ici: Newhaven LCD Display chez Digikey. Gardez à l'esprit que cet affichage nécessite de 3,3 à 5,5 volts alors gardez cela à l'esprit lors du choix de votre source d'alimentation. Le code source qui est fourni doit également exécuter le HD44780 affiche sans aucun problème. C'est la façon dont je l'ai mis en place. Vous pouvez placer les composants sur des broches différentes de votre microcontrôleur. Il suffit de garder à l'esprit les broches du microcontrôleur vous connecter à l'extrémité positive et négative de la LED de détection de la lumière. Vous pouvez également câbler votre écran LCD pour fonctionner en mode 4 bits au lieu du mode 8 bits comme illustré. Cela nécessiterait quatre connexions moins dans le circuit, mais rend votre programmation un peu plus compliquée. Passez aux prochaines étapes. Écrire le programme. Comme d'autres l'ont mentionné, vous devriez considérer un filtre IIR (réponse impulsion infinie) plutôt que le filtre FIR (réponse impulsionnelle finie) que vous utilisez maintenant. Il y a plus, mais à première vue les filtres FIR sont implémentés comme des convolutions explicites et des filtres IIR avec des équations. Le filtre IIR particulier que j'utilise beaucoup dans les microcontrôleurs est un filtre passe-bas à un seul pôle. C'est l'équivalent numérique d'un simple filtre analogique R-C. Pour la plupart des applications, celles-ci auront de meilleures caractéristiques que le filtre de boîte que vous utilisez. La plupart des utilisations d'un filtre de boîte que j'ai rencontré sont le résultat de quelqu'un qui ne prête pas attention dans la classe de traitement de signal numérique, et non pas en raison de besoin de leurs caractéristiques particulières. Si vous voulez juste atténuer les hautes fréquences que vous connaissez le bruit, un seul filtre passe-bas piste est mieux. La meilleure façon d'implémenter un numérique dans un microcontrôleur est généralement: FILT lt-- FILT FF (NEW-FILT) FILT est un morceau d'état persistant. Il s'agit de la seule variable persistante dont vous avez besoin pour calculer ce filtre. NEW est la nouvelle valeur que le filtre est mis à jour avec cette itération. FF est la fraction du filtre. Qui ajuste la lourdeur du filtre. Regardez cet algorithme et voyez que pour FF 0 le filtre est infiniment lourd puisque la sortie ne change jamais. Pour FF 1, son vraiment pas de filtre du tout puisque la sortie vient de suivre l'entrée. Les valeurs utiles sont entre les deux. Sur les petits systèmes, vous choisissez FF pour être 12 N de sorte que la multiplication par FF peut être accomplie comme un décalage à droite par N bits. Par exemple, FF pourrait être 116 et la multiplication par FF donc un décalage à droite de 4 bits. Sinon, ce filtre n'a besoin que d'une soustraction et d'un ajout, bien que les nombres doivent généralement être plus larges que la valeur d'entrée (plus sur la précision numérique dans une section séparée ci-dessous). Je prends habituellement des lectures de DA beaucoup plus rapidement qu'elles ne sont nécessaires et appliquez deux de ces filtres en cascade. Il s'agit de l'équivalent numérique de deux filtres R-C en série, et atténue de 12 dBoctave au-dessus de la fréquence de roulage. Cependant, pour les lectures AD, il est habituellement plus pertinent de regarder le filtre dans le domaine temporel en considérant sa réponse par pas. Cela indique à quelle vitesse votre système verra un changement lorsque la chose que vous mesure change. Pour faciliter la conception de ces filtres (ce qui signifie seulement cueillir FF et décider combien d'entre eux de cascade), je utiliser mon programme FILTBITS. Vous spécifiez le nombre de bits de décalage pour chaque FF dans la série de filtres en cascade, et il calcule la réponse d'étape et d'autres valeurs. En fait, je cours habituellement via mon script wrapper PLOTFILT. Cela exécute FILTBITS, qui crée un fichier CSV, puis trace le fichier CSV. Par exemple, voici le résultat de PLOTFILT 4 4: Les deux paramètres de PLOTFILT signifient qu'il y aura deux filtres en cascade du type décrit ci-dessus. Les valeurs de 4 indiquent le nombre de bits de décalage pour réaliser la multiplication par FF. Les deux valeurs FF sont donc 116 dans ce cas. La trace rouge est la réponse à l'échelon d'unité, et est la chose principale à regarder. Par exemple, ceci indique que si l'entrée change instantanément, la sortie du filtre combiné s'installera à 90 de la nouvelle valeur en 60 itérations. Si vous prenez soin de 95 temps de règlement, alors vous devez attendre environ 73 itérations, et pour 50 temps de règlement seulement 26 itérations. La trace verte vous montre la sortie d'une seule pointe pleine amplitude. Cela vous donne une idée de la suppression du bruit aléatoire. Il semble qu'aucun échantillon ne causera plus d'un changement de 2.5 dans la sortie. La trace bleue est de donner un sentiment subjectif de ce que ce filtre fait avec le bruit blanc. Ce n'est pas un test rigoureux car il n'y a aucune garantie exactement quel était le contenu des nombres aléatoires sélectionnés comme le bruit blanc d'entrée pour cette série de PLOTFILT. Son seulement pour vous donner une sensation approximative de combien il sera écrasé et comment lisse il est. PLOTFILT, peut-être FILTBITS, et beaucoup d'autres choses utiles, en particulier pour le développement de microprogramme PIC est disponible dans la version du logiciel PIC Development Tools à la page de téléchargement de mon logiciel. Ajouté à la précision numérique je vois des commentaires et maintenant une nouvelle réponse qu'il ya intérêt à discuter le nombre de bits nécessaires pour mettre en œuvre ce filtre. Notez que la multiplication par FF créera des bits nouveaux Log 2 (FF) en dessous du point binaire. Sur de petits systèmes, FF est habituellement choisi pour être 12 N de sorte que cette multiplication est réellement réalisée par un décalage à droite de N bits. FILT est donc généralement un entier de point fixe. Notez que cela ne change rien des maths du point de vue des processeurs. Par exemple, si vous filtrez des lectures AD de 10 bits et N 4 (FF 116), vous avez besoin de 4 bits de fraction au-dessous des valeurs d'AD de 10 bits. L'un des processeurs les plus, youd faire 16 bits opérations entières en raison de la lecture de 10 bits AD. Dans ce cas, vous pouvez toujours faire exactement les mêmes opérations de 16 bits entiers, mais commencez par les lectures AD décalées de 4 bits. Le processeur ne connaît pas la différence et ne nécessite pas. Faire les calculs sur des entiers entiers de 16 bits fonctionne si vous les considérez comme 12,4 points fixes ou entiers 16 bits vrais (16,0 points fixes). En général, vous devez ajouter N bits chaque pôle de filtre si vous ne voulez pas ajouter de bruit en raison de la représentation numérique. Dans l'exemple ci-dessus, le second filtre de deux doit avoir 1044 18 bits pour ne pas perdre d'informations. En pratique sur une machine 8 bits, cela signifie que vous utiliserez des valeurs de 24 bits. Techniquement seul le second pôle de deux aurait besoin de la plus grande valeur, mais pour la simplicité du microprogramme, j'utilise habituellement la même représentation, et donc le même code, pour tous les pôles d'un filtre. Habituellement, j'écris une sous-routine ou une macro pour effectuer une opération de pôle de filtre, puis l'appliquer à chaque pôle. Le choix d'un sous-programme ou d'une macro dépend du fait que les cycles ou la mémoire de programme sont plus importants dans ce projet particulier. De toute façon, j'utilise un certain état de scratch pour passer NEW dans le subroutinemacro, qui met à jour FILT, mais charge également dans le même état de scratch NEW était po Cela rend facile d'appliquer plusieurs pôles depuis la mise à jour FILT d'un pôle est le NOUVEAU De la suivante. Lorsqu'un sous-programme, il est utile d'avoir un pointeur pointe vers FILT sur le chemin, qui est mis à jour juste après FILT sur la sortie. De cette façon, le sous-programme fonctionne automatiquement sur des filtres consécutifs en mémoire si appelé plusieurs fois. Avec une macro, vous n'avez pas besoin d'un pointeur puisque vous passez dans l'adresse pour fonctionner sur chaque itération. Exemples de code Voici un exemple de macro comme décrit ci-dessus pour un PIC 18: Et voici une macro similaire pour un PIC 24 ou dsPIC 30 ou 33: Ces deux exemples sont implémentés en tant que macros en utilisant mon pré-processeur assembleur PIC. Qui est plus capable que l'un des macro-installations intégrées. Clabacchio: Un autre problème que je devrais mentionner est la mise en œuvre du microprogramme. Vous pouvez écrire un sous-programme de filtre passe-bas à un seul pôle une fois, puis l'appliquer plusieurs fois. En fait, j'écris habituellement un tel sous-programme pour prendre un pointeur en mémoire à l'état du filtre, puis faire avancer le pointeur pour qu'il puisse être appelé successivement facilement pour réaliser des filtres multipolaires. Ndash Olin Lathrop Apr 20 12 at 15:03 1. merci beaucoup pour vos réponses - tous. J'ai décidé d'utiliser ce filtre IIR, mais ce filtre n'est pas utilisé comme un filtre LowPass standard, car j'ai besoin de la moyenne des valeurs de compteur et de les comparer pour détecter les changements dans une certaine gamme. Puisque ces valeurs vont être de dimensions très différentes selon le matériel que je voulais prendre en moyenne afin de pouvoir réagir automatiquement à ces modifications spécifiques au matériel. Ndash sensslen May 21 12 at 12:06 Si vous pouvez vivre avec la restriction d'un pouvoir de deux nombre d'articles à la moyenne (c'est-à-dire 2,4,8,16,32 etc) alors le partage peut facilement et efficacement être fait sur une Faible performance micro sans division dédiée car il peut être fait comme un changement de bit. Chaque décalage à droite est une puissance de deux, par exemple: Le OP pensait qu'il avait deux problèmes, la division dans un PIC16 et la mémoire de son tampon anneau. Cette réponse montre que la division n'est pas difficile. Certes, il n'aborde pas le problème de la mémoire, mais le système SE permet des réponses partielles, et les utilisateurs peuvent prendre quelque chose à partir de chaque réponse pour eux-mêmes, ou même modifier et combiner d'autres réponses. Puisque certaines des autres réponses nécessitent une opération de division, elles sont également incomplètes car elles ne montrent pas comment réaliser efficacement ceci sur un PIC16. Ndash Martin Apr 20 12 at 13:01 Il ya une réponse pour un vrai filtre de moyenne mobile (aka boxcar filtre) avec moins de mémoire, si vous n'avez pas l'esprit de downsampling. Son appelé un filtre intégrateur-peigne en cascade (CIC). L'idée est que vous avez un intégrateur que vous prenez des différences de plus d'un laps de temps, et le dispositif clé-économie de mémoire est que par downsampling, vous n'avez pas à stocker chaque valeur de l'intégrateur. Il peut être implémenté en utilisant le pseudocode suivant: Votre longueur moyenne mobile efficace est decimationFactorstatesize, mais vous avez seulement besoin de conserver autour des échantillons statesize. Évidemment, vous pouvez obtenir de meilleures performances si votre stateize et decimationFactor sont des puissances de 2, de sorte que les opérateurs de division et de reste sont remplacés par des changements et masque-ands. Postscript: Je suis d'accord avec Olin que vous devriez toujours considérer les filtres IIR simples avant un filtre de moyenne mobile. Si vous n'avez pas besoin de fréquence-nulls d'un filtre de wagon, un filtre à un ou un filtre passe-bas bipolaire fonctionnera probablement bien. D'autre part, si vous filtrez les fins de la décimation (en prenant une entrée haute fréquence d'échantillonnage et de la moyenne pour une utilisation par un processus à faible taux), puis un filtre CIC peut être juste ce que vous cherchez. (En particulier si vous pouvez utiliser statesize1 et d'éviter le ringbuffer tout à fait avec une seule valeur intégrateur précédent) Theres une analyse approfondie des maths derrière en utilisant le filtre IIR de premier ordre qu'Olin Lathrop a déjà décrit plus sur le Digital Signal Processing stack exchange (Y compris beaucoup de jolies images.) L'équation pour ce filtre IIR est: Cela peut être implémenté en utilisant uniquement des entiers et pas de division en utilisant le code suivant (peut-être besoin d'un débogage comme je le tapais à partir de la mémoire.) Les derniers échantillons K en réglant la valeur de alpha sur 1K. Faites ceci dans le code précédent en définissant BITS sur LOG2 (K), c'est-à-dire pour K 16 mis BITS sur 4, pour K 4 mis BITS sur 2, etc. (Ill vérifie le code énuméré ici dès que j'obtiens un changement et Modifier cette réponse si nécessaire.) A répondu Jun 23 12 at 4:04 Heres un filtre passe-bas unipolaire (moyenne mobile, avec fréquence de coupure CutoffFrequency). Très simple, très rapide, fonctionne très bien, et presque aucun surcroît de mémoire. Remarque: Toutes les variables ont une portée au-delà de la fonction de filtre, à l'exception de la passée dans newInput Remarque: Il s'agit d'un filtre monophasé. Plusieurs étages peuvent être mis en cascade ensemble pour augmenter la netteté du filtre. Si vous utilisez plus d'une étape, vous devez régler DecayFactor (en fonction de la fréquence de coupure) pour compenser. Et évidemment, tout ce dont vous avez besoin est ces deux lignes placées n'importe où, ils n'ont pas besoin de leur propre fonction. Ce filtre a un temps de montée en charge avant que la moyenne mobile ne représente celle du signal d'entrée. Si vous devez contourner ce temps de montée en puissance, vous pouvez simplement initialiser MovingAverage à la première valeur de newInput au lieu de 0 et espérer que le premier newInput n'est pas un outlier. (CutoffFrequencySampleRate) a une plage comprise entre 0 et 0,5. DecayFactor est une valeur entre 0 et 1, habituellement proche de 1. Les flotteurs de précision simple sont assez bons pour la plupart des choses, je préfère simplement les doubles. Si vous avez besoin de coller avec des entiers, vous pouvez convertir DecayFactor et Amplitude Factor en entiers fractionnaires, dans lequel le numérateur est stocké comme l'entier, et le dénominateur est une puissance entière de 2 (si vous pouvez bit-shift à la droite comme Dénominateur plutôt que de devoir diviser pendant la boucle de filtre). Par exemple, si vous utilisez DecayFactor 0.99 et que vous voulez utiliser des entiers, vous pouvez définir DecayFactor 0.99 65536 64881. Et puis, chaque fois que vous multipliez par DecayFactor dans votre boucle de filtre, il suffit de décaler le résultat 16. Pour plus d'informations à ce sujet, un excellent livre thats En ligne, chapitre 19 sur les filtres récursifs: dspguidech19.htm PS Pour le paradigme de la moyenne mobile, une approche différente pour définir DecayFactor et AmplitudeFactor qui peut être plus pertinente pour vos besoins, disons que vous voulez que le précédent, environ 6 éléments moyennés ensemble, le faire discrètement, youd ajouter 6 articles et diviser par 6, donc Vous pouvez régler le AmplitudeFactor sur 16 et le DecayFactor sur (1.0 - AmplitudeFactor). A répondu May 14 12 at 22:55 Tout le monde a commenté minutieusement sur l'utilité de l'IIR vs FIR, et sur la puissance-de-deux division. Id juste comme pour donner quelques détails d'implémentation. Le ci-dessous fonctionne bien sur de petits microcontrôleurs sans FPU. Il n'y a pas de multiplication, et si vous conservez N une puissance de deux, toute la division est un seul cycle de déplacement de bits. Basic buffer anneau FIR: conserve un tampon courant des dernières N valeurs, et une somme courante de toutes les valeurs dans le tampon. Chaque fois qu'un nouvel échantillon arrive, soustrayez la valeur la plus ancienne du tampon de SUM, remplacez-la par le nouvel échantillon, ajoutez le nouvel échantillon à SUM et sortez SUMN. Modifié IIR anneau tampon: garder une somme courante des dernières N valeurs. Chaque fois qu'un nouvel échantillon arrive, SUM - SUMN, ajoutez le nouvel échantillon et la sortie SUMN. Si vous lisez bien, vous décrivez un filtre IIR de premier ordre, la valeur que vous soustrayez n'est pas la valeur la plus ancienne qui tombe, mais plutôt la moyenne des valeurs précédentes. Les filtres IIR de premier ordre peuvent certainement être utiles, mais je ne sais pas ce que vous voulez dire lorsque vous proposez que la sortie soit la même pour tous les signaux périodiques. À une fréquence d'échantillonnage de 10 kHz, l'alimentation d'une onde carrée de 100 Hz dans un filtre de 20 étages produira un signal qui s'élève uniformément pour 20 échantillons, se stabilise à 30, chute uniformément pour 20 échantillons et reste bas pour 30. Un premier ordre IIR. Ndash supercat Aug 28 13 à 15:31 donnera une onde qui commence brusquement à monter et se nivelle graduellement près (mais pas à) le maximum d'entrée, puis commence brusquement à tomber et se nivelle graduellement près (mais pas) du minimum d'entrée. Comportement très différent. Ndash supercat Aug 28 13 at 15:32 Une question est qu'une moyenne mobile simple peut ou peut ne pas être utile. Avec un filtre IIR, vous pouvez obtenir un filtre agréable avec relativement peu de calcs. La FIR que vous décrivez peut seulement vous donner un rectangle dans le temps - un sinc en freq - et vous ne pouvez pas gérer les lobes latéraux. Il peut être bien la peine de jeter dans quelques entiers multiplicatif pour en faire une belle symétrique accordable FIR si vous pouvez épargner les tics de l'horloge. Ndash Scott Seidman Aug 29 13 at 13:50 ScottSeidman: Il n'est pas nécessaire de multiplier si on a simplement chaque étape de la FIR soit la sortie de la moyenne de l'entrée à cette étape et sa valeur stockée précédente, puis stocker l'entrée (si on a La plage numérique, on pourrait utiliser la somme plutôt que la moyenne). Que ce soit mieux qu'un filtre de boîte dépend de l'application (la réponse d'étape d'un filtre de boîte avec un retard total de 1ms, par exemple, aura un pic d2dt désagréable lorsque le changement d'entrée, et 1ms plus tard, mais aura le minimum Possible ddt pour un filtre avec un retard total de 1ms). Si vous avez vraiment besoin de réduire vos besoins en mémoire, et vous n'avez pas l'esprit de votre réponse impulsionnelle étant une exponentielle (au lieu d'une impulsion rectangulaire), je voudrais aller pour un filtre de moyenne mobile exponentielle . Je les utilise largement. Avec ce type de filtre, vous n'avez pas besoin de tampon. Vous n'avez pas à stocker N échantillons passés. Juste un. Ainsi, vos exigences de mémoire sont réduites par un facteur de N. En outre, vous n'avez pas besoin de division pour cela. Seulement multiplications. Si vous avez accès à l'arithmétique à virgule flottante, utilisez des multiplications en virgule flottante. Sinon, effectuez des multiplications entières et décalez vers la droite. Cependant, nous sommes en 2012, et je vous recommande d'utiliser des compilateurs (et des MCU) qui vous permettent de travailler avec des nombres à virgule flottante. En plus d'être plus efficace de mémoire et plus rapide (vous n'avez pas à mettre à jour des éléments dans un tampon circulaire), je dirais qu'il est également plus naturel. Car une réponse impulsionnelle exponentielle correspond mieux à la façon dont la nature se comporte, dans la plupart des cas. Une question avec le filtre IIR comme presque touché par olin et supercat mais apparemment méprisé par d'autres est que l'arrondissement vers le bas introduit une certaine imprécision (et potentiellement biastruncation). En supposant que N est une puissance de deux et que seule une arithmétique entière est utilisée, le droit de décalage élimine systématiquement les LSB du nouvel échantillon. Cela signifie que la durée de la série pourrait jamais être, la moyenne ne prendra jamais en compte. Par exemple, supposons une série lentement décroissante (8, 8, 8, 7, 7, 7, 7, 6, 6) et supposons que la moyenne est en effet de 8 au début. Le premier échantillon amènera la moyenne à 7, quelle que soit la force du filtre. Juste pour un échantillon. Même histoire pour 6, etc Maintenant, pensez à l'inverse. La série monte. La moyenne va rester sur 7 pour toujours, jusqu'à ce que l'échantillon est assez grand pour le faire changer. Bien sûr, vous pouvez corriger le biais en ajoutant 12N2, mais qui ne résoudra pas vraiment le problème de précision. Dans ce cas la série décroissante restera éternellement à 8 jusqu'à ce que l'échantillon soit 8-12 (N2). Pour N4 par exemple, tout échantillon au-dessus de zéro maintiendra la moyenne inchangée. Je crois qu'une solution pour cela impliquerait de détenir un accumulateur des LSBs perdus. Mais je n'ai pas fait assez loin pour avoir le code prêt, et je ne suis pas sûr qu'il ne nuirait pas à la puissance IIR dans certains autres cas de série (par exemple, si 7,9,7,9 serait moyenne à 8 alors). Olin, votre cascade à deux étages aurait aussi besoin d'une explication. Voulez-vous dire tenir deux valeurs moyennes avec le résultat de la première alimentation dans la seconde dans chaque itération. Quel est le bénéfice de ce multimètre LED LYT: LED, PIC Microcontrôleur et Moyenne Moyenne Bonjour à tous, je vous remercie d'avoir vérifié mon premier Instructable. J'ai aimé voir vos créations au fil des ans et j'adore ce que vous apportez tous. Ce projet est un spin off d'un que j'ai récemment vu ici et je dois donner un cri à Bot1398 parce qu'il m'a démontré dans son Instructable que vous pouvez utiliser une LED pour détecter les changements dans l'intensité lumineuse dans l'environnement et l'utiliser pour Allumer ou éteindre une autre diode. Je savais que si vous fournissiez un peu de puissance à une LED, elle émettrait de la lumière. Je n'ai jamais pensé qu'il pourrait être utilisé l'inverse. Après que j'ai vu son Instructable: Light Sensing LEDs il faisait sens mais je voulais voir cela fonctionne réellement pour moi-même. J'écris ce Instructable parce que Bot1398 a utilisé un Arduino et I8217ve jamais utilisé. Je n'ai rien contre eux, cependant, quand j'ai commencé à utiliser des microcontrôleurs il ya environ 3 ans, je cherchais de la vitesse et de la puissance pour une application spécifique. Je me suis installé sur la série PIC Microcontroller par Microchip. C'est incroyable ce que vous pouvez faire avec les microcontrôleurs, vous pouvez laisser votre imagination tourner sauvage et avec un peu de programmation créative atteindre exactement ce que vous voulez. Il ya un certain nombre de langages de programmation là aussi, mais quand j'ai commencé je voulais de la vitesse et de savoir exactement ce qui se passait à chaque étape, donc, j'ai choisi Assembly Language, car il ressemblait beaucoup à BASIC que j'ai appris sur le IBM PC Jr. de retour dans les 19808217s quand je grandissais. C'est ce que ce Instructable implique: Microcontrôleurs PIC et langage d'assemblage pour utiliser une diode électroluminescente (LED) pour détecter la quantité de lumière ambiante et afficher la mesure numérique de cette lumière avec un bargraphe sur un écran LCD. J'ai produit la première version de ce dispositif de détection de lumière basé sur LED qui a fonctionné, le problème que j'ai remarqué était que les valeurs ont sauté autour un peu. Par conséquent, j'ai cherché une solution à ce problème, j'ai pensé à la moyenne des valeurs, mais comment mathématiques binaires est un peu difficile, mais il ya toujours un moyen de le faire. Comme je cherchais des solutions, je suis tombé sur une grande page sur les moyennes mobiles et la façon de le faire le plus efficacement de sorte que même les microcontrôleurs 8 bits peut le gérer avec facilité. Le lien vers la page est ici: Moyennes mobiles facilement calculables et cela fonctionne très bien. Cette implémentation affiche la moyenne mobile des 256 dernières lectures de lumière et affiche cette valeur ainsi qu'un bargraphe sur l'écran LCD. Le code de la moyenne mobile empêche les valeurs lues de la LED de sauter autour de beaucoup et vous donne un meilleur résultat, beaucoup plus précis. Lorsque nous attachons une LED à un microcontrôleur, nous faisons habituellement cela pour l'allumer. Dans ce cas, cependant, nous appliquons en fait une tension positive à l'extrémité négative de l'électrode. C'est pour que nous puissions profiter de quelque chose appelé capacité parasite. L'application de cette tension positive permettra d'accumuler une petite charge (les ressources sur Internet dire dans environ 100-200 nanosecondes) dans cette capacité parasite de la LED que nous utilisons. La capacité réelle n'est pas très important, mais les ressources en ligne disent qu'il est autour de 10-15 pF. Nous allons alors commuter la broche du microcontrôleur attachée à l'extrémité négative de l'électrode d'une SORTIE à une ENTREE et attendre que la charge se draine. Lorsque la charge est suffisante, la broche va maintenant lire un niveau logique 0 ou Low où nous allons éteindre la minuterie et utiliser cette valeur pour calculer la moyenne mobile et afficher les résultats à l'écran. Nous prendrons alors plus de lectures et les afficherons à l'écran à l'intervalle qui est écrit dans le code d'assemblage. Dans le code fini, je l'ai mis à prendre une lecture environ toutes les microsecondes environ 20. Cela se produit 50 fois de sorte qu'un résultat mis à jour est affiché à l'écran environ chaque seconde environ. Le temps qu'il faut pour obtenir une lecture variera un peu parce qu'il prend plus de temps pour la charge de drainer dans un environnement sombre et cela se produit plus rapidement dans des environnements lumineux. La vitesse de décharge de la capacité de LED est en quelque sorte directement liée au nombre de photons ou à la quantité de lumière frappant les éléments de génération de lumière à DEL. Neat isn8217t elle. Maintenant que nous savons comment cela fonctionne, let8217s passer à l'étape 1. Étape 1: Rassembler les composants et assembler le circuit Premièrement rassembler les éléments suivants, vous aurez besoin pour construire la LED LYT METER: PIC Microcontrôleur (j'ai utilisé le 18F4550) 221520 ou 221516) LEDs Panneau de câbles Alimentation Source Maintenant, vous devriez être en mesure de suivre le schéma pour assembler le circuit sur une planche à pain ou de toute autre manière que vous souhaitez mettre vos circuits ensemble. Celui-ci est assez facile et a des parties minimales. J'ai joint deux schémas différents, l'un a la LED de mesure de la lumière connectée à deux broches de microcontrôleur différentes et l'autre a cette diode avec la cathode (ou l'extrémité négative) connectée à une broche de microcontrôleur et l'anode (ou l'extrémité positive) de la LED connectée à la masse. Cela semble à l'envers mais, rappelez-vous, nous n'utilisons pas la LED pour produire de la lumière, mais pour la mesurer à la place. C'est pourquoi il est relié de cette façon. Dans mes images, vous verrez que la LED est connectée à deux broches du microcontrôleur. C'est parce que je voulais être en mesure d'utiliser la LED pour produire de la lumière aussi, afin de vérifier pour s'assurer qu'il fonctionne lorsque le programme est démarré. Si vous choisissez de connecter la LED à 2 broches du microcontrôleur, vous devrez garder cela à l'esprit pour qu'il fonctionne. Je ne pouvais pas trouver ce documenté n'importe où donc il a fallu un peu d'expérimentation pour le faire fonctionner. Afin d'être en mesure d'allumer la LED, les deux broches du microcontrôleur devront être réglées comme OUTPUTS. Ensuite, pour faire briller la LED, vous réglez l'anode (ou l'extrémité positive) de la LED de sorte que le courant passe à travers la LED pour produire de la lumière. Au début j'ai pensé que j'aurais besoin de fixer la cathode (ou l'extrémité négative) de la LED comme un INPUT mais ceci n'a pas fonctionné.


No comments:

Post a Comment