Filip Stevanovic 2020/0039

Dependencies:   mbed

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?

UserRevisionLine numberNew 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