/*
*sPWMv2.c
*
* Créé : 31/12/2014 15:44:43
*Auteur : Kurt Hutten
SPWM sur l'atMega328 pour l'arduino Uno, pourrait être compatible avec d'autres puces Atmel/cartes Arduino.
Comparez les sorties A et B aux broches 1 et 2 du PORTB qui sont respectivement les broches 9 et 10 sur l'Uno.
Il est également utile de connaître la LED de l'Uno, la broche 5 du PORTB.
*/
#include <avr/io.h>
#include <avr/interruption.h>
// Recherche des tables de 200 entrées chacune, normalisées pour avoir une valeur maximale de 1600 qui est la période du PWM chargé dans le registre ICR1.
int lookUp1[] = {50,100,151,201,250,300,349,398,446,494,542,589,635,681,726,771,814,857,899,940,981,1020, 1058,1095,1131,1166,1200,1233,1264,1294,1323,1351,1377,1402,1426,1448,1468,1488,1505,1522,1536,1550,156 1,1572,1580,1587,1593, 1597,1599,1600,1599,1597,1593,1587,1580,1572,1561,1550,1536,1522,1505,1488,1468,1448,1426,1402,1377,135 1 ,1323 ,1294 ,1264 ,1233 , 1200,1166,1131,1095,1058,1020,981,940,899,857,814,771,726,681,635,589,542,494,446,398,349,300,250,20 1 151 , 100 ,50 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0,0,0} ;
int lookUp2[] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , 0 ,0 ,0 ,50 ,100 ,151 ,201 ,250 ,300 ,349 ,398 ,446 ,494 ,542 ,589 ,635 ,681 ,726 ,771 ,814 ,857 ,899 ,940 ,981 ,1020 , 1058,1095,1131,1166,1200,1233,1264,1294,1323,1351,1377,1402,1426,1448,1468,1488,1505,1522,1536,1550,156 1,1572,1580,1587,1593, 1597,1599,1600,1599,1597,1593,1587,1580,1572,1561,1550,1536,1522,1505,1488,1468,1448,1426,1402,1377,135 1 ,1323 ,1294 ,1264 ,1233 , 1200,1166,1131,1095,1058,1020,981,940,899,857,814,771,726,681,635,589,542,494,446,398,349,300,250,20 1 151 , 100,50,0} ;
void setup(){
    // Initialisation du registre, voir la fiche technique pour plus de détails.
    TCCR1A = 0b10100010 ;
       /*10 clair lors du match, défini en BAS pour compA.
         10 sans faute sur le match, fixé en BAS pour compB.
         00
         10 WGM1 1:0 pour la forme d'onde 15.
       */
    TCCR1B = 0b00011001 ;
       /*000
         11 WGM1 3:2 pour la forme d'onde 15.
         001 pas de pré-échelle sur le compteur.
       */
    TIMSK1 = 0b00000001 ;
       /*0000000
         1 TOV1 Activation de l'interruption du drapeau.
       */
    ICR1 = 1600 ; // Période pour cristal de 16 MHz, pour une fréquence de commutation de 100 KHz pour 200 subdivisions par cycle d'onde sinusoïdale de 50 Hz.
    sei(); // Active les interruptions globales.
    DDRB = 0b00000110 ; // Définit PB1 et PB2 comme sorties.
    pinMode(13,SORTIE);
}
boucle vide(){; /*Ne fais rien . . . . pour toujours!*/}
ISR(TIMER1_OVF_vect){
    numéro entier statique ;
    déclenchement de caractères statiques ;
    // change le cycle de service à chaque période.
    OCR1A = recherche1[num] ;
    OCR1B = recherche2[num] ;
    if(++num >= 200){ // Pré-incrémentez le nombre puis vérifiez qu'il est inférieur à 200.
       nombre = 0 ; // Réinitialise le numéro.
       trig = trig^0b00000001;
       digitalWrite(13,trig);
     }
}