IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Comment faire une pause de 100 nano seconde en C ?


Sujet :

Raspberry Pi

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut Comment faire une pause de 100 nano seconde en C ?
    Bonjour voici un test rapide de pause d'une miliseconde avec le pico2:

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include "pico/stdlib.h"
     
    const int sleep_time = 1;
     
    int main() {
        const uint LED_PIN = 0; // GPIO25
        gpio_init(LED_PIN);
        gpio_set_dir(LED_PIN, GPIO_OUT);
        while (true) {
            gpio_put(LED_PIN, 1);
            sleep_ms(sleep_time);
            gpio_put(LED_PIN, 0);
            sleep_ms(sleep_time);
        }
    }
    le type de sleep_time étant un int, comment faire pour avoir les nano ou microseconde ?
    j'ai essayé en mettant "0.1" mais comme ce n'est pas un INT je suis bloqué en gpio mesurer à l'oscilloscope à 500 hz.
    merci d'avance pour la réponse

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Salut,

    Tu remplaces ms par us dans les noms des fonctions et tu devrais avoir l'équivalent en microsecondes.

    Pour avoir de la nanoseconde, il faudrait une horloge à 1000 MHz, ce n'est pas le cas des pi pico (133/150 MHz). 1/133.106=7,52 ns. Je suppose que pour avoir ces durées-là, il faut passer par de l'assembleur (opération nop).

  3. #3
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 598
    Par défaut
    Bonjour,

    D'accord avec f-leb pour la nano seconde. Même avec une horloge à 1 GHz, la précision à la ns resterait illusoire car le temps d'appel de la fonction de délai prendrait déjà plusieurs ns, voire plusieurs dizaines de ns.

    Il faudrait intégrer ce temps d'appel pour diminuer d'autant le délai passé en argument. Mais pas simple de savoir de combien : réitérer et inverser l'état d'une broche puis observer la fréquence ? mais le temps d'appel sera allongé du temps de boucle et de basculement d'état.

    Cela me rappelle ce que disait un responsable des comptes d'écarts d'une grande entreprise : "nos comptes sont précis au centimes et faux au milliard". Précision et exactitude sont loin d'être synonymes

    Salutations

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    Merci de ces réponses.
    comme j'ai des difficulté à faire de l'assembleur je m'était essayer au C , mais je doutais qu'il me resté avec l'assembleur si je veux descendre en dessous du micro-seconde voir du nano seconde (pour une mesure précise d'une charge de bobine de découpage ..)
    j'ai essayé une solution alternative en faisant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include "pico/stdlib.h"
    
    int main() {
        const uint LED_PIN = 0; // GPIO25
        gpio_init(LED_PIN);
        gpio_set_dir(LED_PIN, GPIO_OUT);
        while (true) {
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
            gpio_put(LED_PIN, 1);
    
    
    
            gpio_put(LED_PIN, 0);
            sleep_ms(1);
        }
    }
    voici ce que j'obtient:

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par keokaz Voir le message
    voici ce que j'obtient:
    Quel rapport avec le programme C que tu as posté ?

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 250
    Par défaut
    Bonjour,

    Citation Envoyé par keokaz Voir le message
    voici ce que j'obtient:
    Il y a un problème de mesure/instrument ou alors tu ne mesures pas la broche de sortie de ton pico ?

    - Une sonde en x1 à une bande passante très limitée, par exemple mes sondes d'oscillo 200MHz en x10 ne font plus que 6MHz en x1.
    - Il faut aussi vérifier la bande passante de l'oscillo lui même pour voir si elle est compatible avec la mesure.
    - Il faut également un taux d'échantillonnage adapté pour mesurer des signaux aux front raides (signaux carrés) sinon tu vas mesurer une sinus (voir le spectre d'un signal carré)
    - Il ne faut pas qu'il y ait une LED sur la GPIO car celle-ci étant capacitive, elle va faire une superbe filtre passe bas sur ta mesure.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci des réponses, mon oscilloscope a une bande passante de 60Mhz (ce n'est pas de la marque, en plus ayant acheté des sondes de chine pas cher j'ai constaté que par rapport à une autre sonde d'orgine la mesure n'était pas tout à fait pareille) ,comme tu l'a fait remarqué je ne sais pas si 60Mhz avec une sonde X1 est suffisant pour ce que je veux faire et comme tu l'a mentionner x10 c'est encore moins de bande passante..,

    pour le moment je ne me suis pas concentré sur la qualité de me mesure mais de pouvoir faire un programme qui puisse être suffisant rapide pour mesurer la tension de monté d'une charge d'une bobine de courant de transformateur à découpage.

    A la prise en main de mon pico2 je me suis dit que pour faire ces gendre de chose il me faut passé par de la programmation en pur assembleur, mais vu que je n'avance pas bien, j'ai testé directement en C.

    https://www.developpez.net/forums/d2...io-assembleur/

    comme dans le C il n'y pas de "fonction" en nano seconde et qu'il n'est pas possible de divisé la milliseconde par "X", j'ai juste essayé de mesurer une impulsion de mise à 1 d'un port GPIO si j'arrive à obtenir 10 nano seconde c'est peut être faisable vu la réponse du calcul (1/133.106=7,52 ns) 7.2ns seconde.

    Ensuite je me suis dis qu'il faut que j'ai plus qu'a faire des calcul pour obtenir une base de temps pour ensuite calculer en Henry la valeur de la bobine du transformateur que j'utilise.

    Mon but final c'est de pouvoir commander au bon moment la fermeture et l'ouverture de commande de transistor à découpage.

  8. #8
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 250
    Par défaut
    Citation Envoyé par keokaz Voir le message
    x10 c'est encore moins de bande passante..,
    x10 c'est beaucoup plus de bande passante. De manière générale on n'utilise une sonde en x1 que dans des cas précis : signaux très très faibles et impédance de la source assez faible (qui peut délivrer du courant donc).

    Citation Envoyé par keokaz Voir le message
    Mon but final c'est de pouvoir commander au bon moment la fermeture et l'ouverture de commande de transistor à découpage.
    Les alimentations à découpage n'utilisent pas de fréquence aussi haute, ça ne fonctionnerait pas d'ailleurs (effet de peau qui augmenterait la résistance apparente des fils, augmentations des pertes dans le transistor, problème de couplage), c'est quelques dizaines de kHz à quelques MHz tout au plus.

    Mettre une alim à découpage au point c'est pas facile et il faut faire des bonnes mesures. C'est quoi comme alim à découpage ? Flyback j'imagine puisque tu veux découper le primaire d'un transfo ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/12/2009, 00h36
  2. [VBA]Comment faire une pause
    Par Thierry'' dans le forum VBA Access
    Réponses: 14
    Dernier message: 14/04/2007, 14h42
  3. comment faire une pause
    Par delavega dans le forum ASP
    Réponses: 1
    Dernier message: 19/02/2007, 23h58
  4. [console]Comment faire une pause?
    Par aminee009 dans le forum MFC
    Réponses: 5
    Dernier message: 20/10/2005, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo