Nikola Cvetković
/
19E042PIM_V1_BM_PWM_CYCLE
Program uses USER BUTTON to ciclycally and discretely change luminous intensity of LD2(19E042PIM).
main.cpp@0:c71372aad4e1, 2021-10-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |