Cédric SAADAOUI CORREGE / Mbed 2 deprecated mbed_Blinky_PWM_SPI

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002 * INCLUDES
00003 */
00004 #include "mbed.h"
00005 
00006 /*
00007 * CONSTANTES
00008 */
00009 const unsigned char AUDIO_VOLUME[10] = { 0, 28, 56, 84, 112, 140, 168, 197, 226, 255 };
00010 
00011 /*
00012 * VARIABLES GLOBALES
00013 */
00014 unsigned int global_PWM_Period;
00015 unsigned int global_PWM_Duty;
00016 unsigned int global_PWM_PeriodReload;
00017 unsigned int global_PWM_DutyReload;
00018 unsigned int global_PWM_Counter;
00019 unsigned int global_PWM_State;
00020 
00021 /*
00022 * DEFINITION DES MODULES
00023 */
00024 // définitions des LEDs
00025 //DigitalOut myLed1(LED1);
00026 DigitalOut myLed2(LED2);
00027 DigitalOut myLed3(LED3);
00028 DigitalOut myLed4(LED4);
00029 // définitions des boutons
00030 DigitalIn myButton1(p17);
00031 DigitalIn myButton2(p18);
00032 DigitalIn myButton3(p19);
00033 DigitalIn myButton4(p20);
00034 // définitions du son
00035 DigitalOut audioCS(p25);
00036 SPI audioVolume(p5, NC, p7);
00037 //DigitalOut audioPWM(p26);
00038 DigitalOut audioPWM(LED1);
00039 Ticker tickerPWM;
00040 
00041 /*
00042 * INTERRUPTIONS
00043 */
00044 // interruption permettant la génération du PWM
00045 void IRQ_PWM( void )
00046 {
00047     // si un signal PWM doit etre généré
00048     if( global_PWM_Period ){
00049         // incrémente le compteur
00050         global_PWM_Counter++;
00051         // si l'état de la pin de PWM est haute ( duty < counter < period )
00052         if( global_PWM_State ){
00053             // si le compteur dépasse la période
00054             if( global_PWM_Counter >= global_PWM_Period ){
00055                 // mise à 0 du signal
00056                 audioPWM = 0;
00057                 global_PWM_State = 0;
00058                 // reset du counter
00059                 global_PWM_Counter = 0;
00060                 // recharge la période du PWM
00061                 global_PWM_Period = global_PWM_PeriodReload;
00062                 // recharge le rapport cyclique du PWM
00063                 global_PWM_Duty = global_PWM_DutyReload;
00064             }
00065         // si l'état de la pîn de PWM est basse ( 0 < counter < duty )
00066         }else{
00067             // si le compteur dépasse la période
00068             if( global_PWM_Counter >= global_PWM_Duty ){
00069                 // mise à 0 du signal
00070                 audioPWM = 1;
00071                 global_PWM_State = 1;
00072             }
00073         }
00074     }
00075 }
00076 
00077 /*
00078 * SOUS PROGRAMMES
00079 */
00080 void audio_SetVolume( unsigned int volumeIndex )
00081 {
00082     audioCS = 0;
00083     audioVolume.write( AUDIO_VOLUME[volumeIndex] );
00084     audioCS = 1;
00085 }
00086 
00087 void UpdatePWM( unsigned int period, unsigned int duty )
00088 {
00089     global_PWM_PeriodReload = period;
00090     global_PWM_DutyReload = duty;
00091 }
00092 
00093 void InitPWM( void )
00094 {
00095     // définition de la fonction qui gère le signal PWM (appellée toutes les 10µs)
00096     tickerPWM.attach_us( &IRQ_PWM, 10 );
00097     // reset des variables liées au PWM
00098     global_PWM_Counter = 0;
00099     global_PWM_Period = 0;
00100     global_PWM_PeriodReload = 0;
00101     global_PWM_Duty = 0;
00102     global_PWM_DutyReload = 0;
00103     global_PWM_State = 0;
00104     audioPWM = 0;
00105 }
00106 
00107 /*
00108 * FONCTION PRINCIPALE
00109 */
00110 int main()
00111 {
00112     // variable locale
00113     unsigned char i;
00114     unsigned int delay;
00115     unsigned char flagStart, flagSens;
00116     
00117     // initialise les variables
00118     i = 0;
00119     delay = 200;
00120     flagStart = 1;
00121     flagSens = 0;
00122     // boucle de fonctionnement principale
00123     while(1) {
00124 /*        // si l'application est lancée
00125         if( flagStart )
00126         {
00127             // éteint toutes les LED
00128             myLed1 = 1;
00129             myLed2 = 1;
00130             myLed3 = 1;
00131             myLed4 = 1;
00132             // en fonction de la valeur de i
00133             switch( i & 0x03 )
00134             {
00135                 case 0 :
00136                     myLed1 = 0;
00137                     break;
00138                 case 1 :
00139                     myLed2 = 0;
00140                     break;
00141                 case 2 :
00142                     myLed4 = 0;
00143                     break;
00144                 case 3 :
00145                     myLed3 = 0;
00146                     break;
00147             }
00148             // délay d'attente
00149             wait_ms(delay);
00150             // si le sens est positif
00151             if( flagSens ){
00152                 // incrémente le compteur
00153                 i++;
00154             // si le sens est négatif
00155             }else{
00156                 // décrémente le compteur
00157                 i--;
00158             }
00159         }
00160 */        // si appuie sur bouton 1
00161         if(!myButton1){
00162             led = led - 0.1;
00163             // change l'état de marche arret
00164             flagStart ^= 0x01;
00165             // attend que le bouton soit relaché
00166             while( !myButton1 );
00167         }
00168         // si appuie sur bouton 2
00169         if(!myButton2){
00170             led = led + 0.1;
00171             // change le sens
00172             flagSens ^= 0x01;
00173             // attend que le bouton soit relaché
00174             while( !myButton2 );
00175         }
00176         // si appuie sur bouton 3
00177         if(!myButton3){
00178             // réduit le délay de changement
00179             delay -= 10;
00180             // attend que le bouton soit relaché
00181             while( !myButton3 );
00182         }
00183         // si appuie sur bouton 4
00184         if(!myButton4){
00185             // augmente le délay de changement
00186             delay += 10;
00187             // attend que le bouton soit relaché
00188             while( !myButton4 );
00189         }
00190     }
00191 }