Table des matières:

Arduino Sinewave pour onduleurs : 4 étapes
Arduino Sinewave pour onduleurs : 4 étapes

Vidéo: Arduino Sinewave pour onduleurs : 4 étapes

Vidéo: Arduino Sinewave pour onduleurs : 4 étapes
Vidéo: как сделать простой инвертор 6000Вт, 4 трансформатора, синусоида, IRFz 44n, jlcpcb 2024, Novembre
Anonim
Arduino Sinewave pour onduleurs
Arduino Sinewave pour onduleurs

Dans ce projet, j'ai généré un signal SPWM (onde sinusoïdale large modulée) à partir de deux sorties numériques arduino pwm.

Parce que pour créer un tel programme, je dois parler de nombreuses autres fonctions et propriétés de l'arduino, du projet complet, y compris des images d'oscilloscope et pour différentes fréquences, veuillez visiter mon site Web:

eprojectszone

Étape 1: Génération du signal Pwm pour 50 Hz

Pour générer un signal de 50 Hz à une fréquence plus élevée, il est nécessaire de faire quelques calculs. Les fréquences d'arduino peuvent être à 8 MHz, mais nous voulons un signal avec un rapport cyclique variable.

Pour comprendre les types de cycles de service variables d'arduino vous pouvez lire ces 3 parties du même post 1, 2 et 3.

Supposons que notre fréquence est de 50 Hz, ce qui signifie que la période de temps est de 20 ms. Donc 10ms est une période de demi-cycle. Dans ces 10 ms, nous devons avoir de nombreuses impulsions avec des cycles d'utilisation différents en commençant par de petits cycles d'utilisation, au milieu du signal, nous avons des cycles d'utilisation maximum et nous terminons également avec de petits cycles d'utilisation. Pour générer une onde sinusoïdale, nous utiliserons deux broches une pour demi-cycle positif et un pour demi-cycle négatif. Dans notre article pour cela, nous utilisons les broches 5 et 6 qui signifient Timer 0.

Pour un signal lisse, nous choisissons un pwm à phase correcte à une fréquence de 31372 Hz-voir le post précédent. L'un des plus gros problèmes est la façon dont nous calculons le rapport cyclique nécessaire pour chaque impulsion. Donc, parce que notre fréquence est f=31372Hz la période pour chaque impulsion est T=1/31372=31,8 us, donc le nombre d'impulsions pour un demi-cycle est N=10ms/31,8us=314 impulsions. Maintenant, pour calculer le cycle de service pour chaque impulsion, nous avons y = sinx, mais dans cette équation, nous avons besoin de degrés, donc le demi-cycle a 180 degrés pour 314 impulsions. Pour chaque impulsion, nous avons 180/314=0,57deg/impulsion. Cela signifie que pour chaque impulsion, nous avançons avec 0.57deg.

y est le rapport cyclique et x la valeur de la position en demi rapport cyclique. au début x vaut 0, après que x=0,57, x=1,14 et ainsi de suite jusqu'à x= 180.

si nous calculons toutes les 314 valeurs, nous obtenons un tableau de 314 éléments (tapez "int" pour être calculé plus facilement par arduino).

Un tel tableau est:

int sinPWM={1, 2, 5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 30, 32, 34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 61, 64, 66, 69, 71, 73, 76, 78, 80, 83, 85, 88, 90, 92, 94, 97, 99, 101, 103, 106, 108, 110, 113, 115, 117, 119, 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 178, 180, 182, 184, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 249, 249, 249, 249, 249, 248, 248, 248, 248, 247, 247, 247, 246, 246, 245, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 21 6, 215, 213, 212, 211, 209, 208, 207, 205, 204, 202, 201, 199, 198, 196, 195, 193, 192, 190, 188, 187, 185, 184, 182, 180, 178, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132, 130, 128, 126, 124, 121, 119, 117, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 85, 83, 80, 78, 76, 73, 71, 69, 66, 64, 61, 59, 57, 54, 52, 49, 47, 44, 42, 39, 37, 34, 32, 30, 27, 24, 22, 19, 17, 15, 12, 10, 7, 5, 2, 1};

Vous pouvez voir que, comme une onde sinusoïdale, le cycle de service est le plus bas au premier et au dernier élément et le plus élevé au milieu.

Étape 2: programme Arduino pour cycle de service variable

Programme Arduino pour cycle de service variable
Programme Arduino pour cycle de service variable

Dans l'image ci-dessus, nous avons des signaux de cycles de service variables avec des valeurs du tableau.

Mais comment faire un tel signal ??

la partie du programme ci-dessous utilise des interruptions pour modifier les valeurs des cycles de service

sei();// activer les interruptions

}

ISR(TIMER1_COMPA_vect){// interruption lorsque la minuterie 1 correspond à la valeur OCR1A

if(i>313 && OK==0){// valeur finale du vecteur pour la broche 6

i=0;// aller à la première valeur du vecteur (tableau)

OK=1;//activer la broche 5

}

x=sinPWM;// x prend la valeur du vecteur correspondant à la position i(i est indexé à zéro)-valeur du rapport cyclique

i=i+1;// passe à la position suivante

}

Étape 3: Alternance à 50 Hz des broches Arduino

Broches Arduino en alternance à 50 Hz
Broches Arduino en alternance à 50 Hz

Parce que chaque broche ne génère qu'un demi-cycle de service pour créer une onde sinusoïdale complète, nous utilisons deux broches qui alternent l'une après l'autre après exactement 10 msecondes (pour 50 Hz). Ce changement de broches est effectué à la fin du réseau - disons que la broche 5 a généré 314 impulsions, cette broche est mise hors tension et activée la broche 6, ce qui fait la même chose mais pour le rapport cyclique négatif.

Parce qu'arduino ne peut générer que des signaux positifs, le cycle de service négatif est créé dans le pont en h - vous pouvez lire ici à ce sujet

Le programme pour changer les broches:

sei();// activer les interruptions

}

ISR(TIMER1_COMPA_vect){// interruption lorsque la minuterie 1 correspond à la valeur OCR1A

if(i>313 && OK==0){// valeur finale du vecteur pour la broche 6

i=0;// aller à la première valeur du vecteur

OK=1;//activer la broche 5

}

if(i>313 && OK==1){// valeur finale du vecteur pour la broche 5

i=0;//aller à la première valeur du vecteur

OK=0;//activer la broche 6

}

x=sinPWM;// x prend la valeur du vecteur correspondant à la position i(i est indexé à zéro)

i=i+1;// passe à la position suivante

si(OK==0){

OCR0B=0;//faire la broche 5 0

OCR0A=x;//activer la broche 6 sur le cycle de service correspondant

si(OK==1){

OCR0A=0;//faire la broche 6 0

OCR0B=x;//activer la broche 5 sur le cycle de service correspondant

}

}

Étape 4: Conduire un pont en H et filtrer le signal Pwm

Les signaux obtenus de l'arduino sont la partie de contrôle des applications de l'onduleur car les deux sont positifs. Pour faire une onde sinusoïdale complète et un onduleur pratique, nous devons utiliser un pont en h et effacer le pwm un filtre passe-bas.

Le pont en H est présenté ici.

Le filtre passe-bas testé avec de petits moteurs à courant alternatif-ici.

Conseillé: