Audiyofan.org http://www.audiyofan.org/forum/ |
|
Ajout d'une télécommande sur un ampli (ou un préamp) http://www.audiyofan.org/forum/viewtopic.php?f=60&t=8502 |
Page 8 sur 10 |
Auteur: | Totof [ Dim 15 Jan 2012, 12:12 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Salut Philbob J'ai besoin de toi J'arrive a afficher sur la droite de l'zcran LCD la valeur de 0 à 1023 , soit la conversion ADC mais c'est tout , pour transformer le résultat je nage , je nage pourrais tu m'expliquer ou indiquer un lien qui me permette de comprendre j'arrive pas à appliquer une formule mathématique dans la routine j'arrive juste à diviser par 10 par exemple le résultat adc et l'afficher mais ce n'est pas ce que je voulais ton dernier post est bien détaillé sauf que j'y arrive pas Aller je vais courrir maintenant qui fait bon et réfléchir mais c'est pas gagné A tout de suite |
Auteur: | philbob [ Dim 15 Jan 2012, 23:26 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonjour, @Totof Etape 1) Mesure On suppose que le potentiometre est alimenté entre Vcc et la masse. Vcc est la tension d'alim du µC, la masse est également celle du µC. Volume à fond, la sortie du potentiometre donne Vcc (pas d'atténuation). Volume au plus bas, la sortie du potentiometre est à 0V. Dans ces conditions, la mesure par l'ADC donnera un résultat compris entre 1023 pour Vcc et 0 pour 0V. Ce résultat est un entier de 10 bits stocké dans un mot de deux octets non signé déclaré avec le type uint16_t. Etape 2) Conversion en db Pour mémoire: niveau_db = 20 x log10 ( tension_mesurée / tension_reference ) Dans notre cas, la tension de référence est Vcc (soit 1023). Comme la fonction log10 prend un flottant comme argument, on doit convertir la valeur retournée par l'ADC en flottant. Pour éviter une erreur possible dans le cas ou la tension mesurée est nulle (log10(0)=-infini) on lui ajoute 1. La conversion ADC étant sur 10 bits, l'atténuation max mesurable va donc de 0 db à 60 db. Etape 3) Moyenne Pour éviter les fluctuations de la valeur affichée, on réalise une moyenne glissante sur 20 valeurs. La mesure se stabilise pour un nombre de cycles d'environ 5 fois la profondeur de la moyenne (un peu comme la charge d'une capa) soit ici 5x20=100 cycles. Un cycle représente la période d'arrivée des infos de la RC5 (soit 112mx). 100 cycles font approximativement 10 secondes. C'est le temps necessaire pour stabiliser une mesure qui passe de 0 à -60 db. C'est aussi le temps que met le ALPS à parcourir toute sa gamme. Etape 4) Affichage Rien ne sert d'afficher des décimales pour l'attenuation. Il faut prendre la valeur absolue de l'atténuation pour éviter les problemes d'affichage des entiers négatifs (ce n'est peut etre pas bien géré par les routines que tu as) Exemple de code: //------------------------------------------------------------------------------------- //routine de mesure //------------------------------------------------------------------------------------- uint16_t can_mesure(uint8_t voie,uint8_t noise_reduction) { volatile uint16_t res; //aden=0 arret ADCSRA &= ~_BV(ADEN); //multiplexage (choix de la voie) ADMUX=0+voie; //ADC noise reduction if (noise_reduction!=0) { MCUCR=16; } //aden=1 mise en route ADCSRA = 128+4+1; //debut conversion ADCSRA |= _BV(ADSC); //attente fin de conversion while ((ADCSRA & 64)!=0) { } //conversion res=ADCL+ADCH*256; return res; } //------------------------------------------------------------------------------------- int main(void) { uint16_t mes; float db; float dbmoy; uint8_t dbaff; dbmoy=0; sei(); while(1) { mes=can_mesure(0,1); db=20*log10(((float)mes+1.0)/1023.0); dbmoy=(dbmoy*19.0+db)/20.0; dbaff=(uint8_t)(fabs(dbmoy)); } return 0; } //------------------------------------------------------------------------------------- |
Auteur: | Totof [ Lun 16 Jan 2012, 00:13 ] | ||
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) | ||
Bonsoir Philbob J'ai lu et re-lu cet après midi et je suis arrivé à quelquechose de semblable mais pas aussi clair que toi j'essayerai ta routine demain J'ai du rajouter math.h pour les fonctions mathématiques et je suis parti sur une simple conversion dB ci-joint mon approche et une capture de l'affichage #include <avr/io.h> #include <util/delay.h> //------------------------------------------------------------------------------------- //mesure //------------------------------------------------------------------------------------- uint16_t can_mesure(uint8_t voie,uint8_t noise_reduction) { volatile uint16_t res; //aden=0 arret ADCSRA &= ~_BV(ADEN); //multiplexage (choix de la voie) ADMUX=0+voie; //ADC noise reduction if (noise_reduction!=0) { MCUCR=16; } //aden=1 mise en route ADCSRA = 128+4+1; //debut conversion ADCSRA |= _BV(ADSC); //attente fin de conversion while ((ADCSRA & 64)!=0) { } //conversion res=ADCL+ADCH*256; return res; } et ce que j'ai collé dans le préamp.c ... #include <math.h> ... uint16_t adc_result0; // Conversion ADC de la valeur lue sur le potentiomètre signed int i; float j,l; signed long k,m; signed char tampon[10]; ... // display the labels on LCD i = can_mesure(7); // read adc value at PA7 j = (float)((i+1)*5)/1023.0; k = (float)5/j; l = log(k); m = 10*l; sprintf(tampon,"%2d",m); dogm_gotoxy(11,1); dogm_puts("-"); dogm_gotoxy(12,1); dogm_puts(tampon); dogm_gotoxy(14,1); dogm_puts("dB"); C'est moins bien que ton code mais c'est ce que je suis arrivé à faire Faut maintenant que je trouve le moyen de mettre cet affichage en principal , qui revienne comme l'affichage de la source en fait avec ton code ou une évolution du miens si il y a besoin Bonne nuit et encore merci pour ton aide et explications
|
Auteur: | Totof [ Lun 16 Jan 2012, 00:18 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Une tite question avant d'aller dormir je lirai la réponse demain matin ta routine avec l'interruption peut elle être insérer dans le même main que l'interruption RC5 Bonne nuit |
Auteur: | philbob [ Lun 16 Jan 2012, 06:36 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonjour, @Totof Insertion: Normalement oui mais je n'en vois pas réellement l'intérêt. Perso, je logerais la mesure dans la boucle while(1) du main, juste après la lecture du RC5. Pour l'affichage, cela se fera naturellement dans la partie gestion du LCD. |
Auteur: | Totof [ Lun 16 Jan 2012, 07:09 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonjour Reste plus qu'a essayer ta routine alors Et ensuite un bon nettoyage du préamp.c , car il reste des {} inutiles je pense, une bonne édition papier et un stylo feront un bon début Bonne journée |
Auteur: | Totof [ Mar 17 Jan 2012, 07:40 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonjour @ Philbob j'ai essayé de rentrer ta routine encapsulé dans le while sous l'interruption du RC5 sûrement pas au bon endroit de plus j'arrive pas à la faire fonctionner Bref faut que je creuse et comprenne encore pas mal de truc Une t'ite question pour dégrossir puis je mettre cette routine dans mon fichier read.c et récupérer la donnée dans mon fichier preamp.c un peu comme la routine RC5 en fait une sorte de read.data Autre détail , j'arrive à faire fonctionné cette partie de la formule comme ceci mais pas la suite avec la moyenne glissante quand je rajoute les lignes , le µc tourne en rond comme si il n'arrivait pas à trouver la valeur signed int r; // Conversion ADC de la valeur lue sur le potentiomètre float j,l; // signed long k,m; // r = can_mesure(7); // read adc value at PA7 j = (float)((r+1)*5)/1023.0; k = (float)5/j; l = log10(k); m = 20*l; ici le m me donne bien la valeur en dB Bref plein de question ce que je comptais faire comme ajout au fichier read.c // ma version revisitée avec Philbob int read(void) { signed int i; // Conversion ADC de la valeur lue sur le potentiomètre float j,l; // signed long k,m; // float dbmoy; uint8_t dbaff; dbmoy=0; while(1) { i = can_mesure(7); // read adc value at PA7 j = (float)((i+1)*5)/1023.0; k = (float)5/j; l = log10(k); m = 20*l; dbmoy=(dbmoy*19.0+m)/20.0; dbaff=(uint8_t)(fabs(dbmoy)); } return 0; } A ce soir |
Auteur: | Totof [ Sam 21 Jan 2012, 10:20 ] | |||||||
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) | |||||||
Bonjour Après quelques jours studieux à décortiquer le languauge C propre au AVR de Atmel j'ai peauffiné mon projet ci-joint 4 captures une paire pour illustrer la version avec lecture du volume sous forme de bargraphe solution "visuelle" une paire pour illustrer la version en pourcent j'ai choisi les % plustôt que les dB car en dB on obtiens une profondeur de -60 à 0 en % de 0 à 100 donc la plage plus grande me conviens mieux je me tâte entre ces 2 version maintenant , de plus le potar ALPS est un log donc ça bouge faiblement au début puis plus rapidement à la fin En archive les fichiers complet à jour (21/01/2012) sous Kicad et Kontrollerlab donc toutes les sources mises à dispo Si quelqu'un serait tenter ou voudrait un coup de main pour modifier faire signe Je vais passer aux essai en réel sur le système dès que j'ai fini de souder les quelques composants manquant Bonne lecture Un grand merci à Philbob et à Wismerhill pour leurs aides et pour les idées
|
Auteur: | Totof [ Sam 21 Jan 2012, 17:55 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonsoir Après vérification et test de la platine relais une erreur s'est glissée dans le fichier préamp_xxxxx.c à la ligne 159 , le code hexadecimal doit être 0X7E à la place de 0X7F la ligne correcte DDR(SOURCE_PORT) = 0x7E; en fait comme la logique de fonctionnement du relais mute est l'inverse de celle des relais source il faut 01111110 à la place de 01111111 voilà rien de grave mais faut le corriger Tout commentaire sur le montage est le bienvenu |
Auteur: | Totof [ Sam 21 Jan 2012, 23:59 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonsoir Amélioration du soir ===> espoir vu que l'on peut modifier le potentiomètre manuellement , j'ai rajouter 3 lignes pour mettre à jour l'affichage de la lecture du volume à placer à la ligne 348,349 et 350 du fichier préamp_bargraphe.c par exemple if(src_dbcnt == SWITCH_LONG_PUSH) // en cas d'appui long sur le bouton source, mise à jour // de l'affichage du volume, mouvement manuel du potentiomètre par exemple vol_stat_dsp = 1; En faisant un appui long sur le bouton source ont met à jour l'affichage Bonne nuit |
Auteur: | WismerHill [ Dim 22 Jan 2012, 08:27 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Totof a écrit: En faisant un appui long sur le bouton source ont met à jour l'affichage Ca craint ! Il faudrait que tu fasse une mesure à chaque cycle, que tu la compares avec la valeur affiché et que tu met à jour si l’écart est de plus d'une unité. 1% si tu es en %, 1 db si t'es en db... |
Auteur: | Totof [ Dim 22 Jan 2012, 09:21 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Bonjour Wismerhill Ah oui bonne idée ça Mettre comme le disait Philbob , une lecture du volume dans le while 1° stocker la valeur du potar au démarrage 2° passer si la valeur reste identique à la relecture 3° mettre à jour l'affichage si différent je regarde ça après les obligations dominicales |
Auteur: | WismerHill [ Dim 22 Jan 2012, 09:39 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Totof a écrit: 2° passer si la valeur reste identique à la relecture La valeur bouge en permanence. Vaut mieux mettre en place un petit hystérésis de manière à ne pas calculer ton log et balancer des données à l'afficheur pour rien.
|
Auteur: | Totof [ Dim 22 Jan 2012, 10:08 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Hystérésis tu parle d'un écart à rajouter à la consigne avant de bouger l'affichage si oui c'est en cours d'essai après essai et vérif je post A plus |
Auteur: | WismerHill [ Dim 22 Jan 2012, 10:42 ] |
Sujet du message: | Re: Ajout d'une télécommande sur un ampli (ou un préamp) |
Oui c'est ça. |
Page 8 sur 10 | Heures au format UTC + 1 heure |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |