![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Filip Stevanovic 2020/0039
main.cpp@3:0a8ebdd71a21, 2021-11-13 (annotated)
- Committer:
- filip_ste
- Date:
- Sat Nov 13 09:47:02 2021 +0000
- Revision:
- 3:0a8ebdd71a21
- Parent:
- 2:67f18997ff0d
Filip Stevanovic 2020/0039
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
filip_ste | 0:569d2e559397 | 1 | /* |
filip_ste | 0:569d2e559397 | 2 | Zasto ljudi cudno cuju? |
filip_ste | 0:569d2e559397 | 3 | -Filip Stevanovic |
filip_ste | 0:569d2e559397 | 4 | |
filip_ste | 0:569d2e559397 | 5 | Da bi smo bili bolji predatori, evolucija je coveku razvila veoma osetljiva cula. |
filip_ste | 0:569d2e559397 | 6 | Da bi se to ostvarilo, mozak signale sa cula logaritmuje, i tako se promene |
filip_ste | 0:569d2e559397 | 7 | na veoma malim nivoima jasno uocavaju dok se promene na velikim nivoima skoro uopste |
filip_ste | 0:569d2e559397 | 8 | ne primecuju. |
filip_ste | 0:569d2e559397 | 9 | |
filip_ste | 0:569d2e559397 | 10 | Hvala na paznji |
filip_ste | 2:67f18997ff0d | 11 | |
filip_ste | 2:67f18997ff0d | 12 | Addendum (Sta se zapravo desava): |
filip_ste | 2:67f18997ff0d | 13 | Zvuk u buzzeru pravi preklapanje, tj prelazak sa jedinice na nulu i obrnuto. |
filip_ste | 2:67f18997ff0d | 14 | Stoga duty cycle nije bitan osim u ekstremnim slucajevima sa mnogo malim i mnogo velikim vrednostima |
filip_ste | 2:67f18997ff0d | 15 | gde kapacitivnost zujalice i otpornik paralelan njoj "peglaju" napon pa zujalica ne moze ni da odreaguje. |
filip_ste | 2:67f18997ff0d | 16 | Van toga, duty cycle pravi promene u zvuku zbog razlicitog tajmiranja preklapanja pa je talasni oblik medjusobno ispomeran. |
filip_ste | 2:67f18997ff0d | 17 | Sto se tice frekvencije, mi to cujemo logaritamski tj. basove veoma dobro razaznujemo dok veoma visoke frekvencije |
filip_ste | 2:67f18997ff0d | 18 | realno samo znamo da ih ima, dok smo najtacniji oko 3.3kHz. |
filip_ste | 3:0a8ebdd71a21 | 19 | Jacina zvuka (Pitch) se stoga samo svodi na frekvenciju. |
filip_ste | 0:569d2e559397 | 20 | */ |
filip_ste | 0:569d2e559397 | 21 | |
filip_ste | 0:569d2e559397 | 22 | #include "mbed.h" |
filip_ste | 0:569d2e559397 | 23 | |
filip_ste | 0:569d2e559397 | 24 | //Constants |
filip_ste | 0:569d2e559397 | 25 | #define DebouncePeriod 100 //Period that a button needs to stabilise in miliseconds. 100 should be okay |
filip_ste | 0:569d2e559397 | 26 | #define ArbitraryWaitPeriod 1 //Aritrary pooling waiting periods, its should be the in the scale of tens of miliseconds to max 100 |
filip_ste | 0:569d2e559397 | 27 | |
filip_ste | 0:569d2e559397 | 28 | //Constants for frequency spectrum function |
filip_ste | 0:569d2e559397 | 29 | const int n = 5000; |
filip_ste | 0:569d2e559397 | 30 | const int k = -4950; |
filip_ste | 0:569d2e559397 | 31 | |
filip_ste | 0:569d2e559397 | 32 | //Pins |
filip_ste | 0:569d2e559397 | 33 | #define A PA_10 |
filip_ste | 0:569d2e559397 | 34 | #define B PA_9 |
filip_ste | 0:569d2e559397 | 35 | #define C PA_8 |
filip_ste | 0:569d2e559397 | 36 | #define D PB_10 |
filip_ste | 0:569d2e559397 | 37 | #define E PB_5 |
filip_ste | 0:569d2e559397 | 38 | #define F PB_4 |
filip_ste | 0:569d2e559397 | 39 | #define G PB_3 |
filip_ste | 0:569d2e559397 | 40 | #define SEL1 PB_6 |
filip_ste | 0:569d2e559397 | 41 | #define SEL2 PC_7 |
filip_ste | 0:569d2e559397 | 42 | #define SW1 PC_9 |
filip_ste | 0:569d2e559397 | 43 | #define POT1 PA_0 |
filip_ste | 0:569d2e559397 | 44 | #define POT2 PA_1 |
filip_ste | 0:569d2e559397 | 45 | #define BUZZ PA_11 |
filip_ste | 0:569d2e559397 | 46 | #define LD2 PB_15 |
filip_ste | 0:569d2e559397 | 47 | |
filip_ste | 0:569d2e559397 | 48 | //Pin/Object declaration |
filip_ste | 0:569d2e559397 | 49 | PwmOut buzzer (BUZZ); |
filip_ste | 0:569d2e559397 | 50 | DigitalOut led2 (LD2); |
filip_ste | 0:569d2e559397 | 51 | InterruptIn sw1 (SW1); |
filip_ste | 0:569d2e559397 | 52 | AnalogIn pot1 (POT1); |
filip_ste | 0:569d2e559397 | 53 | AnalogIn pot2 (POT2); |
filip_ste | 0:569d2e559397 | 54 | BusOut display (A,B,C,D,E,F,G); |
filip_ste | 0:569d2e559397 | 55 | BusOut select (SEL2,SEL1); |
filip_ste | 0:569d2e559397 | 56 | |
filip_ste | 0:569d2e559397 | 57 | //Timer declaration |
filip_ste | 0:569d2e559397 | 58 | Timer t; |
filip_ste | 0:569d2e559397 | 59 | |
filip_ste | 0:569d2e559397 | 60 | //Global variable for updating the display when SW1 is pressed |
filip_ste | 0:569d2e559397 | 61 | int value = 0; |
filip_ste | 0:569d2e559397 | 62 | |
filip_ste | 0:569d2e559397 | 63 | //ISR for Switch1 (Fall) |
filip_ste | 0:569d2e559397 | 64 | void ISR_sw1(){ |
filip_ste | 0:569d2e559397 | 65 | //If the button recently fell, dont do the ISR again (Debounce) |
filip_ste | 0:569d2e559397 | 66 | //If it didnt, do it and save the new time when you did it |
filip_ste | 0:569d2e559397 | 67 | if(t.read_ms()> DebouncePeriod){ |
filip_ste | 0:569d2e559397 | 68 | value = pot1 * 100; |
filip_ste | 0:569d2e559397 | 69 | led2 = !led2; |
filip_ste | 0:569d2e559397 | 70 | t.reset(); |
filip_ste | 0:569d2e559397 | 71 | } |
filip_ste | 0:569d2e559397 | 72 | } |
filip_ste | 0:569d2e559397 | 73 | |
filip_ste | 1:f62564cb5261 | 74 | //////////////////////////////////////////////////////// |
filip_ste | 1:f62564cb5261 | 75 | //Made on last test thus minimal commenting |
filip_ste | 0:569d2e559397 | 76 | //Show digit on display |
filip_ste | 0:569d2e559397 | 77 | void SegDisp (int num){ |
filip_ste | 0:569d2e559397 | 78 | switch(num){ |
filip_ste | 0:569d2e559397 | 79 | case 0:display = 0b1000000;break; |
filip_ste | 0:569d2e559397 | 80 | case 1:display = 0b1111001;break; |
filip_ste | 0:569d2e559397 | 81 | case 2:display = 0b0100100;break; |
filip_ste | 0:569d2e559397 | 82 | case 3:display = 0b0110000;break; |
filip_ste | 0:569d2e559397 | 83 | case 4:display = 0b0011001;break; |
filip_ste | 0:569d2e559397 | 84 | case 5:display = 0b0010010;break; |
filip_ste | 0:569d2e559397 | 85 | case 6:display = 0b0000010;break; |
filip_ste | 0:569d2e559397 | 86 | case 7:display = 0b1111000;break; |
filip_ste | 0:569d2e559397 | 87 | case 8:display = 0b0000000;break; |
filip_ste | 0:569d2e559397 | 88 | case 9:display = 0b0010000;break; |
filip_ste | 0:569d2e559397 | 89 | default:display = 0x7f; break; |
filip_ste | 0:569d2e559397 | 90 | |
filip_ste | 0:569d2e559397 | 91 | } |
filip_ste | 0:569d2e559397 | 92 | } |
filip_ste | 0:569d2e559397 | 93 | |
filip_ste | 0:569d2e559397 | 94 | //Convert number to digits and show on display |
filip_ste | 0:569d2e559397 | 95 | void PrintDisp(int num){ |
filip_ste | 0:569d2e559397 | 96 | int j = num%10,d = num/10; |
filip_ste | 0:569d2e559397 | 97 | if(d==0) |
filip_ste | 0:569d2e559397 | 98 | SegDisp(-1); |
filip_ste | 0:569d2e559397 | 99 | else |
filip_ste | 0:569d2e559397 | 100 | SegDisp(d); |
filip_ste | 0:569d2e559397 | 101 | select = 0b01; |
filip_ste | 0:569d2e559397 | 102 | wait_ms(ArbitraryWaitPeriod); |
filip_ste | 0:569d2e559397 | 103 | SegDisp(j); |
filip_ste | 0:569d2e559397 | 104 | select = 0b10; |
filip_ste | 0:569d2e559397 | 105 | wait_ms(ArbitraryWaitPeriod); |
filip_ste | 0:569d2e559397 | 106 | } |
filip_ste | 1:f62564cb5261 | 107 | //////////////////////////////////////////////////////// |
filip_ste | 0:569d2e559397 | 108 | |
filip_ste | 0:569d2e559397 | 109 | //Main |
filip_ste | 0:569d2e559397 | 110 | int main(){ |
filip_ste | 0:569d2e559397 | 111 | //Starting timer |
filip_ste | 0:569d2e559397 | 112 | t.start(); |
filip_ste | 0:569d2e559397 | 113 | //Binding ISR to fall for Switch1 |
filip_ste | 0:569d2e559397 | 114 | sw1.fall(&ISR_sw1); |
filip_ste | 0:569d2e559397 | 115 | |
filip_ste | 0:569d2e559397 | 116 | //Main Loop |
filip_ste | 0:569d2e559397 | 117 | while(1){ |
filip_ste | 0:569d2e559397 | 118 | //Pooling Pot1 i Pot2 |
filip_ste | 1:f62564cb5261 | 119 | buzzer=pot1*0.5f; //Arbitrary division by 2 as it is apsolutely same if duty is .25 or .75 |
filip_ste | 0:569d2e559397 | 120 | buzzer.period_us(k*pot2+n); //Linearise frequency from 20Hz to 20kHz |
filip_ste | 0:569d2e559397 | 121 | |
filip_ste | 0:569d2e559397 | 122 | //Print Pot1 to Display |
filip_ste | 0:569d2e559397 | 123 | PrintDisp(value); //It never gets to 1 so it wont get to 100 thus its limited to 99 |
filip_ste | 0:569d2e559397 | 124 | |
filip_ste | 0:569d2e559397 | 125 | //Pooling time is integrated in PrintDisp function |
filip_ste | 0:569d2e559397 | 126 | } |
filip_ste | 0:569d2e559397 | 127 | } |
filip_ste | 0:569d2e559397 | 128 |