Cédric SAADAOUI CORREGE
/
mbed_Blinky_PWM_SPI
1st release
main.cpp
- Committer:
- CedricSC
- Date:
- 2015-06-17
- Revision:
- 0:db5b31dd20a0
File content as of revision 0:db5b31dd20a0:
/* * INCLUDES */ #include "mbed.h" /* * CONSTANTES */ const unsigned char AUDIO_VOLUME[10] = { 0, 28, 56, 84, 112, 140, 168, 197, 226, 255 }; /* * VARIABLES GLOBALES */ unsigned int global_PWM_Period; unsigned int global_PWM_Duty; unsigned int global_PWM_PeriodReload; unsigned int global_PWM_DutyReload; unsigned int global_PWM_Counter; unsigned int global_PWM_State; /* * DEFINITION DES MODULES */ // définitions des LEDs //DigitalOut myLed1(LED1); DigitalOut myLed2(LED2); DigitalOut myLed3(LED3); DigitalOut myLed4(LED4); // définitions des boutons DigitalIn myButton1(p17); DigitalIn myButton2(p18); DigitalIn myButton3(p19); DigitalIn myButton4(p20); // définitions du son DigitalOut audioCS(p25); SPI audioVolume(p5, NC, p7); //DigitalOut audioPWM(p26); DigitalOut audioPWM(LED1); Ticker tickerPWM; /* * INTERRUPTIONS */ // interruption permettant la génération du PWM void IRQ_PWM( void ) { // si un signal PWM doit etre généré if( global_PWM_Period ){ // incrémente le compteur global_PWM_Counter++; // si l'état de la pin de PWM est haute ( duty < counter < period ) if( global_PWM_State ){ // si le compteur dépasse la période if( global_PWM_Counter >= global_PWM_Period ){ // mise à 0 du signal audioPWM = 0; global_PWM_State = 0; // reset du counter global_PWM_Counter = 0; // recharge la période du PWM global_PWM_Period = global_PWM_PeriodReload; // recharge le rapport cyclique du PWM global_PWM_Duty = global_PWM_DutyReload; } // si l'état de la pîn de PWM est basse ( 0 < counter < duty ) }else{ // si le compteur dépasse la période if( global_PWM_Counter >= global_PWM_Duty ){ // mise à 0 du signal audioPWM = 1; global_PWM_State = 1; } } } } /* * SOUS PROGRAMMES */ void audio_SetVolume( unsigned int volumeIndex ) { audioCS = 0; audioVolume.write( AUDIO_VOLUME[volumeIndex] ); audioCS = 1; } void UpdatePWM( unsigned int period, unsigned int duty ) { global_PWM_PeriodReload = period; global_PWM_DutyReload = duty; } void InitPWM( void ) { // définition de la fonction qui gère le signal PWM (appellée toutes les 10µs) tickerPWM.attach_us( &IRQ_PWM, 10 ); // reset des variables liées au PWM global_PWM_Counter = 0; global_PWM_Period = 0; global_PWM_PeriodReload = 0; global_PWM_Duty = 0; global_PWM_DutyReload = 0; global_PWM_State = 0; audioPWM = 0; } /* * FONCTION PRINCIPALE */ int main() { // variable locale unsigned char i; unsigned int delay; unsigned char flagStart, flagSens; // initialise les variables i = 0; delay = 200; flagStart = 1; flagSens = 0; // boucle de fonctionnement principale while(1) { /* // si l'application est lancée if( flagStart ) { // éteint toutes les LED myLed1 = 1; myLed2 = 1; myLed3 = 1; myLed4 = 1; // en fonction de la valeur de i switch( i & 0x03 ) { case 0 : myLed1 = 0; break; case 1 : myLed2 = 0; break; case 2 : myLed4 = 0; break; case 3 : myLed3 = 0; break; } // délay d'attente wait_ms(delay); // si le sens est positif if( flagSens ){ // incrémente le compteur i++; // si le sens est négatif }else{ // décrémente le compteur i--; } } */ // si appuie sur bouton 1 if(!myButton1){ led = led - 0.1; // change l'état de marche arret flagStart ^= 0x01; // attend que le bouton soit relaché while( !myButton1 ); } // si appuie sur bouton 2 if(!myButton2){ led = led + 0.1; // change le sens flagSens ^= 0x01; // attend que le bouton soit relaché while( !myButton2 ); } // si appuie sur bouton 3 if(!myButton3){ // réduit le délay de changement delay -= 10; // attend que le bouton soit relaché while( !myButton3 ); } // si appuie sur bouton 4 if(!myButton4){ // augmente le délay de changement delay += 10; // attend que le bouton soit relaché while( !myButton4 ); } } }