Arduino puls generator

Projecten die niet passen in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Arduino puls generator

Berichtdoor Gij Kieken » 08 Feb 2017, 15:07

Om schakelingen te testen heb ik regelmatig een puls generator nodig,gewoonlijk gebruik ik daar een Lf-generator voor.Nu dacht ik bij mezelf waarom geen Nano, mits een kleine aanpassing (potmeter voor de puls breedte en of puls pauze toevoegen)en klaar.
De code komt hier van het forum een vroegere post van Nico.
Om te starten met de basis heb ik gewoon eerst even de scoop gezet op de Nano met onderstaande code.
De code compileert feilloos, echter bij de meting op output 3 & 4 stel ik vast dat beide uitgangen nagenoeg hetzelfde symmetrische signaal (duty cycle +-50%)geven met een frequentie van +-22Khz.
Mijn eerste gedacht was de Nano rekent wat te lang met micros, dan de sketch aangepast naar millis alsook de waarden.
Blijft het zelfde resultaat, de uitgangen geven beiden een signaal van totale pulsbreedte +-45µseconden.
De vraag is kan een Atmega dit rekenen wel aan of moet ik direct naar de registers schrijven om alles wat vlugger te laten lopen?

Code: Alles selecteren
#include "Arduino.h"
//
// Pin definitions
//
#define PULSE_33    3           // pulse 33 <span class="posthilit">Hz</span> op pin 3
#define PULSE_670   4           // pulse <span class="posthilit">670</span> <span class="posthilit">Hz</span> op pin 4
 
//
// global defines & parameters
//
#define HZ_33_H     20303       // 20303 micro seconden voor de 33 <span class="posthilit">Hz</span> Hoog duur
#define HZ_33_L     10000       // 10000 micro seconden voor de 33 <span class="posthilit">Hz</span> Laag duur
#define HZ_670_H    493         // 493 micro seconden voor de <span class="posthilit">670</span> <span class="posthilit">hz</span> Hoog duur
#define HZ_670_L    1000        // 1000 micro seconden voor de <span class="posthilit">670</span> <span class="posthilit">hz</span> Laag duur
 
enum {
    laag,                       // simpele verwijzing naar array indices
    hoog
};
 
enum {
    Hz_33,                      // verwijst naar de 33 <span class="posthilit">Hz</span> waarden
    Hz_670                      // verwijst naar de <span class="posthilit">670</span> <span class="posthilit">Hz</span> waarden
};
 
//
// global variables
//
uint32_t timer1;                // timer voor de 33 <span class="posthilit">Hz</span>
uint32_t timer2;                // timer voor de <span class="posthilit">670</span> <span class="posthilit">Hz</span>
uint32_t timerWaarden[2][2];    // bevat de tijdsduur voor de puls timers
uint8_t Hz_33_Level;            // verwijst naar hoog of laag duur 33 <span class="posthilit">Hz</span> puls
uint8_t Hz_670_Level;           // verwijst naar hoog of laag duur <span class="posthilit">670</span> <span class="posthilit">Hz</span> Puls
 
/**
 * @name setup()
 * initialize the program
 */
void setup()
{
    //
    // setup IO poorten
    //
    pinMode(PULSE_33    , OUTPUT);
    pinMode(PULSE_670   , OUTPUT);
    //
    // opzetten array met de timer waarden
    //
    timerWaarden[Hz_33][laag] = HZ_33_L;
    timerWaarden[Hz_33][hoog] = HZ_33_H;
    timerWaarden[Hz_670][laag] = HZ_670_L;
    timerWaarden[Hz_670][hoog] = HZ_670_H;
 
    Hz_33_Level     = hoog;
    Hz_670_Level    = hoog;
    //
    // start de timers (we werken met micro seconden voor enige
    // nauwkeurigheid)
    //
    timer1 = micros();
    timer2 = micros();
    //
    // schrijf de waardes naar de pinnen
    //
    digitalWrite(PULSE_33   , Hz_33_Level);
    digitalWrite(PULSE_670  , Hz_670_Level);
}
 
/**
 * @name loop()
 * main loop of program and runs endlessly
 */
void loop()
{
    uint32_t nu = micros();
    //
    // test de 33 <span class="posthilit">Hz</span> timer
    //
    if ((nu - timer1) > timerWaarden[Hz_33][Hz_33_Level]) {
        //
        // we moeten de polariteit wisselen
        //
        Hz_33_Level = !Hz_33_Level;
        //
        // schrijf alvast de output
        //
        digitalWrite(PULSE_33, Hz_33_Level);
        //
        // en start de timer voor de volgende switch
        //
        timer1 = nu + timerWaarden[Hz_33][Hz_33_Level];
    }
    //
    // test de <span class="posthilit">670</span> <span class="posthilit">Hz</span> timer
    //
    if ((nu - timer2) > timerWaarden[Hz_670][Hz_670_Level]) {
        //
        // we moeten de polariteit wisselen
        //
        Hz_670_Level = !Hz_670_Level;
        //
        // schrijf alvast de output
        //
        digitalWrite(PULSE_670, Hz_670_Level);
        //
        // en start de timer voor de volgende switch
        //
        timer1 = nu + timerWaarden[Hz_670][Hz_670_Level];
    }
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Arduino puls generator

Berichtdoor nicoverduin » 08 Feb 2017, 18:53

Welke post was het? Dan kan ik in zijn context plaatsen....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Arduino puls generator

Berichtdoor Gij Kieken » 08 Feb 2017, 19:42

Hey Nico het was
puls breedte en frequentie instelbaar Wim2584

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Arduino puls generator

Berichtdoor nicoverduin » 08 Feb 2017, 21:12

Heb je die link nog? Na ruim 4000 posts heb ik echt geen idee meer :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Arduino puls generator

Berichtdoor Gij Kieken » 08 Feb 2017, 21:25

Begrijpbaar hoor,en ik dan nog met mijn vage vragen

viewtopic.php?f=21&t=1305&p=9091&hilit=670+hz#p9091

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Arduino puls generator

Berichtdoor Gij Kieken » 08 Feb 2017, 21:26

Ik denk dat het probleem schuilt in de uitvoer tijd van iedere regel code.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Arduino puls generator

Berichtdoor Gij Kieken » 09 Feb 2017, 22:37

Met dit kort stukje code wordt de uitgang stabieler en enig sinds regelbaar.
Ik heb gekozen voor een asymmetrisch signaal met vaste puls duur en regelbare pauze duur.
Voor een nog beter resultaat zal ik allicht port manipulation moeten toepassen en wat met timers moeten prutsen.
Dit is natuurlijk weer een nieuwe wereld voor mij met het nodige vallen en opstaan.

Code: Alles selecteren
// Puls generator for frequenties regelbaar van 1-360Hz
// Dit is een zogenoemde Blocking code door het gebruik van delay's

// Pin definitions
#define Puls_Out 2              //pulsuitgang op pin 2
#define Potmeter  A0            //potmeter 10K op Analoog 0
#define Min_Pauze 1             //kleinste pauze duur millis
#define Max_Pauze 1000          //grootste pauze duur millis

void setup()
{
  pinMode(Puls_Out,OUTPUT);      //uitgangsignaal op pin 2
  digitalWrite(Puls_Out,LOW);    //zet alvast de uitgang laag
}

void loop()
{
  uint16_t pot_Val;              //huidige waarde van analoog ingang A0
  uint16_t puls_Pauze;           //tijd van laag Level
 
  pot_Val=analogRead(Potmeter);  //lees de waarde van de potentiometer
  puls_Pauze=map(pot_Val,0,1023,Min_Pauze,Max_Pauze);
 
  digitalWrite(Puls_Out,HIGH);  //verander van Level stijgende flank
  delayMicroseconds(1000);      //vaste pulsduur van 1 milli seconden
  digitalWrite(Puls_Out,LOW);   //verander van Level dalende flank
  delay(puls_Pauze);            //instelbare pauze tijd
}

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten