Varying frequency by potentiometer working.

Committer:
gtanvir
Date:
Thu Feb 14 23:01:53 2019 +0000
Revision:
5:0dd98c2ac767
Parent:
4:75ad475aff41
Final

Who changed what in which revision?

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