Arduino puls generator
7 berichten
• Pagina 1 van 1
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Arduino puls generator
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?
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Arduino puls generator
Welke post was het? Dan kan ik in zijn context plaatsen....
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Arduino puls generator
Hey Nico het was
puls breedte en frequentie instelbaar Wim2584
puls breedte en frequentie instelbaar Wim2584
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Arduino puls generator
Heb je die link nog? Na ruim 4000 posts heb ik echt geen idee meer
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Arduino puls generator
Begrijpbaar hoor,en ik dan nog met mijn vage vragen
viewtopic.php?f=21&t=1305&p=9091&hilit=670+hz#p9091
viewtopic.php?f=21&t=1305&p=9091&hilit=670+hz#p9091
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Arduino puls generator
Ik denk dat het probleem schuilt in de uitvoer tijd van iedere regel code.
- Gij Kieken
- Berichten: 631
- Geregistreerd: 15 Nov 2015, 11:54
Re: Arduino puls generator
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.
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
}
7 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten