Sub Ampli DSP
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Après de longues heures à tenter de configurer l’ADC synchronisé sur la PWM, j’ai +- tout recommencé.
Le but du jeu est donc de configurer des registres pour faire fonctionner comme on le désire les périphériques de ce µC.
Pour beaucoup de ces registres, c’est du binaire.
Par exemple mettre un timer en route, on va dans la doc du µC et l’on y trouve le registre SCT control et le bit 2 qui à 1 stoppe le timer.
Il suffit de le mettre à zéro.
Mais le langage C a un très gros manque pour nos µC, il ne traite pas directement le binaire.
Il faut donc lire le registre, faire un AND sur tous les bits sauf le bit 2.
On peut prendre sa calculette de conversion ou écrire : LPC_SCT0->CTRL_U &= ~(1 << 2);
LPC_SCT0->CTRL_U indique le registre, le & avant = simplifie juste l’écriture qui correspond à LPC_SCT0->CTRL_U = LPC_SCT0->CTRL_U & ~(1 << 2);
Le ~ signal inverse et le (1<<2) signale la valeur 1 décalée à gauche de 2.
Peut paraitre compliqué, mais 1 est la valeur et 2 la position du bit, ce qui correspond à 100 en binaire soit 4 en décimal.
Évidemment c’est peu digeste lorsque l’on n’a pas l’habitude d’où l’idée de NXP de créer des lib bien plus causantes avec OpenLPC.
Voici la même chose avec OpenLPC : Chip_SCTPWM_Start(SCT_PWM);
Une simple fonction qui au final fait le même code par petits jeux de passe-passe avec le compilateur.
C’est donc tentant, mais pas pratique du tout car l’on s’éloigne complètement de la doc et l’on est très vite perdu et sans aucune maitrise de ce que l’on faire.
Bref ça fonctionne.
Le but du jeu est donc de configurer des registres pour faire fonctionner comme on le désire les périphériques de ce µC.
Pour beaucoup de ces registres, c’est du binaire.
Par exemple mettre un timer en route, on va dans la doc du µC et l’on y trouve le registre SCT control et le bit 2 qui à 1 stoppe le timer.
Il suffit de le mettre à zéro.
Mais le langage C a un très gros manque pour nos µC, il ne traite pas directement le binaire.
Il faut donc lire le registre, faire un AND sur tous les bits sauf le bit 2.
On peut prendre sa calculette de conversion ou écrire : LPC_SCT0->CTRL_U &= ~(1 << 2);
LPC_SCT0->CTRL_U indique le registre, le & avant = simplifie juste l’écriture qui correspond à LPC_SCT0->CTRL_U = LPC_SCT0->CTRL_U & ~(1 << 2);
Le ~ signal inverse et le (1<<2) signale la valeur 1 décalée à gauche de 2.
Peut paraitre compliqué, mais 1 est la valeur et 2 la position du bit, ce qui correspond à 100 en binaire soit 4 en décimal.
Évidemment c’est peu digeste lorsque l’on n’a pas l’habitude d’où l’idée de NXP de créer des lib bien plus causantes avec OpenLPC.
Voici la même chose avec OpenLPC : Chip_SCTPWM_Start(SCT_PWM);
Une simple fonction qui au final fait le même code par petits jeux de passe-passe avec le compilateur.
C’est donc tentant, mais pas pratique du tout car l’on s’éloigne complètement de la doc et l’on est très vite perdu et sans aucune maitrise de ce que l’on faire.
Bref ça fonctionne.
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Voici la mesure du courant par l’ADC.
En bas sortie du capteur, c’est bien bruité avec plein de résidus du 100KHz de la PWM.
En haut le signal lu par l’ADC de manière synchrone à 100KHz, moyennée pour ressortir sur le DAC à 10KHz de fréquence de sampling.
C’est toujours bien bruité, mais je pense que cela vient en très grande partie que tout est bruité vu que j’ai des fils dans tous les sens.
En bas sortie du capteur, c’est bien bruité avec plein de résidus du 100KHz de la PWM.
En haut le signal lu par l’ADC de manière synchrone à 100KHz, moyennée pour ressortir sur le DAC à 10KHz de fréquence de sampling.
C’est toujours bien bruité, mais je pense que cela vient en très grande partie que tout est bruité vu que j’ai des fils dans tous les sens.
- alka
- Administrateur du site
- Messages : 2908
- Enregistré le : mer. 15 juil. 2015 15:18
- Localisation : 92
- Contact :
Re: Sub Ampli DSP
bah du bruit au dessus de 10kHz pour un sub, tu même le laisser. le HP filtrera
acheter un DSPiy ? c'est ici
Re: Sub Ampli DSP
Super
La suite c'est quoi ?
La suite c'est quoi ?
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Bonne question
Un peu voir ce qu'il est possible de faire au niveau CR et disposer de quelques routines pouvant faire un peu de tout.
Faudra par exemple aussi lire l'I2S.
Après il faudrait bien faire un proto pour avoir moins de problèmes de bruits en tous sens.
Un peu voir ce qu'il est possible de faire au niveau CR et disposer de quelques routines pouvant faire un peu de tout.
Faudra par exemple aussi lire l'I2S.
Après il faudrait bien faire un proto pour avoir moins de problèmes de bruits en tous sens.
Re: Sub Ampli DSP
D'ailleurs je ne me rappelle plus ce qui a été choisi pour la conversion I2S --> PWM ?
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
C'est aussi le rôle du µC.
Je pense partir sur l'interface SPI + une GPIO pour le LRCLK.
En fait je devrais voir comment adapter le SPI à l'I2S et au besoin je peux modifier l'I2S coté DSPiy.
Je pense partir sur l'interface SPI + une GPIO pour le LRCLK.
En fait je devrais voir comment adapter le SPI à l'I2S et au besoin je peux modifier l'I2S coté DSPiy.
Re: Sub Ampli DSP
Ok !
Tu as beaucoup de liberté sur le I2S côté dspiy, à part Left-Justified ou Right-Justified ?
Tu as beaucoup de liberté sur le I2S côté dspiy, à part Left-Justified ou Right-Justified ?
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Oui, la polarité des horloges, définir LRCLK comme en I2S à 1 pour un canal et à 0 pour l'autre ou par pulse et aussi la longueur des datas 16,24 ou 32 bits.
Re: Sub Ampli DSP
Par rapport au LRCLK, comment ça se passe en I2S pour du mono canal ? Car ça sera le cas pour un caisson, non ? Le LRCLK reste le même et un coup on envoie des datas, et quand LRCLK change on envoie rien ?
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Je pense, oui.
L'I2S n'est pas prévu pour du mono donc pas trop de choix.
L'I2S n'est pas prévu pour du mono donc pas trop de choix.
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Maintenant que j'ai un retour du signal de sortie, faut en faire quelque chose.
voici le code, rien de bien compliqué :
Ce qui donne :
contre ceci sans correction :
Il y a une différence, c'est déjà un début.
En Violet la sortie sonde de courant, en jaune le signal nommé "val" et en rouge une FFT.
Le signal de base est du 100Hz, on voit bien le 300Hz qui a diminué, par contre du 200Hz à augmenté.
Des suggestions de tests avec du calcul un peu plus intelligent ?
voici le code, rien de bien compliqué :
Code : Tout sélectionner
ns=nsample; //sauve nsample
nsample=0;
Generate_Sine (&Tone);
signal=tval>>16;
if(signal==0)Chip_GPIO_SetPinToggle(LPC_GPIO, 1, 9);//trigger
v=0;
for(n=1;n<ns-1;n++) v=v+ADC_DR_RESULT(rawSample[n]);//add samples de 2 à n-1
v=v/(ns-2);//moyenne
imesure=2048-v;//enlève offset adc
val=signal*5-imesure;
signal=signal+val/6;
signal=signal+360;//rajoute offset
// dutycycle
LPC_SCT0->MATCHREL[1].U =signal;
LPC_SCT0->MATCHREL[2].U =signal;
Chip_DAC_UpdateValue(LPC_DAC, val*6+2048);
Ce qui donne :
contre ceci sans correction :
Il y a une différence, c'est déjà un début.
En Violet la sortie sonde de courant, en jaune le signal nommé "val" et en rouge une FFT.
Le signal de base est du 100Hz, on voit bien le 300Hz qui a diminué, par contre du 200Hz à augmenté.
Des suggestions de tests avec du calcul un peu plus intelligent ?
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Merci pour les suggestions ...
Je suis passé à plus sérieux, la PID.
Non plus une correction à la fréquence de sampling mais à la fréquence de PWM.
Voici le code de l'interrupt de l'ADC qui est synchro avec la PWM:
Il prend 2,2µS sur le 10 de disponibles.
Et un premier résultat pas si mal pour un début, le tout étant de trouver les bons coefficients de la PID.
Par contre c'est bruité, c'est une belle pointe vers 4.3kHz
Sans rapport direct, vais un peu voir au niveau des biquads ce que l'on peut faire, NXP a créer une lib pour.
Je suis passé à plus sérieux, la PID.
Non plus une correction à la fréquence de sampling mais à la fréquence de PWM.
Voici le code de l'interrupt de l'ADC qui est synchro avec la PWM:
Code : Tout sélectionner
v=Chip_ADC_GetDataReg(LPC_ADC1, 1);
v=2048-ADC_DR_RESULT(v);
verreur=signal-v;
//integrale
if(!sature)
{
inte=inte+verreur;
if(inte>intemax)inte=intemax;
if(inte<-intemax)inte=-intemax;
}
//deriv
deriv=verreur-pverreur;
pverreur=verreur;
//PID
outp=(kp*verreur)/100+(ki*inte)/100+(kd*deriv)/100;
//limiteur
if(outp>outpmax){outp=outpmax;sature=1;}
else if(outp<-outpmax){outp=-outpmax;sature=1;}
else sature=0;
//mise à +- 360
outp=outp>>2;
outp=outp+360;
//pwm
LPC_SCT0->MATCHREL[1].U =outp;
LPC_SCT0->MATCHREL[2].U =outp;
Chip_DAC_UpdateValue(LPC_DAC, verreur+2048);//pour oscillo
Il prend 2,2µS sur le 10 de disponibles.
Et un premier résultat pas si mal pour un début, le tout étant de trouver les bons coefficients de la PID.
Par contre c'est bruité, c'est une belle pointe vers 4.3kHz
Sans rapport direct, vais un peu voir au niveau des biquads ce que l'on peut faire, NXP a créer une lib pour.
- alka
- Administrateur du site
- Messages : 2908
- Enregistré le : mer. 15 juil. 2015 15:18
- Localisation : 92
- Contact :
Re: Sub Ampli DSP
qu'est ce que tu veux qu'on te suggère pour l'instant ? t'es toujours sur charge résistive donc pas grand chose a corriger
tu mesures bien le courant sur une résistance de pied ?
si oui, tu pourrais t'amuser a faire un ampli en courant.
perso, je comprend toujours pas grand chose a ton implémentation et encore moins au code. Ca manque d'un dessin pédagogique pour les noobs
tu mesures bien le courant sur une résistance de pied ?
si oui, tu pourrais t'amuser a faire un ampli en courant.
perso, je comprend toujours pas grand chose a ton implémentation et encore moins au code. Ca manque d'un dessin pédagogique pour les noobs
acheter un DSPiy ? c'est ici
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Il y a pas mal à corriger, les imperfections de l’étage de puissance, mais aussi le fait que la PWM à une résolution de 720 points.
Pas une résistance de pied, j’avais d’ailleurs fait un dessin pédagogique, mais un capteur de courant à effet Hall.
Sinon pas grand-chose à dessiner sur le fonctionnement, car avec un µC on fait ce que l’on veut dans les limites des mesures et des ressources.
Par exemple la PID, en analogique c’est 3 ou 4 AOP, ici les quelques lignes de code ci-dessus.
Pas une résistance de pied, j’avais d’ailleurs fait un dessin pédagogique, mais un capteur de courant à effet Hall.
Sinon pas grand-chose à dessiner sur le fonctionnement, car avec un µC on fait ce que l’on veut dans les limites des mesures et des ressources.
Par exemple la PID, en analogique c’est 3 ou 4 AOP, ici les quelques lignes de code ci-dessus.
- alka
- Administrateur du site
- Messages : 2908
- Enregistré le : mer. 15 juil. 2015 15:18
- Localisation : 92
- Contact :
Re: Sub Ampli DSP
ah oui, le capteur effet hall j'avais oublié mais ca change rien.
j'essaie de comprendre : corrige moi si je me trompe. je fais le dessin textuel
résumé des épisodes précédents :
tu as un µC connecté a des transistors de puissance, alimentés par une alim costaud et branchés sur une résistance de puissance qui fait office de charge.
Je suppose qu'il y aun filtre analogique pour filtrer la pwm. il est commet ce filtre ?
T'as un capteur en courant (hall) qui mesure le courant qui passe dans la charge.
le µC reçoit en entrée l'info de ce capteur hall.
Il y a aussi un dac quelquepart dont je suis pas sur du role. Seulement pour les tests ?
tests :
Tes tests pour l'instant consistent a générer un sinus dans le µC, a en faire une PWM qui sort sur les transistors.
Je devine que l'oscillo montre la sinusoide générée par le µC (sort sur un dac ?) et de l'autre ce qui est présent sur la charge.
Ton code exploite le retour du capteur hall et tu fais des triturages, comme par exemple un pid.
Et tu cherches quels autres triturages tu pourrais faire.
Le pid a lui seul est un vaste domaine. Je devine que dérivée et intégration que tu utilise sont des approximations linéaires (1er degré). C'est le plus simple et ca peut suffir. Choisir les coeffs en revanche c'est tout un chapitre pour aboutir a une correction utile selon le profil des erreurs.
Pour les suggestions :
pour un sub, on a besoin
- ampli puissant, fiable et qui distord pas trop
- filtre infra
- corrections de pièce
- limiteur pour protéger le HP
- protection continu du HP
- interface utilisateur
si on veut asservir
- gérer le retour du (ou des) capteur(s) et traiter l'erreur
Implémenter des biquads est une bonne idée car utile pour plein de choses.
Calculer la valeur RMS du signal serait sans doute utile aussi.
Savoir segmenter des bandes de fréquence pour appliquer des traitements ciblés.
j'essaie de comprendre : corrige moi si je me trompe. je fais le dessin textuel
résumé des épisodes précédents :
tu as un µC connecté a des transistors de puissance, alimentés par une alim costaud et branchés sur une résistance de puissance qui fait office de charge.
Je suppose qu'il y aun filtre analogique pour filtrer la pwm. il est commet ce filtre ?
T'as un capteur en courant (hall) qui mesure le courant qui passe dans la charge.
le µC reçoit en entrée l'info de ce capteur hall.
Il y a aussi un dac quelquepart dont je suis pas sur du role. Seulement pour les tests ?
tests :
Tes tests pour l'instant consistent a générer un sinus dans le µC, a en faire une PWM qui sort sur les transistors.
Je devine que l'oscillo montre la sinusoide générée par le µC (sort sur un dac ?) et de l'autre ce qui est présent sur la charge.
Ton code exploite le retour du capteur hall et tu fais des triturages, comme par exemple un pid.
Et tu cherches quels autres triturages tu pourrais faire.
Le pid a lui seul est un vaste domaine. Je devine que dérivée et intégration que tu utilise sont des approximations linéaires (1er degré). C'est le plus simple et ca peut suffir. Choisir les coeffs en revanche c'est tout un chapitre pour aboutir a une correction utile selon le profil des erreurs.
Pour les suggestions :
pour un sub, on a besoin
- ampli puissant, fiable et qui distord pas trop
- filtre infra
- corrections de pièce
- limiteur pour protéger le HP
- protection continu du HP
- interface utilisateur
si on veut asservir
- gérer le retour du (ou des) capteur(s) et traiter l'erreur
Implémenter des biquads est une bonne idée car utile pour plein de choses.
Calculer la valeur RMS du signal serait sans doute utile aussi.
Savoir segmenter des bandes de fréquence pour appliquer des traitements ciblés.
acheter un DSPiy ? c'est ici
- thierryvalk
- Administrateur du site
- Messages : 3523
- Enregistré le : jeu. 9 juil. 2015 20:08
- Localisation : Belgique
Re: Sub Ampli DSP
Ah mais oui mais non, je demande des solutions et voilà que tu me colle 3 mois de travail.
Le capteur effet hall n’est pas comme une résistance de pied. On est sur un pont complet et dans ce cas une résistance de pied ne mesure pas tout.
Ok avec ton résumé, oui, le DAC sert aux tests uniquement, on y met ce que l’on veut et permet de voir ce qui se passe en dynamiques sur l'oscillo.
Le filtre en sortie du pont est une vraie misère, une self torique que j'avais et rien d'autre.
Faudrait calculer ce qu'il faut comme self et RC.
Tests : le signal sur l’oscillo est la mesure en courant (violet) et le DAC (jaune).
Pour la tension je dois prendre un autre oscillo avec entrées isolées vu que l’on est en config bridgée.
Ca veut dire quoi premier degré ?
C’est de la simple PID, calculs en nombres réels, mais je vais tester en float.
Pour le coefs, oui c’est au pif, une méthodoligie serait mieux même si pour le moment ce n’est que tester ce qui est faisable.
En math je suis + que limité, c'est là que l'appelle à l'équipe peut faire avancer vers le trésor.
Pour tes suggestions :
Un ampli puissant : en classe D, suffit de mettre des transistors quif quif coteaux.
Fiable : on en reparlera.
Qui distor pas trop : c’est bien aussi le rôle du µC et du feedback de résoudre ce problème.
Pour le reste, me semble simple et si nécessaire, comme pour la correction de la pièce, on fait appel au DSPiy.
Interface utilisateur : je sais que je peux compter sur toi.
Asservir : ce n’est qu’un feedback pris à un autre endroit en adaptant les paramètres et coefs.
Pour les biquads, oui mais pas trop, on est en cortex-M3 qui n’a pas d’instructions dédiées DSP.
Calculer le RMS me parait simple.
Segmenter des bandes de fréquences c’est de la FFT, possible, mais pas certain d’être en temps réel.
Je découvre aussi et pas trop d’idée des performances réelle ce genre de µC dans ce type d’application, c’est tout l’intérêt et le chalenge de ce projet.
Faire un max avec le moins, certainement possible si fait intelligemment.
Le capteur effet hall n’est pas comme une résistance de pied. On est sur un pont complet et dans ce cas une résistance de pied ne mesure pas tout.
Ok avec ton résumé, oui, le DAC sert aux tests uniquement, on y met ce que l’on veut et permet de voir ce qui se passe en dynamiques sur l'oscillo.
Je suppose qu'il y aun filtre analogique pour filtrer la pwm. il est commet ce filtre ?
Le filtre en sortie du pont est une vraie misère, une self torique que j'avais et rien d'autre.
Faudrait calculer ce qu'il faut comme self et RC.
Tests : le signal sur l’oscillo est la mesure en courant (violet) et le DAC (jaune).
Pour la tension je dois prendre un autre oscillo avec entrées isolées vu que l’on est en config bridgée.
Je devine que dérivée et intégration que tu utilise sont des approximations linéaires (1er degré).
Ca veut dire quoi premier degré ?
C’est de la simple PID, calculs en nombres réels, mais je vais tester en float.
Pour le coefs, oui c’est au pif, une méthodoligie serait mieux même si pour le moment ce n’est que tester ce qui est faisable.
En math je suis + que limité, c'est là que l'appelle à l'équipe peut faire avancer vers le trésor.
Pour tes suggestions :
Un ampli puissant : en classe D, suffit de mettre des transistors quif quif coteaux.
Fiable : on en reparlera.
Qui distor pas trop : c’est bien aussi le rôle du µC et du feedback de résoudre ce problème.
Pour le reste, me semble simple et si nécessaire, comme pour la correction de la pièce, on fait appel au DSPiy.
Interface utilisateur : je sais que je peux compter sur toi.
Asservir : ce n’est qu’un feedback pris à un autre endroit en adaptant les paramètres et coefs.
Pour les biquads, oui mais pas trop, on est en cortex-M3 qui n’a pas d’instructions dédiées DSP.
Calculer le RMS me parait simple.
Segmenter des bandes de fréquences c’est de la FFT, possible, mais pas certain d’être en temps réel.
Je découvre aussi et pas trop d’idée des performances réelle ce genre de µC dans ce type d’application, c’est tout l’intérêt et le chalenge de ce projet.
Faire un max avec le moins, certainement possible si fait intelligemment.
- alka
- Administrateur du site
- Messages : 2908
- Enregistré le : mer. 15 juil. 2015 15:18
- Localisation : 92
- Contact :
Re: Sub Ampli DSP
j'ai a peu près compris donc et j'ai aussi compris que t'as un mois de décembre a occuper
faut améliorer le filtre de sortie de l'ampli parce que ça fausse peut etre le feedback. Elle pas grande la freq pwm, faut un bon filtre et surement aussi un zobel (ce que tu appelles le RC peut etre)
TI explique tout et donne les formules de calcul : www.ti.com/lit/an/sloa119b/sloa119b.pdf
la sonde effet hall est précise ? je connais pas du tout.
l'intégration et dérivation linéaire je parle pas de la précision de calcul mais de l'approximation a une opération simple : intégration = addition et dérivée = soustraire la valeur précédente de la valeur courante. Ca revient a considérer que le bout de courbe entre les deux points est une droite. C'est acceptable vu le contexte.
Pourquoi ne pas tenter une contre réaction simple :
IN = signal entrée
RETOUR= retour de la sonde (ca marche car t'es sur une charge résistive et donc courant / tension = constante)
et tu amplifies [IN - k*RETOUR] avec k a définir.
faut améliorer le filtre de sortie de l'ampli parce que ça fausse peut etre le feedback. Elle pas grande la freq pwm, faut un bon filtre et surement aussi un zobel (ce que tu appelles le RC peut etre)
TI explique tout et donne les formules de calcul : www.ti.com/lit/an/sloa119b/sloa119b.pdf
la sonde effet hall est précise ? je connais pas du tout.
l'intégration et dérivation linéaire je parle pas de la précision de calcul mais de l'approximation a une opération simple : intégration = addition et dérivée = soustraire la valeur précédente de la valeur courante. Ca revient a considérer que le bout de courbe entre les deux points est une droite. C'est acceptable vu le contexte.
Pourquoi ne pas tenter une contre réaction simple :
IN = signal entrée
RETOUR= retour de la sonde (ca marche car t'es sur une charge résistive et donc courant / tension = constante)
et tu amplifies [IN - k*RETOUR] avec k a définir.
acheter un DSPiy ? c'est ici
Retourner vers « DSPiy général »
Qui est en ligne
Utilisateurs parcourant ce forum : Majestic-12 [Bot] et 8 invités