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

Dependencies:   mbed

Committer:
tzwell
Date:
Thu Oct 28 11:03:08 2021 +0000
Revision:
1:35da54fcf004
Parent:
0:c71372aad4e1
Updated comments and code structure

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 1:35da54fcf004 43 // Inicijalizacija i funckije koje se jednom izvrsavaju:
tzwell 1:35da54fcf004 44 static char ButtonReleased = 0; // Pomocna promenljiva stanja tastera
tzwell 1:35da54fcf004 45
tzwell 0:c71372aad4e1 46 // Prvo se zada period treperenja diode, a potom trajanje impulsa:
tzwell 0:c71372aad4e1 47 DiodicaNaPloci.period_ms(PWM_PERIOD); // Period treperenja traje 4 sekunde
tzwell 0:c71372aad4e1 48 DiodicaNaPloci.write(INITIAL_DUTY_CYCLE); // Dioda ukljucena tokom 2
tzwell 1:35da54fcf004 49
tzwell 1:35da54fcf004 50 while (true)
tzwell 0:c71372aad4e1 51 {
tzwell 0:c71372aad4e1 52 // Ukoliko je taster pritisnut (ima vrednost 0):
tzwell 0:c71372aad4e1 53 if ( !TasterNaPloci )
tzwell 0:c71372aad4e1 54 {
tzwell 0:c71372aad4e1 55 // I ukoliko je prethodno bio nepritisnut (imao vrednost 1):
tzwell 0:c71372aad4e1 56 if ( ButtonReleased )
tzwell 0:c71372aad4e1 57 {
tzwell 0:c71372aad4e1 58 ChangeLEDIntensity(); // Promeni se duty cycle po pravilu
tzwell 0:c71372aad4e1 59 ButtonReleased = 0; // Obelezi se da je taster pritisnut
tzwell 0:c71372aad4e1 60 }
tzwell 0:c71372aad4e1 61 }
tzwell 0:c71372aad4e1 62 // Ako je taster nepritisnut:
tzwell 0:c71372aad4e1 63 else
tzwell 0:c71372aad4e1 64 {
tzwell 0:c71372aad4e1 65 ButtonReleased = 1; // Obelezi se da je taster nepritisnut
tzwell 0:c71372aad4e1 66 }
tzwell 0:c71372aad4e1 67 wait_ms( POLLING_PERIOD ); // Cekanje perioda poliranja
tzwell 0:c71372aad4e1 68 }
tzwell 0:c71372aad4e1 69 }
tzwell 0:c71372aad4e1 70
tzwell 0:c71372aad4e1 71 /*
tzwell 0:c71372aad4e1 72 * Definicija funkcija:
tzwell 0:c71372aad4e1 73 */
tzwell 0:c71372aad4e1 74 // Funkcija menja intenzitet osvetljaja diode tako sto menja duty cycle PWM-a
tzwell 0:c71372aad4e1 75 void ChangeLEDIntensity ()
tzwell 0:c71372aad4e1 76 {
tzwell 0:c71372aad4e1 77 static char MaxIntensityNotYetReached = 1;
tzwell 0:c71372aad4e1 78
tzwell 0:c71372aad4e1 79 // Ukoliko jos uvek nije dostignut maksimum intenziteta:
tzwell 0:c71372aad4e1 80 if ( MaxIntensityNotYetReached )
tzwell 0:c71372aad4e1 81 {
tzwell 0:c71372aad4e1 82 // Kao vrednost duty cycle se upise stara vrednost i doda inkrement.
tzwell 0:c71372aad4e1 83 DiodicaNaPloci.write( DiodicaNaPloci.read() + DUTY_CYCLE_INCREMENT );
tzwell 0:c71372aad4e1 84
tzwell 0:c71372aad4e1 85 // Ukoliko je u prethodnoj liniji duty cycle dostigao 100%:
tzwell 0:c71372aad4e1 86 if ( DiodicaNaPloci.read() == MAX_DUTY_CYCLE )
tzwell 0:c71372aad4e1 87 {
tzwell 0:c71372aad4e1 88 MaxIntensityNotYetReached = 0; // Prilikom sledeceg pritiska treba ga resetovati
tzwell 0:c71372aad4e1 89 }
tzwell 0:c71372aad4e1 90 }
tzwell 0:c71372aad4e1 91 // Ako je duty cycle prilikom prethodnog pritiska tastera dostigao 100%:
tzwell 0:c71372aad4e1 92 else
tzwell 0:c71372aad4e1 93 {
tzwell 0:c71372aad4e1 94 DiodicaNaPloci.write(INITIAL_DUTY_CYCLE); // Treba ga resetovati na 0%
tzwell 0:c71372aad4e1 95 MaxIntensityNotYetReached = 1; // I obeleziti da nije dostigao maksimum
tzwell 0:c71372aad4e1 96 }
tzwell 0:c71372aad4e1 97
tzwell 0:c71372aad4e1 98 return;
tzwell 0:c71372aad4e1 99 }