Modulation d’amplitude avec porteuse 50kHz

Bonjour,

Le but de mon projet est de transmettre des données par UART grâce à la Pin TX, mais j'aimerais que mes données soit envoyer avec une porteuse à 50kHz constant.

En gros avoir une porteuse constante au quel je rajoute ma trame de données.

Je ne suis pas un génie de l'informatique donc j'ai pas mal cherché comment faire cette modulation amplitude, sans réel réponse concrète.

Transmetteur AM avec Arduino - Instructables
sur ce site existe un programme mais je n'ai pas réussi à comprendre le fonctionnement

Est ce qu'il y aurait des âmes charitables pour m'aider ?

#include <Wire.h> // for LCD to comunicate in i2c

// #include <LiquidCrystal_I2C.h> // LCD in i2c need module PCF8574

/---------------( Declare Constants )---------------/

// 1st MODULE

#define W_CLK_ONE 10 // Pin 8 - connect to AD9850 module word load clock pin (CLK)

#define FQ_UD_ONE 11 // Pin 9 - connect to freq update pin (FQ)

#define DATA_ONE 12 // Pin 10 - connect to serial data load pin (DATA - D7)

#define RESET_ONE 13 // Pin 11 - connect to reset pin (RST).

// 2st MODULE

#define W_CLK_TWO 0 // Pin 4 - connect to AD9850 module word load clock pin (CLK)

#define FQ_UD_TWO 1 // Pin 5 - connect to freq update pin (FQ)

#define DATA_TWO 2 // Pin 6 - connect to serial data load pin (DATA - D7)

#define RESET_TWO 3 // Pin 7 - connect to reset pin (RST).

// for DDS

#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }

// potentiometers

#define POT_ONE A1

#define POT_TWO A2

// for mapping the value of potentiometer in hertz

#define MAP 100000

/---------------( Declare objects )---------------/

// LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

/---------------( Declare Variables )---------------/

long freq_mod_one = 0;

long freq_mod_two = 0;

long pot_value = 0;

/---------------( Declare Fonctions )---------------/

// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line

void tfr_byte(byte data, int pin_clock, int pin_data)

{

for (int i=0; i<8; i++, data>>=1)

{

  digitalWrite(pin_data, data & 0x01);

  pulseHigh(pin_clock);   //after each bit sent, CLK is pulsed high

}

}

// frequency calc from datasheet page 8 = * /2^32

void sendFrequency(double frequency, int pin_clock, int pin_fq, int pin_data)

{

int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850

for (int b=0; b<4; b++, freq>>=8)

{

  tfr_byte(freq & 0xFF, pin_clock, pin_data);

}

tfr_byte(0x000, pin_clock, pin_data); // Final control byte, all 0 for 9850 chip

pulseHigh(pin_fq); // Done! Should see output

}

/---------------( SETUP: RUNS ONCE )---------------/

void setup()

{

// lcd.begin(16,2); // initialize the lcd for 16 chars 2 lines and turn on backlight

// Configure arduino data pins for output

pinMode(FQ_UD_ONE, OUTPUT);

pinMode(W_CLK_ONE, OUTPUT);

pinMode(DATA_ONE, OUTPUT);

pinMode(RESET_ONE, OUTPUT);

pulseHigh(RESET_ONE);

pulseHigh(W_CLK_ONE);

pulseHigh(FQ_UD_ONE); // this pulse enables serial mode

pinMode(FQ_UD_TWO, OUTPUT);

pinMode(W_CLK_TWO, OUTPUT);

pinMode(DATA_TWO, OUTPUT);

pinMode(RESET_TWO, OUTPUT);

pulseHigh(RESET_TWO);

pulseHigh(W_CLK_TWO);

pulseHigh(FQ_UD_TWO); // this pulse enables serial mode

// Quick 3 blinks of backlight "hello world"

// for(int i = 0; i< 3; i++)

// {

// lcd.backlight();

// delay(100);

// lcd.noBacklight();

// delay(100);

// }

// lcd.backlight(); // finish with backlight on

// Write characters on the display

// lcd.setCursor(1,0);

// lcd.print("Test: DDS");

// delay(2000);

// lcd.clear();

}/--(end setup )---/

/---------------( LOOP: RUNS CONSTANTLY )---------------/

void loop()

{

// lcd.setCursor(0,0); // formating text

// lcd.print("Freq 1:"); //

// lcd.print(freq_mod_one); //

// lcd.print("Hz "); //

// lcd.setCursor(0,1); //

// lcd.print("Freq 2:"); //

// lcd.print(freq_mod_two); //

// lcd.print("Hz "); //

pot_value = analogRead(POT_ONE); //

freq_mod_one = map(pot_value, 0, 1023, 0, MAP); // map the value of potentiometer

sendFrequency(50, W_CLK_ONE, FQ_UD_ONE, DATA_ONE); //transfer value of pot 1 to first AD9850

pot_value = analogRead(POT_TWO); //

freq_mod_two = map(pot_value, 0, 1023, 0, MAP); //

sendFrequency(50, W_CLK_TWO, FQ_UD_TWO, DATA_TWO); //transfer value of pot 2 to second AD9850

}

j'ai trouvé ceux si aussi

Bonjour @el_paquito

Prends le temps de consulter les Bonnes Pratiques du Forum pour y découvrir, entre autres , comment mettre en forme et publier ton code

+fais un petit croquis pour représenter le signal modulé que tu attends
(profondeur de la modulation .......etc
)

Edit : lu trop vite confondu 50kHz et 50 Hz :pensive:

il est vrai que je n'ai pas trop détaillé, donc pour ce projet j'utilise un arduino nano avec pour la transmission un ampli op en mode comparateur ainsi qu'un transfo.

Ce que j'aimerais faire, c'est d'envoyé un signal constant, une porteuse de 50kHz, puis de coupler cela avec mon signal transmettant les données voulus.

Parce que pour transmettre ma trame de données, celle ci est modulé en amplitude avec une porteuse à 50kHz

Trame : sur 10 bits, avec un bit de start à 0, 7 bits de données, 1 bit de parité paire, et un bit de stop à 1

le porteuse doit être en logique négative

Bonjour @el_paquito

si tu dessinais le signal résultant ce serait encore plus clair !! (on y verrait par exemple la profondeur de modulation attendue)

Avec ce qu tu donnes et la garnde marge d'interprétation qui va avec je propose d'utiliser un CD4093 en astable commandé -> modulation d'amplitude 100%

L'une des 4 portes logiques du CI produirait 'à la demande' le signal 'carré' à 50kHZ (ajuster la frquence avec un potentiometer)
Il reste 3 portes logique disponibles au besoin pour inverser si nécessaire le signal de validation de l'oscillation (CONTROL) ou le signal de sortie

On peut supposer que ce ne doit pas être une modulation à 100%. On suppose aussi que c'est le contraire, c'est la porteuse qui est modulée par les données à transmettre.

Désolé mais là je ne comprends pas.

Tu es sûr que tu peux utiliser A6 et A7 comme tu l'indiques sur ton schéma?

Et mets le code de ton second messages entre balises comme indiqué dans les bonnes pratiques du forum.

La définition que j'ai toujours vu jusqu'à présent est la suivante :
État logique ne veut pas dire état haut, Vcc,gnd, ou bas mais :

  • un état correspond à <<vrai>>
  • un état correspond à <<faux>>

Dans ce qui j'ai toujours vu jusqu'à présent:

  • Logique positive : l'état <<vrai>> est affecté au niveau électrique haut.
  • Logique négative : l'état <<vrai>> est affecté au niveau électrique bas.

L'intérêt se trouve dans le théorème de "De Morgan".
L'I2C qui place les transistors à collecteurs ouverts en parallèle utilise la logique négative.

  • En logique positive, ces transistors constitueraient un NON-ET inexploitable
  • En logique négative, grâce au théorème de "De Morgan" ces transistors constituent un OU gratuit et extensible à loisir.

Parle-t-on de la même chose ?

Et bien si j'aimerais réalisé une modulation à 100% et oui c'est en effet la porteuse qui est modulé.

Dans le sens ou, 0 la porteuse est présenté et 1 l'inverse

Mon but étant de créer un signal à 50kHz avec l'arduino. merci pour les suggestions sur mon schéma électrique mais j'aimerais que tout cela rentre d'un format spécifique donc je ne pense pas avoir la place pour un montage supplémentaire


je dois avoir une amplitude minimum de 1,2V pour que le signal soit correctement transmis et une ampli max de 25V

Fais donc un tour sur le site Mike Gammon.
https://gammon.com.au/
et plus particulièrement ici :

et sur le chapitre :
"Modulating a 38 kHz carrier with a 500 Hz signal"

Ce ne devrait pas être trop différent de ce que tu veux faire.

Bonjour

mais j'aimerais que tout cela rentre d'un format spécifique donc je ne pense pas avoir la place pour un montage supplémentaire

le schéma que tu proposes ajoute pourtant un Amplificateur Opérationnel

Je ne suis pas certain que techniquement ce soit le meilleur choix.
La ligne Tx de l'UART est à 1 lorsqu'il n'y a pas de transmission. Cela veut dire qu'il ne devrait pas y avoir de porteuse pendant des périodes de temps relativement longues. Déjà la modulation à 100% à un effet néfaste sur la fiabilité d'une connexion, si on ajoute à ça l'interruption de la porteuse pendant les "silences" de la communication le taux d'erreur risque d'être élevé.

Concernant le schéma je réitère ma remarque sur A6 et A7 qui ne peuvent pas être utilisé en sortie.
Je ne vois pas trop l'apport de l'ampli op.

Merci beaucoup pour le tuyau, cela m'a beaucoup aidé, et j'ai enfin pu avec quelques recherches en plus à réaliser ma porteuse

Vous avez raison, je vais transmettre ma porteuse par une entrée sortie PWM enfin de générer ma porteuse et ensuite générer mon signal de trame avec le uart.

Je confirme que j'ai fait une boulette sur le chemin, effectivement ses sorties sont seulement analogique.

Oui pour permettre la transmission de la porteuse ainsi que du signal contenant la trame de donnée

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.