
Varying frequency by potentiometer working.
main.cpp@5:0dd98c2ac767, 2019-02-14 (annotated)
- Committer:
- gtanvir
- Date:
- Thu Feb 14 23:01:53 2019 +0000
- Revision:
- 5:0dd98c2ac767
- Parent:
- 4:75ad475aff41
Final
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WilliamMarshQMUL | 0:5307f49cd305 | 1 | // Lab 3 Example Program 2 |
WilliamMarshQMUL | 0:5307f49cd305 | 2 | // ----------------------- |
WilliamMarshQMUL | 4:75ad475aff41 | 3 | // This code uses the Ticker API to create a periodic interrupt |
WilliamMarshQMUL | 4:75ad475aff41 | 4 | // Devices used in this way must not call locks; a variant of |
WilliamMarshQMUL | 4:75ad475aff41 | 5 | // the AnalogOut device w/o locking is created for this. |
WilliamMarshQMUL | 0:5307f49cd305 | 6 | // |
WilliamMarshQMUL | 2:e27fd3b65155 | 7 | // Updated for mbed 5 |
WilliamMarshQMUL | 2:e27fd3b65155 | 8 | |
WilliamMarshQMUL | 1:18e0f8aef32f | 9 | // THIS VERSION HAS NO DEBUGGING CODE |
WilliamMarshQMUL | 0:5307f49cd305 | 10 | |
WilliamMarshQMUL | 0:5307f49cd305 | 11 | #include "mbed.h" |
WilliamMarshQMUL | 0:5307f49cd305 | 12 | #include "sineTable.h" |
WilliamMarshQMUL | 0:5307f49cd305 | 13 | |
WilliamMarshQMUL | 4:75ad475aff41 | 14 | // -------------------------- |
WilliamMarshQMUL | 4:75ad475aff41 | 15 | // This declaration introduces a derived version of the mbed AnalogOut |
WilliamMarshQMUL | 4:75ad475aff41 | 16 | // class with the locking removed. |
WilliamMarshQMUL | 4:75ad475aff41 | 17 | // You do NOT NEED TO UNDERSTAND this |
WilliamMarshQMUL | 4:75ad475aff41 | 18 | class AnalogOut_unsafe : public AnalogOut { |
WilliamMarshQMUL | 4:75ad475aff41 | 19 | public: |
WilliamMarshQMUL | 4:75ad475aff41 | 20 | AnalogOut_unsafe (PinName pin) : AnalogOut (pin) {} |
WilliamMarshQMUL | 4:75ad475aff41 | 21 | protected: |
WilliamMarshQMUL | 4:75ad475aff41 | 22 | virtual void lock() {} |
WilliamMarshQMUL | 4:75ad475aff41 | 23 | virtual void unlock() {} |
WilliamMarshQMUL | 4:75ad475aff41 | 24 | }; |
WilliamMarshQMUL | 4:75ad475aff41 | 25 | // -------------------------- |
WilliamMarshQMUL | 4:75ad475aff41 | 26 | |
gtanvir | 5:0dd98c2ac767 | 27 | Ticker tick ; // Creates periodic interrupt |
gtanvir | 5:0dd98c2ac767 | 28 | AnalogOut_unsafe ao(PTE30) ; // Analog output |
gtanvir | 5:0dd98c2ac767 | 29 | AnalogIn ain(A0) ; // Analog input |
WilliamMarshQMUL | 0:5307f49cd305 | 30 | |
WilliamMarshQMUL | 1:18e0f8aef32f | 31 | // Function called periodically |
WilliamMarshQMUL | 1:18e0f8aef32f | 32 | // Write new value to AnalogOut |
gtanvir | 5:0dd98c2ac767 | 33 | volatile int index = 0 ; // index into array of sin values |
WilliamMarshQMUL | 0:5307f49cd305 | 34 | void writeAout() { |
WilliamMarshQMUL | 0:5307f49cd305 | 35 | ao.write_u16(sine[index]) ; |
WilliamMarshQMUL | 0:5307f49cd305 | 36 | index = (index + 1) % 64 ; |
WilliamMarshQMUL | 0:5307f49cd305 | 37 | } |
WilliamMarshQMUL | 0:5307f49cd305 | 38 | |
gtanvir | 5:0dd98c2ac767 | 39 | EventQueue queue; // creates an event queue, to call read ADC |
gtanvir | 5:0dd98c2ac767 | 40 | |
gtanvir | 5:0dd98c2ac767 | 41 | Serial pc(USBTX, USBRX); // tx, rx, for debugging |
gtanvir | 5:0dd98c2ac767 | 42 | |
gtanvir | 5:0dd98c2ac767 | 43 | // This thread runs the event queue |
gtanvir | 5:0dd98c2ac767 | 44 | Thread eventThread ; |
gtanvir | 5:0dd98c2ac767 | 45 | |
gtanvir | 5:0dd98c2ac767 | 46 | // Message type |
gtanvir | 5:0dd98c2ac767 | 47 | typedef struct { |
gtanvir | 5:0dd98c2ac767 | 48 | uint16_t analog; /* Analog input value */ |
gtanvir | 5:0dd98c2ac767 | 49 | } message_t; |
gtanvir | 5:0dd98c2ac767 | 50 | |
gtanvir | 5:0dd98c2ac767 | 51 | // Mail box |
gtanvir | 5:0dd98c2ac767 | 52 | Mail<message_t, 3> mailbox; |
gtanvir | 5:0dd98c2ac767 | 53 | |
gtanvir | 5:0dd98c2ac767 | 54 | // Function called every 10ms to read ADC |
gtanvir | 5:0dd98c2ac767 | 55 | // Average using a low pass filter |
gtanvir | 5:0dd98c2ac767 | 56 | // Every 10th value is sent to mailbox |
gtanvir | 5:0dd98c2ac767 | 57 | volatile int samples = 0 ; |
gtanvir | 5:0dd98c2ac767 | 58 | volatile uint16_t smoothed = 0 ; |
gtanvir | 5:0dd98c2ac767 | 59 | |
gtanvir | 5:0dd98c2ac767 | 60 | void readA0() { |
gtanvir | 5:0dd98c2ac767 | 61 | |
gtanvir | 5:0dd98c2ac767 | 62 | smoothed = (smoothed >> 1) + (ain.read_u16() >> 1) ; |
gtanvir | 5:0dd98c2ac767 | 63 | samples++ ; |
gtanvir | 5:0dd98c2ac767 | 64 | |
gtanvir | 5:0dd98c2ac767 | 65 | if (samples == 10) { |
gtanvir | 5:0dd98c2ac767 | 66 | // send to thread |
gtanvir | 5:0dd98c2ac767 | 67 | message_t *mess = mailbox.alloc() ; // may fail but does not block |
gtanvir | 5:0dd98c2ac767 | 68 | if (mess) { |
gtanvir | 5:0dd98c2ac767 | 69 | mess->analog = smoothed ; |
gtanvir | 5:0dd98c2ac767 | 70 | mailbox.put(mess); // fails but does not block if full |
gtanvir | 5:0dd98c2ac767 | 71 | } |
gtanvir | 5:0dd98c2ac767 | 72 | samples = 0; |
gtanvir | 5:0dd98c2ac767 | 73 | } |
gtanvir | 5:0dd98c2ac767 | 74 | } |
gtanvir | 5:0dd98c2ac767 | 75 | |
WilliamMarshQMUL | 0:5307f49cd305 | 76 | // Control the frequency of updates |
WilliamMarshQMUL | 0:5307f49cd305 | 77 | // Alternative between two frequencies |
WilliamMarshQMUL | 0:5307f49cd305 | 78 | int main() { |
WilliamMarshQMUL | 1:18e0f8aef32f | 79 | int update_us = 1000 ; // 1ms |
gtanvir | 5:0dd98c2ac767 | 80 | int volts = 0 ; |
gtanvir | 5:0dd98c2ac767 | 81 | int timeDelay = 0; |
gtanvir | 5:0dd98c2ac767 | 82 | int frequency = 0; |
gtanvir | 5:0dd98c2ac767 | 83 | |
gtanvir | 5:0dd98c2ac767 | 84 | // Start the event queue |
gtanvir | 5:0dd98c2ac767 | 85 | eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); |
gtanvir | 5:0dd98c2ac767 | 86 | |
gtanvir | 5:0dd98c2ac767 | 87 | // call the readA0 function every 10ms |
gtanvir | 5:0dd98c2ac767 | 88 | queue.call_every(10, readA0) ; |
gtanvir | 5:0dd98c2ac767 | 89 | |
WilliamMarshQMUL | 0:5307f49cd305 | 90 | while (true) { |
gtanvir | 5:0dd98c2ac767 | 91 | osEvent evt = mailbox.get(); // wait for mail |
gtanvir | 5:0dd98c2ac767 | 92 | |
gtanvir | 5:0dd98c2ac767 | 93 | if (evt.status == osEventMail) { |
gtanvir | 5:0dd98c2ac767 | 94 | message_t* mess = (message_t*)evt.value.p ; |
gtanvir | 5:0dd98c2ac767 | 95 | volts = (mess->analog * 330) / 0xffff ; |
gtanvir | 5:0dd98c2ac767 | 96 | mailbox.free(mess) ; // free the message space |
gtanvir | 5:0dd98c2ac767 | 97 | } |
gtanvir | 5:0dd98c2ac767 | 98 | |
gtanvir | 5:0dd98c2ac767 | 99 | frequency = (1+volts*49/329); // Freq Range: 1~50Hz. V = maximum voltage of ADC |
gtanvir | 5:0dd98c2ac767 | 100 | timeDelay = 1000000/(frequency*64); // Time is in microseconds |
gtanvir | 5:0dd98c2ac767 | 101 | |
gtanvir | 5:0dd98c2ac767 | 102 | update_us = timeDelay ; |
gtanvir | 5:0dd98c2ac767 | 103 | tick.attach_us(callback(&writeAout), update_us); // setup ticker to write to AnalogOut |
gtanvir | 5:0dd98c2ac767 | 104 | |
WilliamMarshQMUL | 0:5307f49cd305 | 105 | } |
WilliamMarshQMUL | 0:5307f49cd305 | 106 | } |