# Arduino Forum

## International => Français => Réalisations et Projets Finis => Topic started by: rahma94 on Apr 21, 2019, 01:52 pm

Title: GBF( générateur de basse fréquence) with ARDUINO PWM problem frequency
Post by: rahma94 on Apr 21, 2019, 01:52 pm
Hey have a Good Day! :)  :)
I am working on a project of a frequency probe and I need to create a GBF goes from ]0-10KHz]
I am using an Arduino Uno board to generate a PWM to get frequency.
I'am using Potentiometr to change the frequency on A0 pin of my ARDUINO baord .
I need help to fix my Program to provide at least from 1 HZ to 11khz frequency of pwm.
my out put is on pin 9.
this is my program:

#include "Arduino.h"
#define NECHANT 128
#define SHIFT_ACCUM 25

uint32_t icr;
uint32_t table_onde[NECHANT];
uint32_t accum1,accum2,accum3,increm;
//uint16_t diviseur[6] = {0,1,8,64,256,1024};
uint16_t diviseur[1] = {8};

void init_pwm_timer1(uint32_t period) {
char clockBits;
TCCR1A = 0;
TCCR1A |= (1 << COM1A1); //Clear OC1A on compare match when upcounting, set OC1A on compare match when downcounting
TCCR1A |= (1 << COM1B1);
#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__)
TCCR1A |= (1 << COM1C1);
#endif
TCCR1B = 1 << WGM13; // phase and frequency correct pwm mode, top = ICR1
int d = 1;
icr = (F_CPU/1000000*period/2);
while ((icr>0xFFFF)&&(d<6)) { // choix du diviseur d'horloge
d++;
icr = (F_CPU/1000000*period/2/diviseur[d]);
}
clockBits = d;
ICR1 = icr; // valeur maximale du compteur
TIMSK1 = 1 << TOIE1; // overflow interrupt enable
sei(); // activation des interruptions
TCNT1 = 0; // mise à zéro du compteur
TCCR1B |= clockBits; // déclenchement du compteur
}

ISR(TIMER1_OVF_vect) { // Timer 1 Overflow interrupt
accum1 += increm;
accum2 += increm;
#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__)
accum3 += increm;
OCR1C = table_onde[accum3 >> SHIFT_ACCUM];
#endif
OCR1A = table_onde[accum1 >> SHIFT_ACCUM];
OCR1B = table_onde[accum2 >> SHIFT_ACCUM];

}

void set_sinus_table(float amp) {
int i;
float dt = 2*3.1415926/NECHANT;
for(i=0; i<NECHANT; i++) {
table_onde = icr*0.5*(1.0+amp*sin(i*dt));
}
}
int p;

void setup() {
pinMode(9,OUTPUT);
pinMode(A0,INPUT);
Serial.begin(19200);

//
//    uint32_t period_pwm = 100; // en microsecondes
//    uint32_t frequence = 50; // en Hz
//    accum1 = 0;
//    accum2 = ((uint32_t)(NECHANT * 0.25)) << SHIFT_ACCUM;
//    accum3 = 0;
//    increm = (uint32_t) (((float)(0xFFFFFFFF))*((float)(frequence)*1e-6*(float)(period_pwm))); // incrément de l'accumulateur de phase
//    init_pwm_timer1(period_pwm);
//    set_sinus_table(1.0);
}

void loop() {
p=map(p,0,1023,0,255);
Serial.println(p);
analogWrite(9,p);

uint32_t period_pwm = 1.5*p; // en microsecondes
uint32_t frequence = 40*p; // en Hz
accum1 = 0;
accum2 = ((uint32_t)(NECHANT * 0.25)) << SHIFT_ACCUM;
accum3 = 0;
increm = (uint32_t) (((float)(0xFFFFFFFF))*((float)(frequence)*1e-6*(float)(period_pwm))); // incrément de l'accumulateur de phase
init_pwm_timer1(period_pwm);
set_sinus_table(1.0);

}

Title: Re: GBF( générateur de basse fréquence) with ARDUINO PWM problem frequency
Post by: al1fch on Apr 21, 2019, 05:14 pm
Bonjour

Forum francophone : on s'exprime ici en Français

Bien lire la Regle du Forum (http://forum.arduino.cc/index.php?topic=546956.0), entre autres l'endroit où poster les questions, ainsi que la manière de publier le code

tel quel ce message a le profil idéal pour finir dans la poubelle du BAR pour non respect de plusieurs règles

Corriges ce message et demandes au modérateur (lien report to moderator) le déplacement du message a l'endroit prévu pour les demandes d'aides (il n'a rien à faire avec les Réalisations FINIES et projets FINIS)
Title: Re: GBF( générateur de basse fréquence) with ARDUINO PWM problem frequency
Post by: J-M-L on Apr 22, 2019, 08:43 am
Double post avec le forum anglais en plus...
Title: Re: GBF( générateur de basse fréquence) with ARDUINO PWM problem frequency
Post by: rahma94 on Apr 22, 2019, 12:13 pm
Je n'ai pas trouvé comment supprimer ce post!!!!
C'est très claire que je suis nouvelle ici alors quand vous me dirige comment faire  sa sera mieux que agrandir le nombre de réponse de ce post pour rien !!!!!!

@J-M-L j'ai fait le 2 ème post parce que j'ai compris que ici ce n'ai pas le bon endroit
et comme j'ai déjà indiqué au dessus "Je n'ai pas trouvé comment supprimer ce post"
je vous remercie aussi parce que vous prenez votre temps pour compter mes post et où j'ai les met :D
Title: Re: GBF( générateur de basse fréquence) with ARDUINO PWM problem frequency
Post by: J-M-L on Apr 22, 2019, 12:15 pm
lisez comment utiliser le forum (les posts épinglés en haut du forum comme "Bien éditer son post pour les nuls (http://forum.arduino.cc/index.php?topic=394754.0)" , "Faire un Nouveau Sujet ou le corriger avec les Balises... (http://forum.arduino.cc/index.php?topic=315372.0)" et "Règles du forum francophone (http://forum.arduino.cc/index.php?topic=546956.0)"), et faites un post "propre"