Program uses USER BUTTON to ciclycally and discretely change luminous intensity of LD2(19E042PIM).

Dependencies:   mbed

Committer:
tzwell
Date:
Thu Oct 14 18:52:24 2021 +0000
Revision:
0:c71372aad4e1
Child:
1:35da54fcf004
First commit, first publish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tzwell 0:c71372aad4e1 1 /*
tzwell 0:c71372aad4e1 2 * Primer ciklicne promene intenziteta osvetljaja
tzwell 0:c71372aad4e1 3 * korisnicke diode LD2 putem pritiska tastera USER,
tzwell 0:c71372aad4e1 4 * napisan za STM32L476RG koristeci mbed.h biblioteku .
tzwell 0:c71372aad4e1 5 *
tzwell 0:c71372aad4e1 6 * Katedra za Elektroniku i digitalne sisteme
tzwell 0:c71372aad4e1 7 * Elektrotehnicki fakultet
tzwell 0:c71372aad4e1 8 * Beograd
tzwell 0:c71372aad4e1 9 *
tzwell 0:c71372aad4e1 10 * Oktobar 2021.
tzwell 0:c71372aad4e1 11 *
tzwell 0:c71372aad4e1 12 */
tzwell 0:c71372aad4e1 13
tzwell 0:c71372aad4e1 14 /*
tzwell 0:c71372aad4e1 15 * Biblioteke za uvoz:
tzwell 0:c71372aad4e1 16 */
tzwell 0:c71372aad4e1 17 #include "mbed.h"
tzwell 0:c71372aad4e1 18
tzwell 0:c71372aad4e1 19 /*
tzwell 0:c71372aad4e1 20 * Definisanje makroa:
tzwell 0:c71372aad4e1 21 */
tzwell 0:c71372aad4e1 22 #define PWM_PERIOD 20
tzwell 0:c71372aad4e1 23 #define INITIAL_DUTY_CYCLE 0
tzwell 0:c71372aad4e1 24 #define DUTY_CYCLE_INCREMENT 0.25f
tzwell 0:c71372aad4e1 25 #define POLLING_PERIOD 50
tzwell 0:c71372aad4e1 26 #define MAX_DUTY_CYCLE 1
tzwell 0:c71372aad4e1 27
tzwell 0:c71372aad4e1 28 /*
tzwell 0:c71372aad4e1 29 * Globalne promenljive:
tzwell 0:c71372aad4e1 30 */
tzwell 0:c71372aad4e1 31 PwmOut DiodicaNaPloci(LED1); // Kreiranje promenljive diode
tzwell 0:c71372aad4e1 32 DigitalIn TasterNaPloci (BUTTON1); // Kreiranje promenljive tastera
tzwell 0:c71372aad4e1 33
tzwell 0:c71372aad4e1 34 /*
tzwell 0:c71372aad4e1 35 * Deklaracija funkcija:
tzwell 0:c71372aad4e1 36 */
tzwell 0:c71372aad4e1 37 void ChangeLEDIntensity( void ); // Funkcija za promenu intenziteta
tzwell 0:c71372aad4e1 38 /*
tzwell 0:c71372aad4e1 39 * Glavna funkcija:
tzwell 0:c71372aad4e1 40 */
tzwell 0:c71372aad4e1 41 int main()
tzwell 0:c71372aad4e1 42 {
tzwell 0:c71372aad4e1 43 static char ButtonReleased = 0; // Pomocna promenljiva za stanje tastera
tzwell 0:c71372aad4e1 44 // Prvo se zada period treperenja diode, a potom trajanje impulsa:
tzwell 0:c71372aad4e1 45 DiodicaNaPloci.period_ms(PWM_PERIOD); // Period treperenja traje 4 sekunde
tzwell 0:c71372aad4e1 46 DiodicaNaPloci.write(INITIAL_DUTY_CYCLE); // Dioda ukljucena tokom 2
tzwell 0:c71372aad4e1 47 while (1)
tzwell 0:c71372aad4e1 48 {
tzwell 0:c71372aad4e1 49 // Ukoliko je taster pritisnut (ima vrednost 0):
tzwell 0:c71372aad4e1 50 if ( !TasterNaPloci )
tzwell 0:c71372aad4e1 51 {
tzwell 0:c71372aad4e1 52 // I ukoliko je prethodno bio nepritisnut (imao vrednost 1):
tzwell 0:c71372aad4e1 53 if ( ButtonReleased )
tzwell 0:c71372aad4e1 54 {
tzwell 0:c71372aad4e1 55 ChangeLEDIntensity(); // Promeni se duty cycle po pravilu
tzwell 0:c71372aad4e1 56 ButtonReleased = 0; // Obelezi se da je taster pritisnut
tzwell 0:c71372aad4e1 57 }
tzwell 0:c71372aad4e1 58 }
tzwell 0:c71372aad4e1 59 // Ako je taster nepritisnut:
tzwell 0:c71372aad4e1 60 else
tzwell 0:c71372aad4e1 61 {
tzwell 0:c71372aad4e1 62 ButtonReleased = 1; // Obelezi se da je taster nepritisnut
tzwell 0:c71372aad4e1 63 }
tzwell 0:c71372aad4e1 64 wait_ms( POLLING_PERIOD ); // Cekanje perioda poliranja
tzwell 0:c71372aad4e1 65 }
tzwell 0:c71372aad4e1 66 }
tzwell 0:c71372aad4e1 67
tzwell 0:c71372aad4e1 68 /*
tzwell 0:c71372aad4e1 69 * Definicija funkcija:
tzwell 0:c71372aad4e1 70 */
tzwell 0:c71372aad4e1 71 // Funkcija menja intenzitet osvetljaja diode tako sto menja duty cycle PWM-a
tzwell 0:c71372aad4e1 72 void ChangeLEDIntensity ()
tzwell 0:c71372aad4e1 73 {
tzwell 0:c71372aad4e1 74 static char MaxIntensityNotYetReached = 1;
tzwell 0:c71372aad4e1 75
tzwell 0:c71372aad4e1 76 // Ukoliko jos uvek nije dostignut maksimum intenziteta:
tzwell 0:c71372aad4e1 77 if ( MaxIntensityNotYetReached )
tzwell 0:c71372aad4e1 78 {
tzwell 0:c71372aad4e1 79 // Kao vrednost duty cycle se upise stara vrednost i doda inkrement.
tzwell 0:c71372aad4e1 80 DiodicaNaPloci.write( DiodicaNaPloci.read() + DUTY_CYCLE_INCREMENT );
tzwell 0:c71372aad4e1 81
tzwell 0:c71372aad4e1 82 // Ukoliko je u prethodnoj liniji duty cycle dostigao 100%:
tzwell 0:c71372aad4e1 83 if ( DiodicaNaPloci.read() == MAX_DUTY_CYCLE )
tzwell 0:c71372aad4e1 84 {
tzwell 0:c71372aad4e1 85 MaxIntensityNotYetReached = 0; // Prilikom sledeceg pritiska treba ga resetovati
tzwell 0:c71372aad4e1 86 }
tzwell 0:c71372aad4e1 87 }
tzwell 0:c71372aad4e1 88 // Ako je duty cycle prilikom prethodnog pritiska tastera dostigao 100%:
tzwell 0:c71372aad4e1 89 else
tzwell 0:c71372aad4e1 90 {
tzwell 0:c71372aad4e1 91 DiodicaNaPloci.write(INITIAL_DUTY_CYCLE); // Treba ga resetovati na 0%
tzwell 0:c71372aad4e1 92 MaxIntensityNotYetReached = 1; // I obeleziti da nije dostigao maksimum
tzwell 0:c71372aad4e1 93 }
tzwell 0:c71372aad4e1 94
tzwell 0:c71372aad4e1 95 return;
tzwell 0:c71372aad4e1 96 }